Matrizenmultipliaktion

Neue Frage »

Biennie Auf diesen Beitrag antworten »
Matrizenmultipliaktion
Meine Frage:
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);


}
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? verwirrt smile
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!
tigerbine Auf diesen Beitrag antworten »

Weches System. Windows? Linux? Eifach nur diesen text von dir kopieren?

Zeichenkodierung? http://de.wikipedia.org/wiki/UTF-8
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 Augenzwinkern

3) Ich hab beim Testen immer folgende Matrizen multipliziert:

Beim ersten Aufruf gab dein Programm folgendes aus:
code:
1:
2:
3:
Ihre eingegebene Matrix B lautet:
15 15 
15 15 

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:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
$ g++ -Wall -o matrix matrix.cpp
matrix.cpp:25: Fehler: »::main« muss »int« zurückgeben
matrix.cpp: In function »int main()«:
matrix.cpp:153: Warnung: Umwandlung in »int« von »double«
matrix.cpp:163: Warnung: Umwandlung in »int« von »double«
matrix.cpp:34: Warnung: Variable »pufferC« wird nicht verwendet
matrix.cpp:34: Warnung: Variable »pufferC2« wird nicht verwendet
matrix.cpp: In function »void Header_Ergebnis()«:
matrix.cpp:303: Warnung: zu viele Argumente für Format

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 Augenzwinkern

magixD
Biennie Auf diesen Beitrag antworten »
So mein programm funktioniert jetzt
Augenzwinkern Prüfung bestanden. Just in time!
 
 
magixD Auf diesen Beitrag antworten »

Gratuliere zur bestandenen Prüfung. Freude

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! böse Forum Kloppe böse
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
Neue Frage »
Antworten »



Verwandte Themen