Matrizenmultipliaktion |
12.06.2010, 13:22 | Biennie | Auf diesen Beitrag antworten » | ||||||||||
Matrizenmultipliaktion Muss ein programm zur MAtrizenmultiplikation 10*10 schreiben und das ergbenis in eine txt schreiben.weiterhin muss ich eine struktur mit hilfe einer funktion in den header der txt einspeichern... Leider gibt er mir nur kryptische zeichen aus.Könnt ihr mir helfen???? Die Multiplikation klappt aber so weit. Meine Ideen: Mein Programm /*Programm zur MUltipliaktionzweier Matrizen mit einer maximalen Dimension von 10*10 ***persönliche Daten entfernt - tigerbine */ #define _CRT_SECURE_NO_DEPRECATE 1 //Warnmeldung unterdrücken #include<iostream> //Bibliothek fürs Datum #include<math.h>//Bibliothek für mathematische Berechnungen #include<ctime> //Bibliothek fürs Datum using namespace std; FILE *dateischreiben; void Header_Ergebnis(); //Funktionsprototyp für das Unterprogramm struct Benutzerangaben { char MatrikelNr[10]; //es reichen eigentlich 8 char Name[25]; char Vorname[25]; char Datum[12]; char Uhrzeit[6]; }; Benutzerangaben Anwender; void main () { int n,p,m; int SpaltenA,ZeilenA,SpaltenB,ZeilenB; bool Multiplikationgehtnicht=0,beenden=0; int Wiederholung; int matrixA[10][10],matrixB[10][10],matrixC[10][10]; int matrixa[10][10],matrixb[10][10],matrixc[10][10]; char pufferA[100],pufferB[100],pufferC[100],pufferA2[1],pufferB2[1],pufferC2[1]; FILE *dateiA,*dateiB,*dateiC; //Dateizeiger zum schreiben FILE *dateiAlesen, *dateiBlesen, *dateiClesen; //Dateizeiger zum lesen //Aktuelles Datum automatisch statt per Hand char Datum[12]; char Uhrzeit[6]; time_t now = time(0); time_t now2 = time(0); strftime(Datum,12,"%d.%m.%Y",localtime(&now)); strftime(Uhrzeit,6,"%H:%M",localtime(&now2)); cout<<Datum<<" - "<<Uhrzeit<<"\n\n"; //Eingabe der Benutzerangaben cout<<"Bitte geben Sie folgende Daten ein:\n\n"; cout<<"Martr.Nr.: "; cin>>Anwender.MatrikelNr; cout<<"\n\nName: "; cin>>Anwender.Name; cout<<"\n\nVorname: "; cin>>Anwender.Vorname; cout<<"\n\n"; //Speichern von Datum und Uhrzeit in die Struktur strcpy(Anwender.Datum,Datum); strcpy(Anwender.Uhrzeit,Uhrzeit); Header_Ergebnis(); //Anwender Header do { do { Multiplikationgehtnicht=0; cout<< "Welche Dimension soll die Matrix A sein?" << "\n"; cout<< "Spaltenzahl: "; cin>> SpaltenA; cout<< "\nZeilenzahl: "; cin>> ZeilenA; cout<< "Welche Dimension soll die Matrix B sein?" << "\n"; cout<< "Spaltenzahl: "; cin>> SpaltenB; cout<< "\nZeilenzahl: "; cin>> ZeilenB; //Matrizenmultiplikation nur möglich wenn SpaltenA = ZeilenB cout<<"Ist die Multiplikation moeglich?"; if(SpaltenA==ZeilenB) cout<<"Die Matrizenmutliplikation ist moeglich!\n\n"; else { cout<<"Die Multiplikation ist nicht moeglich!\n"; Multiplikationgehtnicht=1; } }while(Multiplikationgehtnicht==1); //Solange Antwort1==1,also echt gleich 1 ist bzw. solange Antwort Falsch wird die Schleife wiederholt //Eingabe: Matrix A cout<<"\nGeben Sie bitte die Werte fuer Matrix A ein:\n"; //Reihenfolge: von links nach rechts und von oben nach unten for(m=0;m<ZeilenA;m++) { for(n=0;n<SpaltenA;n++) { cout<< "Bitte geben sie einen Wert fuer " << m+1 << "-te Zeile" << n+1 << "-te Spalte: "; cin>> matrixA[m][n]; } } //Matrix A in Datei schreiben (Öffnet die txt als leere Datei und schreibt neuen Inhalt rein) dateiA=fopen("Matrix1.txt","w"); for(m=0;m<ZeilenA;m++) for(n=0;n<SpaltenA;n++) { sprintf(pufferA,"%d",matrixA[m][n]); //d = int, von int in char fwrite(&pufferA[0],sizeof(pufferA[0]),1,dateiA); //ab Position matrixA, & --> Ermittlung der Anfangsadresse, Größe von matrixA, 1 Block }//puffer [0] --> damit keine kryptischen Werte in txt datei geschrieben werden fclose(dateiA); //Schreiben abschließen--> Datei schließen //Eingabe: Matrix B cout<<"\nGeben Sie bitte die Werte fuer Matrix B ein:\n"; for(n=0;n<ZeilenB;n++) { for(p=0;p<SpaltenB;p++) { cout<< "Bitte geben sie einen Wert fuer " << n+1 << "-te Zeile" << p+1 << "-te Spalte: "; cin>>matrixB[n][p]; } } //Matrix B in Datei schreiben dateiB=fopen("Matrix2.txt","w"); //Datei zum Schreiben oeffnen for(n=0;n<ZeilenB;n++) for(p=0;p<ZeilenB;p++) { sprintf(pufferB,"%d",matrixB[n][p]); //d = int, von int in char fwrite(&pufferB[0],sizeof(pufferB[0]),1,dateiB); //ab MatrixB, &Anfangsadresse-->Ermittlung der Anfangsadresse, Größevon MatrixB, 1 Block } //Puffer[0] damit nur Werte die eingegeben in txt Datei fclose(dateiB); //Schreiben abschließen, Datei schließen //Auslesen von A dateiAlesen=fopen("Matrix1.txt","r"); //Oeffnen zum Lesen for(m=0;m<ZeilenA;m++) for(n=0;n<SpaltenA;n++) { fread(&pufferA2,sizeof(pufferA2),1,dateiAlesen); matrixa[m][n]=atof(pufferA2); } fclose(dateiAlesen); //Auslesen von B dateiBlesen=fopen("Matrix2.txt","r"); //Oeffnen zum Lesen for(n=0;n<ZeilenB;n++) for(p=0;p<SpaltenB;p++) { fread(&pufferB2,sizeof(pufferB2),1,dateiBlesen); matrixb[n][p]=atof(pufferB2); } fclose(dateiBlesen); //Ausgabe: Matrix A cout<<"\nIhre eingegebene Matrix A lautet:\n"; for(m=0;m<ZeilenA;m++) { for(n=0;n<SpaltenA;n++) { cout<<matrixa[m][n]<<" "; //matrixa aus Datei } cout<<"\n"; } //Ausgabe: Matrix B cout<<"\nIhre eingegebene Matrix B lautet:\n"; for(n=0;n<ZeilenB;n++) { for(p=0;p<SpaltenB;p++) { cout<<matrixb[n][p]<<" "; //matrixb aus Datei } cout<<"\n"; } //Multiplizieren von MAtrix A und B for(m=0;m<ZeilenA;m++) //Nummer der Zeile A { for(p=0;p<SpaltenB;p++) //Nummer der Spalte B { matrixC[m][p]=0; for(n=0;n<SpaltenA;n++) //Nummer der Spalten A { matrixC[m][p]=matrixC[m][p]+matrixa[m][n]*matrixb[n][p]; //Keine Punkt- vor Strichrechnung, deshalb () } } } //Matrix C in Datei schreiben dateiC=fopen("Ergebnis.txt","w"); //Datei zum Schreiben oeffnen fwrite(&matrixC,sizeof(matrixC),1,dateiC); fclose(dateiC); //Schreiben abschließen //Auslesen von C dateiClesen=fopen("Ergebnis.txt","r"); //Oeffnen zum Lesen fread(&matrixc,sizeof(matrixc),1,dateiClesen); //1 Block--> zusammenhaengende Zahlen fclose(dateiClesen); //Ausgabe: Matrix C cout<<"\nIhre multiplizierte Matrix C lautet:\n"; for(m=0;m<SpaltenA;m++) { for(p=0;p<SpaltenB;p++) { cout<<matrixc[m][p]<<" "; //c2 aus Datei } cout<<"\n\n"; } /* //Matrix C in Datei schreiben dateiC=fopen("Ergebnis.txt","w"); //Datei zum Schreiben oeffnen for(m=0;m<ZeilenA;m++) for(p=0;p<SpaltenB;p++) { sprintf(pufferC,"%d",matrixC[m][p]); //d = int, von int in char fwrite(&pufferC[0],sizeof(pufferC[0]),1,dateiB); //ab MatrixB, &Anfangsadresse-->Ermittlung der Anfangsadresse, Größevon MatrixB, 1 Block } //Puffer[0] damit nur Werte die eingegeben in txt Datei fclose(dateiC); //Schreiben abschließen, Datei schließen //Auslesen von C dateiClesen=fopen("Ergebnis.txt","r"); //Oeffnen zum Lesen for(m=0;m<ZeilenA;m++) for(p=0;p<SpaltenB;p++) { fread(&pufferC2,sizeof(pufferC2),1,dateiClesen); matrixc[m][p]=atof(pufferC2); } fclose(dateiClesen); //Ausgabe: Matrix C cout<<"\nIhre eingegebene Matrix B lautet:\n"; for(m=0;m<ZeilenA;m++) { for(p=0;p<SpaltenB;p++) { cout<<matrixc[m][p]<<" "; //matrixc aus Datei } cout<<"\n"; } */ cout<<"Moechten Sie zwei weitere Matrizen multiplizieren?\n[Ja=1/Nein=2/] "; cin>>Wiederholung; switch(Wiederholung) { case 1: Wiederholung=0; break; case 2: Wiederholung=1; break; default: cout<<"Fehlerhafte Eingabe!"; Wiederholung=1; break; } cout<<"\n"; cout<<"Druecken Sie eine 1 zum schlie"<<char(225)<<"en des Fensters"; }while(Wiederholung==0); cin>>beenden; } //UP für MartikelNr, Name,..usw. void Header_Ergebnis() { dateischreiben=fopen("Ergebnis.txt","w+t"); fprintf(dateischreiben,"Die Multiplikation wurde von: \n"); fprintf(dateischreiben,"MatrikelNr: %s \n",Anwender.MatrikelNr); //%s= platzhalter fprintf(dateischreiben,"Name: %s \n",Anwender.Vorname,Anwender.Name); fprintf(dateischreiben,"Am: %s gegen %s Uhr\n",Anwender.Datum,Anwender.Uhrzeit); fclose(dateischreiben); } |
||||||||||||
12.06.2010, 15:18 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||
Ich werde mich mit dem Programm nicht auskennen. Aber bevor sich jemand durch den ganzen Text wühlen mag, was ist denn die Frage? |
||||||||||||
12.06.2010, 19:34 | Biennie | Auf diesen Beitrag antworten » | ||||||||||
Also, weiß jemand, wie ich mein Ergbenis sowie den Header vernünftig in die txt. datei gespeichert bekomme??? Er gibt mir da nur kryptische zeichen aus! |
||||||||||||
12.06.2010, 19:51 | tigerbine | Auf diesen Beitrag antworten » | ||||||||||
Weches System. Windows? Linux? Eifach nur diesen text von dir kopieren? Zeichenkodierung? http://de.wikipedia.org/wiki/UTF-8 |
||||||||||||
12.06.2010, 20:13 | magixD | Auf diesen Beitrag antworten » | ||||||||||
Ok, fangen wir mal an. 1) In Foren verwendet man normalerweiße Code-Tags um Programm-Code darzustellen, bei langen Programmen (so wie deins) hängt man den Quellcode am besten als Dateianhang an. 2) Du rüfst Header_Ergebnis() in Zeile 64 auf. Da hast du ja noch garnichts berechnet, deswegen speichert das Programm eben lauter Müll in die Datei (was eben gerade so im Speicher liegt an den Adressen der Variablen). Ich hab den Aufruf testweise mal in Zeile 216 reinkopiert, dann schaut steht in der Datei auch etwas sinnvolles 3) Ich hab beim Testen immer folgende Matrizen multipliziert: Beim ersten Aufruf gab dein Programm folgendes aus:
Beim zweiten Mal stand da vier mal eine 16 und beim dritten Aufruf vier mal eine 17. Hier scheint irgendwas schief zu laufen. (Die Matrix wird aber mit den angezeigten Werten (also 15 bzw. 16 bze. 17) ausgerechnet.) 4) Am Schluss bei "Druecken Sie eine 1 zum schließen des Fensters" solltest du statt dem 'ß' ein 'ss' verwenden, vor allem wenn du die Umlaute auch als 'ae', 'oe', 'ue' schreibst. Außerdem kann man das Programm mit jeder beliebigen Taste+Enter beenden 5) Kompiliere ich dein Programm so wie es hier steht mit g++, dann erhalte ich folgende Ausgabe:
Da solltest du auch noch mal drüber schauen 6) Ich hab mir den Code jetzt nicht genau angesehen, aber recht übersichtlich ist er nicht, da kann man auch drann arbeiten So, jetzt aber genug "geschimpft", nichts für ungut magixD |
||||||||||||
15.06.2010, 15:30 | Biennie | Auf diesen Beitrag antworten » | ||||||||||
So mein programm funktioniert jetzt Prüfung bestanden. Just in time! |
||||||||||||
Anzeige | ||||||||||||
|
||||||||||||
15.06.2010, 16:01 | magixD | Auf diesen Beitrag antworten » | ||||||||||
Gratuliere zur bestandenen Prüfung. Leider hast du den Bug, den ich im letzten Post unter Punkt 3 beschrieben habe, noch nicht beseitigt. Auch rufst du main() immer noch mit void main() auf, was in C++ absolut verboten! Da muss mindestens int main() stehen! Warum das so sein soll/muss, sollte in jedem C++-Buch (oder im Internet) stehen. Mit welchen Kompiler lässt du das Programm übersetzten? Mit gcc/g++ bekommt man ja sogar einen Fehler zurück, d.h. es wird gar kein Programm übersetzt. Ich nehme an, dass das eine Übungsaufgabe für die Uni ist. Darf ich fragen was du studierst? magixD |
|