Abfragenproblem in Visual C++

ChinToka

Newbie
Dabei seit
Dez. 2006
Beiträge
2
Moin,

Ich habe da ein kleines problem mit einem C Programm:

Es ist eine Matrizenmultiplikation. Zahlen lassen sich wunderbar eingeben aber wenn man Buchstaben eingibt funktioniert die rückgabefunktion irgendwie nicht.
Hier der betroffene teil:
Code:
void eing_mat( int mat_rueck[][5] )

#include <stdio.h>

{	// Dekleration & Initilalierung der Variablen
	int breite = 0, hoehe = 0;
	int i, j;


	do	// Schleife zur Definition der Hoehe der Matrix
	{
		printf("	Bitte geben Sie die Hoehe der Matrix ein (1-5): ");
		scanf("%d",&hoehe);
		if ((hoehe > 5) || (hoehe < 1))	// Bei falschem Eingabewert erfolgt eine Fehlermeldung
			printf("	ERROR: Bitte geben Sie nur Werte zwischen 1 und 5 ein.\n");
	}
	while ((hoehe > 5) || (hoehe < 1));	// Wiederholung bei falscher Werteingabe

	do	// Schleife zur Definition der Breite der Matrix
	{
		printf("	Bitte geben Sie die Breite der Matrix ein (1-5): ");
		scanf("%d",&breite);
		if ((breite > 5) || (breite < 1)) // Bei falschem Eingabewert erfolgt eine Fehlermeldung
			printf("	ERROR: Bitte geben Sie nur Werte zwischen 1 und 5 ein.\n");
	}
	while ((breite > 5) || (breite < 1));	// Wiederholung bei falscher Werteingabe

	printf("\n");

	for (i=0;i<hoehe;i++)	// Schleife für den Durchlauf der verschiedenen Zeilen
		for (j=0;j<breite;j++)	// Schleife für den Durchlauf der verschiedenen Spalten
		{
			do	// Schleife für die Eingabe der Matrizenwerte
			{
				printf("	Bitte geben Sie den Wert die Zelle %d-%d ein: ",i,j);
				scanf("%d",&mat_rueck[i][j]);
				if ((mat_rueck[i][j] > 1000) || (mat_rueck[i][j] < -1000))	// Bei falschem Eingabewert erfolgt eine Fehlermeldung
					printf("	ERROR: Bitte geben Sie nur Werte zwischen -1000 und 1000 ein.\n");
			}
			while ((mat_rueck[i][j] > 1000) || (mat_rueck[i][j] < -1000));	// Wiederholung bei falscher Werteingabe
		}

}
evtl kann mr da ja jemand weiterhelfen
 
Zuletzt von einem Moderator bearbeitet: (Code Tags eingefügt)

Götterwind

Commander
Dabei seit
Apr. 2004
Beiträge
2.686
Ganz einfach: Eine VOID-Funktion gibt nichts zurück! :D *Scherz*
Wo ist überhaupt dein "main" geblieben?
 
Zuletzt bearbeitet:

ChinToka

Newbie
Ersteller dieses Themas
Dabei seit
Dez. 2006
Beiträge
2
hier mal das ganze programm:

Code:
/****************** Ausgabe der Matrizenmultiplikation *******************/
#include <stdio.h>

void ausg_mat (int mat_1[][5], int mat_2[][5], int mat_erg[][5])
{
	int i, j;

	printf("Aufgabe:\n\n");

	for (i=0;i<5;i++) // 5 Mal - für jede Zeile einmal
	{
		for (j=0;j<5;j++) // Zeile der ersten Matrix
		{
			if (mat_1[i][j] != -1001) // Ausgabe des Wertes nur wenn != 1001, da 1001 Wert für kein Wert
				printf("%5d ",mat_1[i][j]); // %5d, da Wert maximal 4 Stellen + eventuell Minuszeichen
			else
				printf("      "); // wenn kein Wert, 6 Leerzeichen (5 Wert + 1 Leerzeichen)
		}

		if (i==2) // wenn i = 2 dann 3 Zeile ^= Mitte => Malpunkt zwischen Matrizen
			printf("  x  ");
		else // ansonsten:
			printf("     "); // Leerzeichen zwischen erster und zweiter Matrix

		for (j=0;j<5;j++) // Zeile der zweiten Matrix
		{
			if (mat_2[i][j] != -1001) // Ausgabe des Wertes nur wenn != 1001, da 1001 Wert für kein Wert
				printf("%5d ",mat_2[i][j]); // %5d, da Wert maximal 4 Stellen + eventuell Minuszeichen
			else
				printf("      "); // wenn kein Wert, 6 Leerzeichen (5 Wert + 1 Leerzeichen)
		}

		if (i==2) // wenn i = 2 dann 3 Zeile ^= Mitte => Gleichzeichen zwischen Matrizen
			printf("  =  ");
		else // ansonsten:
			printf("     "); // Leerzeichen zwischen zweiter und Ergebnis Matrix

		printf("\n");
	}

	printf("\n");
	printf("\nErgebnis:\n\n");


	for (i=0;i<5;i++) // 5 Mal - für jede Zeile einmal
	{

		for (j=0;j<5;j++) // Zeile der Ergebnis Matrix
		{
			if (mat_erg[i][j] != -1001) // Ausgabe des Wertes nur wenn != 1001, da 1001 Wert für kein Wert
				printf("%5d ",mat_erg[i][j]); // %5d, da Wert maximal 4 Stellen + eventuell Minuszeichen
			else
				printf("      "); // wenn kein Wert, 6 Leerzeichen (5 Wert + 1 Leerzeichen)
		}

		printf("\n");

	}
}

/****************** Eingabe der Matrizenmultiplikation *******************/

void eing_mat( int mat_rueck[][5] )

{	// Dekleration & Initilalierung der Variablen
	int breite = 0, hoehe = 0;
	int i, j;


	do	// Schleife zur Definition der Hoehe der Matrix
	{
		printf("	Bitte geben Sie die Hoehe der Matrix ein (1-5): ");
		scanf("%d",&hoehe);
		if ((hoehe > 5) || (hoehe < 1))	// Bei falschem Eingabewert erfolgt eine Fehlermeldung
			printf("	ERROR: Bitte geben Sie nur Werte zwischen 1 und 5 ein.\n");
	}
	while ((hoehe > 5) || (hoehe < 1));	// Wiederholung bei falscher Werteingabe

	do	// Schleife zur Definition der Breite der Matrix
	{
		printf("	Bitte geben Sie die Breite der Matrix ein (1-5): ");
		scanf("%d",&breite);
		if ((breite > 5) || (breite < 1)) // Bei falschem Eingabewert erfolgt eine Fehlermeldung
			printf("	ERROR: Bitte geben Sie nur Werte zwischen 1 und 5 ein.\n");
				if (breite = a,b,c);
	}
	while ((breite > 5) || (breite < 1));	// Wiederholung bei falscher Werteingabe

	printf("\n");

	for (i=0;i<hoehe;i++)	// Schleife für den Durchlauf der verschiedenen Zeilen
		for (j=0;j<breite;j++)	// Schleife für den Durchlauf der verschiedenen Spalten
		{
			do	// Schleife für die Eingabe der Matrizenwerte
			{
				printf("	Bitte geben Sie den Wert die Zelle %d-%d ein: ",i,j);
				scanf("%d",&mat_rueck[i][j]);
				if ((mat_rueck[i][j] > 1000) || (mat_rueck[i][j] < -1000))	// Bei falschem Eingabewert erfolgt eine Fehlermeldung
					printf("	ERROR: Bitte geben Sie nur Werte zwischen -1000 und 1000 ein.\n");
			}
			while ((mat_rueck[i][j] > 1000) || (mat_rueck[i][j] < -1000));	// Wiederholung bei falscher Werteingabe
		}

}


/****************** Matrizenmultiplikation *******************/

void multiplikation(int b_1,int h_1,int b_2, int Mat_erg[][5], int Mat_1[][5],int Mat_2[][5])
{
	/*Variablendeklaration*/
	int zwischen_erg;
	int j, x, y;

	   for (j=0; j<b_2; j++)
		  {

		  for (/*Mat_1 Spaltenwechsel und Mat_2 Zeilenwechsel*/
			   x=0; x<b_1 ; x++)
			 {
			  		   zwischen_erg = 0;
			 for (y=0; y<h_1 ; y++)/*Mat_1 Zeilenwechsel und Mat_2 Spaltenwechsel*/
				{
				/*Durchführung der Matrizenmultiplikation:*/
				zwischen_erg = zwischen_erg + (Mat_1 [x][y]) * (Mat_2 [y][j]);
            
				Mat_erg[x][j] = zwischen_erg; /*Speichern der Werte im Endergebnis*/
				}
			 }
		  }	
}


/******************   Matrizendimensionssuche *******************/
void mat_dim (int Mat_erg [][5], int Mat_1 [][5], int Mat_2 [][5])
{
	int i,i2,i3,i4;
	int h_1 = 5, b_1 = 5, h_2 = 5, b_2 = 5;

	for (i=0 ; i<5 ; i++) /*Hier wird nach dem Grenzwert -1001 gesucht,
						   um die Dimensionen der Matrizen zu ermitteln*/
	{
	 
	   if (Mat_1[i][0] == -1001)
		{
		  h_1 = i; // Mat_1 Höhe
		  break;
		}
	}
	for (i2=0 ; i2<5 ; i2++) /*Hier wird nach dem Grenzwert -1001 gesucht,
						   um die Dimensionen der Matrizen zu ermitteln*/
	{
	
	   if (Mat_1[0][i2] == -1001)
		  {
		  b_1 = i2; // Mat_1 Breite
		  break;
		  }
	}
	for (i3=0 ; i3<5 ; i3++) /*Hier wird nach dem Grenzwert -1001 gesucht,
						   um die Dimensionen der Matrizen zu ermitteln*/
	{
	
	   if (Mat_2[i3][0] == -1001)
		{
		  h_2 = i3; // Mat_2 Höhe
		  break; 
		}
	}
	for (i4=0 ; i4<5 ; i4++) /*Hier wird nach dem Grenzwert -1001 gesucht,
						   um die Dimensionen der Matrizen zu ermitteln*/
	{
	
	   if (Mat_2[0][i4] == -1001)
		{
		  b_2 = i4; // Mat_2 Breite
		  break;
		}
	}
	if (b_1==h_2)/*Spalten Zahl von Mat_1 == Zeilen Zahl von Mat_2*/
	{
		multiplikation(b_1, h_1, b_2, Mat_erg, Mat_1, Mat_2);
	}
	else
	   {
   
	   printf("\nMultiplikation nicht moeglich\n\n");

	   }	
}

/*****************************************************************************/

int main ()
{
	int mat1[5][5] = {	-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001 };

	int mat2[5][5] = {	-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001,
						-1001, -1001, -1001, -1001, -1001 };

	int mat_erg[5][5] = {	-1001, -1001, -1001, -1001, -1001,
							-1001, -1001, -1001, -1001, -1001,
							-1001, -1001, -1001, -1001, -1001,
							-1001, -1001, -1001, -1001, -1001,
							-1001, -1001, -1001, -1001, -1001 };

	printf("MATRIZENMULTIPLIKATION\n");
	printf("----------------------\n\n");

	printf("\nMatrix1:\n\n");
	eing_mat(mat1);

	printf("\n\nMatrix2:\n\n");
	eing_mat(mat2);

	mat_dim(mat_erg,mat1,mat2);

	printf("\n\n\n\n\n");

	ausg_mat(mat1,mat2,mat_erg);


	return(0);
}

Hab nicht so wirklich die Ahnung vom programieren :(
 
Zuletzt bearbeitet:

Götterwind

Commander
Dabei seit
Apr. 2004
Beiträge
2.686
mache mal ein Minimalbeispiel draus. Weil so richtig Lust habe ich nicht (und die anderen anscheinend auch nicht), den ganzen Code zu lesen.

Bitte beschreib mal genauer, was wirklich dein Problem ist. Am besten mache erstmal alles statisch, danach kannst du immer noch die Matrix-Dims ändern.
 
Zuletzt bearbeitet:

Götterwind

Commander
Dabei seit
Apr. 2004
Beiträge
2.686
Hups, das hatte ich ja glatt übersehen, dass er von Chars geredet hat. Naja, C ist halt kein "Wünsch-Dir-Was", sondern, wenn man einen Typ definiert, dann kann man nur mit diesem auch Arbeiten (und deren Teilmenge zumindest in der Eingabe).

Chars in Int-Variablen funktioniert nicht. Sowas müsste man halt abfangen.
 
Zuletzt bearbeitet:

riod

Lt. Commander
Dabei seit
Jan. 2006
Beiträge
1.122
du kannst auch templates definieren /operatoren überladen und dann chars / ints verwenden ....
 
P

Philifish

Gast
Also ich würde sagen, Matrizen wärn eindeutig was für Strukturen. Als Arrays ist das sowas von hässlich, wenn man bei nem 2Dimensionalen Array nen Pointer haben will wie z.B. hier:

void eing_mat( int mat_rueck[][5] )

wo zumindest nen Pointer "gemeint" ist... ;)

void eing_mat(Matrix *Zurück )

wäre doch nun wirklich schöner.

Und wenn man sich nicht unbedingt antun möchte, in C zu schreiben, könnte man das alles SO viel schöner in ner hübschen C++-Klasse machen...
 
Top