in C überprüfen ob sudokumatrix

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
ayumi90
Beiträge: 1
Registriert: Sa Mär 19, 2016 1:05 pm

in C überprüfen ob sudokumatrix

Beitrag von ayumi90 » Sa Mär 19, 2016 1:09 pm

Hi Leute,
ich bin im ersten Semester Informatik und schreibe am Montag eine Klausur in C. Versuche noch ein paar Programme zu schreiben um zu üben. Bei dieser Aufgabe, bekomm ich aber immer die Fehlermeldung Segmantation fault. Ich finde meinen Fehler nicht.

Aufgabe: Programmieren Sie eine Funktion

int sudokucheck(const int** s)

die von einer durch ein zweidimensionales int-Feld der Größe 9x9 testet, ob es sich um eine Sudoku-Matrix handelt. Geben Sie 1 zurück, falls ja, und 0 sonst.

mein Code:

Code: Alles auswählen

#include<stdio.h>
#include <string.h>

int sudokucheck(const int** s){
	int laenge = 9;
	int n = 0;
	int m = 0;
	
	while (n < laenge){	// jede zeile gibt eine permutation der Länge 9 an
		m = 0;
		while (m < laenge){
			if (permtest(s[n][m], laenge)){
				m++;
			}
			else {
				return 0;
			}
		}
	n++;
	}
	m = 0;
	while (m < laenge){	// jede spalte gibt eine permutation der Länge 9 an
		n = 0;
		while (n < laenge){
			if (permtest(s[n][m], laenge)){
				m++;
			}
			else {
				return 0;
			}
		}
	}
	
	int laenge2 = 3; // Jeder Block (3x3 Matrix) enthält jeden Wert 1 bis 9 genau einmal
	
	m = 0;
	int i = 0;
	int x = 1;
	int y = 2;
	int feld1[i][m], feld2[x][m], feld3[y][m];
	
	while (y <= laenge){ // solange nicht über die 9 zeile untersucht wird
		for(m = 0; m < laenge2; m++){ // solange nicht über die 9 spalte untersucht wird
			if((!memcmp(feld1, feld2, sizeof(3))) && (!memcmp(feld2, feld3, sizeof(3)))){ // solange alle ungleich sind
				m+3;
			}
			else{ // wenn keine ungleichheit herrscht
				return 0; // felhlerrückgabe
			}
		i + 3; // nächste 3er box überprüfen
		x + 3;
		y + 3;
		}
	}
	
return 1;
}

int permtest(const int** s, int laenge){ // ohne wiederholung und bijektiv
	int i = 0;
	int index = 0;
	
	for (int j = 1; j <= laenge; j++){ // hier gehe ich das Feld der Menge {1,2...,n} durch
		i = 0; // ich beginne wieder bei 0 zu zählen
		index = 0; // ich muss immer wieder den index auf beginn setzen - gehe von vorne durch
		while (index != (laenge)){ // solange ungleich länge 
			if (j == s[index]){ // überprüfe ob gleichheit herrscht
				i++; // zähle die häufigkeit
			}
			index++; // gehe zur nächsten stelle im index
		}
		if (i != 1 ){ // wenn i nicht genau 1
			return 0; // keine permutation
		}
	}
	return 1; // sonst permutation
	
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: in C überprüfen ob sudokumatrix

Beitrag von Xin » So Mär 20, 2016 8:46 am

Okay, das ist recht viel Text, wo an vielen Stellen was sein könnte und Du lieferst wenig Informationen.

Ich kann das nicht kompilieren, weil eine Test-Routine fehlt. Und - sorry - ich schreib jetzt keine, das ist Dein Job mir die Sache einfach zu machen, wenn Du Fragen stellst.

Beim Versuch es zu kompilieren erhielt ich aber bereits Warnings:

Code: Alles auswählen

ayumi90.c:12:18: warning: implicit declaration of function 'permtest' is invalid
      in C99 [-Wimplicit-function-declaration]
             if (permtest(s[n][m], laenge)){
                 ^
ayumi90.c:45:18: warning: expression result unused [-Wunused-value]
                m+3;
                ~^~
ayumi90.c:50:13: warning: expression result unused [-Wunused-value]
          i + 3; // nächste 3er box überprüfen
          ~ ^ ~
ayumi90.c:51:13: warning: expression result unused [-Wunused-value]
          x + 3;
          ~ ^ ~
ayumi90.c:52:13: warning: expression result unused [-Wunused-value]
          y + 3;
          ~ ^ ~
ayumi90.c:67:20: warning: comparison between pointer and integer
      ('int' and 'const int *')
             if (j == s[index]){ // überprüfe ob gleichheit herrscht
                 ~ ^  ~~~~~~~~
Warnings heißt, dass eine Stelle im Code WAHRSCHEINLICH falsch ist. Es könnte richtig sein, aber normalerweise programmiert man so nicht. In Deinem Fall sind die Stellen SEHR WAHRSCHEINLICH falsch. ;)

Beim nächsten Mal bitte ein testbares Programm mitliefern!

Ansonsten - je nachdem welche Entwicklungsumgebung Du nutzt, kannst du das Programm mit gdb starten und wo immer es Dir um die Ohren fliegt, kannst Du gdb fragen, wo es stehen geblieben ist.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten