mikä onku ohjelma kaatuu siinä kun tayta_sudoku yrittää kirjottaa tiedot näytölle tulosta funktion avulla.
Koodi on sit aika pitkä. Onn yrittäny kirjottaa siit mahd. selkeän mutta kauheesti en oo kommentoinu.
Se missä kaatuu on tolla ihan lopussa
---------------------------------------------
#include
#include
#include
#include
int ruudut[9][9];
int kysy_vaikeus();
int arvo_alku(int vaikeus);
int tulosta();
int aseta_alku(int ruudukon_numero);
int tarkista();
int tarkista_01();
int tarkista_02();
int tarkista_03();
int tarkista_04();
int tarkista_05();
int tarkista_06();
int tarkista_07();
int tarkista_08();
int tarkista_09();
int tarkista_10();
int tarkista_11();
int tarkista_12();
int tarkista_13();
int tarkista_14();
int tarkista_15();
int tarkista_16();
int tarkista_17();
int tarkista_18();
int tayta_sudoku();
void main()
{
/*******************************\
* Muuttujat *
\*******************************/
//int ruudut[9][9];
bool oikein=false;
int vaikeus=1;
int ruudukon_numero=1;
/*******************************\
* Homma alkaa *
\*******************************/
vaikeus = kysy_vaikeus(); // vaikeus aste(1-5)
ruudukon_numero = arvo_alku(vaikeus); // alku asetelma vaikeuden mukaan
aseta_alku(ruudukon_numero);
tulosta();
/*******************************\
* Sitte ei ku täyttelemään *
\*******************************/
while ( oikein == false )
{
tayta_sudoku();
if ( tarkista() == 1) { oikein = true; } //Tarkistetaan
}
}
int kysy_vaikeus()
{
int vaikeus=1;
char m_vaikeus[3];
/************************/
printf("Syötä vaikeus aste(1-5)\n");
gets_s(m_vaikeus);
vaikeus = atoi(m_vaikeus);
return vaikeus;
}
int arvo_alku(int vaikeus)
{
int ruudukon_numero;
ruudukon_numero = vaikeus;
printf("Ruudukon numeroks on arvottu %d\n\n___________________________________\n\n",ruudukon_numero);
return ruudukon_numero;
}
int tulosta()
{
printf("%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n\n",
ruudut[0][0],
ruudut[0][1],
ruudut[0][2],
ruudut[0][3],
ruudut[0][4],
ruudut[0][5],
ruudut[0][6],
ruudut[0][7],
ruudut[0][8],
ruudut[1][0],
ruudut[1][1],
ruudut[1][2],
ruudut[1][3],
ruudut[1][4],
ruudut[1][5],
ruudut[1][6],
ruudut[1][7],
ruudut[1][8],
ruudut[2][0],
ruudut[2][1],
ruudut[2][2],
ruudut[2][3],
ruudut[2][4],
ruudut[2][5],
ruudut[2][6],
ruudut[2][7],
ruudut[2][8],
ruudut[3][0],
ruudut[3][1],
ruudut[3][2],
ruudut[3][3],
ruudut[3][4],
ruudut[3][5],
ruudut[3][6],
ruudut[3][7],
ruudut[3][8],
ruudut[4][0],
ruudut[4][1],
ruudut[4][2],
ruudut[4][3],
ruudut[4][4],
ruudut[4][5],
ruudut[4][6],
ruudut[4][7],
ruudut[4][8],
ruudut[5][0],
ruudut[5][1],
ruudut[5][2],
ruudut[5][3],
ruudut[5][4],
ruudut[5][5],
ruudut[5][6],
ruudut[5][7],
ruudut[5][8],
ruudut[6][0],
ruudut[6][1],
ruudut[6][2],
ruudut[6][3],
ruudut[6][4],
ruudut[6][5],
ruudut[6][6],
ruudut[6][7],
ruudut[6][8],
ruudut[7][0],
ruudut[7][1],
ruudut[7][2],
ruudut[7][3],
ruudut[7][4],
ruudut[7][5],
ruudut[7][6],
ruudut[7][7],
ruudut[7][8],
ruudut[8][0],
ruudut[8][1],
ruudut[8][2],
ruudut[8][3],
ruudut[8][4],
ruudut[8][5],
ruudut[8][6],
ruudut[8][7],
ruudut[8][8]);
return 0;
}
int aseta_alku(int ruudukon_numero)
{
//FILE *tiedosto;
//tiedosto = fopen ("RUUDUT.TXT", "r");
//ruudut = /*Lataa ruudukon sisältö tiedotosta.*/
//fclose(tiedosto);
return 0;
}
/***************\
|Tarkistus |
\***************/
int tarkista()
{
if(tarkista_01() != 45) { return 0; }
if(tarkista_02() != 45) { return 0; }
if(tarkista_03() != 45) { return 0; }
if(tarkista_04() != 45) { return 0; }
if(tarkista_05() != 45) { return 0; }
if(tarkista_06() != 45) { return 0; }
if(tarkista_07() != 45) { return 0; }
if(tarkista_08() != 45) { return 0; }
if(tarkista_09() != 45) { return 0; }
if(tarkista_10() != 45) { return 0; }
if(tarkista_11() != 45) { return 0; }
if(tarkista_12() != 45) { return 0; }
if(tarkista_13() != 45) { return 0; }
if(tarkista_14() != 45) { return 0; }
if(tarkista_15() != 45) { return 0; }
if(tarkista_16() != 45) { return 0; }
if(tarkista_17() != 45) { return 0; }
if(tarkista_18() != 45) { return 0; }
return 0;
}
int tarkista_01()
{
int apu;
apu = ruudut[0][0] = ruudut[0][1] = ruudut[0][2] = ruudut[0][3] = ruudut[0][4] = ruudut[0][5] = ruudut[0][6] = ruudut[0][7] = ruudut[0][8];
return apu;
}
int tarkista_02()
{
int apu;
apu = ruudut[1][0] = ruudut[1][1] = ruudut[1][2] = ruudut[1][3] = ruudut[1][4] = ruudut[1][5] = ruudut[1][6] = ruudut[1][7] = ruudut[1][8];
return apu;
}
int tarkista_03()
{
int apu;
apu = ruudut[2][0] = ruudut[2][1] = ruudut[2][2] = ruudut[2][3] = ruudut[2][4] = ruudut[2][5] = ruudut[2][6] = ruudut[2][7] = ruudut[2][8];
return apu;
}
int tarkista_04()
{
int apu;
apu = ruudut[3][0] = ruudut[3][1] = ruudut[3][2] = ruudut[3][3] = ruudut[3][4] = ruudut[3][5] = ruudut[3][6] = ruudut[3][7] = ruudut[3][8];
return apu;
}
int tarkista_05()
{
int apu;
apu = ruudut[4][0] = ruudut[4][1] = ruudut[4][2] = ruudut[4][3] = ruudut[4][4] = ruudut[4][5] = ruudut[4][6] = ruudut[4][7] = ruudut[4][8];
return apu;
}
int tarkista_06()
{
int apu;
apu = ruudut[5][0] = ruudut[5][1] = ruudut[5][2] = ruudut[5][3] = ruudut[5][4] = ruudut[5][5] = ruudut[5][6] = ruudut[5][7] = ruudut[5][8];
return apu;
}
int tarkista_07()
{
int apu;
apu = ruudut[6][0] = ruudut[6][1] = ruudut[0][2] = ruudut[6][3] = ruudut[6][4] = ruudut[6][5] = ruudut[6][6] = ruudut[6][7] = ruudut[6][8];
return apu;
}
int tarkista_08()
{
int apu;
apu = ruudut[7][0] = ruudut[7][1] = ruudut[7][2] = ruudut[7][3] = ruudut[7][4] = ruudut[7][5] = ruudut[7][6] = ruudut[7][7] = ruudut[7][8];
return apu;
}
int tarkista_09()
{
int apu;
apu = ruudut[8][0] = ruudut[8][1] = ruudut[8][2] = ruudut[8][3] = ruudut[8][4] = ruudut[8][5] = ruudut[8][6] = ruudut[8][7] = ruudut[8][8];
return apu;
}
int tarkista_10()
{
int apu;
apu = ruudut[0][0] = ruudut[1][0] = ruudut[2][0] = ruudut[3][0] = ruudut[4][0] = ruudut[5][0] = ruudut[6][0] = ruudut[7][0] = ruudut[8][0];
return apu;
}
int tarkista_11()
{
int apu;
apu = ruudut[0][1] = ruudut[1][1] = ruudut[2][1] = ruudut[3][1] = ruudut[4][1] = ruudut[5][1] = ruudut[6][1] = ruudut[7][1] = ruudut[8][1];
return apu;
}
int tarkista_12()
{
int apu;
apu = ruudut[0][2] = ruudut[1][2] = ruudut[2][2] = ruudut[3][2] = ruudut[4][2] = ruudut[5][2] = ruudut[6][2] = ruudut[7][2] = ruudut[8][2];
return apu;
}
int tarkista_13()
{
int apu;
apu = ruudut[0][3] = ruudut[1][3] = ruudut[2][3] = ruudut[3][3] = ruudut[4][3] = ruudut[5][3] = ruudut[6][3] = ruudut[7][3] = ruudut[8][3];
return apu;
}
int tarkista_14()
{
int apu;
apu = ruudut[0][4] = ruudut[1][4] = ruudut[2][4] = ruudut[3][4] = ruudut[4][4] = ruudut[5][4] = ruudut[6][4] = ruudut[7][4] = ruudut[8][4];
return apu;
}
int tarkista_15()
{
int apu;
apu = ruudut[0][5] = ruudut[1][5] = ruudut[2][5] = ruudut[3][5] = ruudut[4][5] = ruudut[5][5] = ruudut[6][5] = ruudut[7][5] = ruudut[8][5];
return apu;
}
int tarkista_16()
{
int apu;
apu = ruudut[0][6] = ruudut[1][6] = ruudut[2][6] = ruudut[3][6] = ruudut[4][6] = ruudut[5][6] = ruudut[6][6] = ruudut[7][6] = ruudut[8][6];
return apu;
}
int tarkista_17()
{
int apu;
apu = ruudut[0][7] = ruudut[1][7] = ruudut[2][7] = ruudut[3][7] = ruudut[4][7] = ruudut[5][7] = ruudut[6][7] = ruudut[7][7] = ruudut[8][7];
return apu;
}
int tarkista_18()
{
int apu;
apu = ruudut[0][8] = ruudut[1][8] = ruudut[2][8] = ruudut[3][8] = ruudut[4][8] = ruudut[5][8] = ruudut[6][8] = ruudut[7][8] = ruudut[8][8];
return apu;
}
int tayta_sudoku()
{
int x=0;
char mx[3];
int y=0;
char my[3];
bool tayta=true;
while(tayta == true)
{
printf("Anna muokattavan ruudun kordinaatit. Ensin pystyrivi.(1-9). \nSyötä 0 lopettaaksesi täyttämisen.");
gets_s(mx);
x = atoi(mx);
if (x == 0) {tayta=false;}
x--;
printf("Sitten vaakarivi.(1-9)");
gets_s(mx);
y = atoi(my);
y--;
printf("Minkä luvun haluat laittaa ruutuun [x=%d y=%d]? Syötä 0 peruuttaaksesi.", x, y);
scanf_s("%d", ruudut[x][y]);
tulosta(); // TÄS KOHTAA KAATUU
}
return 0;
}
Koodi on sit aika pitkä. Onn yrittäny kirjottaa siit mahd. selkeän mutta kauheesti en oo kommentoinu.
Se missä kaatuu on tolla ihan lopussa
---------------------------------------------
#include
#include
#include
#include
int ruudut[9][9];
int kysy_vaikeus();
int arvo_alku(int vaikeus);
int tulosta();
int aseta_alku(int ruudukon_numero);
int tarkista();
int tarkista_01();
int tarkista_02();
int tarkista_03();
int tarkista_04();
int tarkista_05();
int tarkista_06();
int tarkista_07();
int tarkista_08();
int tarkista_09();
int tarkista_10();
int tarkista_11();
int tarkista_12();
int tarkista_13();
int tarkista_14();
int tarkista_15();
int tarkista_16();
int tarkista_17();
int tarkista_18();
int tayta_sudoku();
void main()
{
/*******************************\
* Muuttujat *
\*******************************/
//int ruudut[9][9];
bool oikein=false;
int vaikeus=1;
int ruudukon_numero=1;
/*******************************\
* Homma alkaa *
\*******************************/
vaikeus = kysy_vaikeus(); // vaikeus aste(1-5)
ruudukon_numero = arvo_alku(vaikeus); // alku asetelma vaikeuden mukaan
aseta_alku(ruudukon_numero);
tulosta();
/*******************************\
* Sitte ei ku täyttelemään *
\*******************************/
while ( oikein == false )
{
tayta_sudoku();
if ( tarkista() == 1) { oikein = true; } //Tarkistetaan
}
}
int kysy_vaikeus()
{
int vaikeus=1;
char m_vaikeus[3];
/************************/
printf("Syötä vaikeus aste(1-5)\n");
gets_s(m_vaikeus);
vaikeus = atoi(m_vaikeus);
return vaikeus;
}
int arvo_alku(int vaikeus)
{
int ruudukon_numero;
ruudukon_numero = vaikeus;
printf("Ruudukon numeroks on arvottu %d\n\n___________________________________\n\n",ruudukon_numero);
return ruudukon_numero;
}
int tulosta()
{
printf("%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n----------------- \n%d|%d|%d|%d|%d|%d|%d|%d|%d \n\n",
ruudut[0][0],
ruudut[0][1],
ruudut[0][2],
ruudut[0][3],
ruudut[0][4],
ruudut[0][5],
ruudut[0][6],
ruudut[0][7],
ruudut[0][8],
ruudut[1][0],
ruudut[1][1],
ruudut[1][2],
ruudut[1][3],
ruudut[1][4],
ruudut[1][5],
ruudut[1][6],
ruudut[1][7],
ruudut[1][8],
ruudut[2][0],
ruudut[2][1],
ruudut[2][2],
ruudut[2][3],
ruudut[2][4],
ruudut[2][5],
ruudut[2][6],
ruudut[2][7],
ruudut[2][8],
ruudut[3][0],
ruudut[3][1],
ruudut[3][2],
ruudut[3][3],
ruudut[3][4],
ruudut[3][5],
ruudut[3][6],
ruudut[3][7],
ruudut[3][8],
ruudut[4][0],
ruudut[4][1],
ruudut[4][2],
ruudut[4][3],
ruudut[4][4],
ruudut[4][5],
ruudut[4][6],
ruudut[4][7],
ruudut[4][8],
ruudut[5][0],
ruudut[5][1],
ruudut[5][2],
ruudut[5][3],
ruudut[5][4],
ruudut[5][5],
ruudut[5][6],
ruudut[5][7],
ruudut[5][8],
ruudut[6][0],
ruudut[6][1],
ruudut[6][2],
ruudut[6][3],
ruudut[6][4],
ruudut[6][5],
ruudut[6][6],
ruudut[6][7],
ruudut[6][8],
ruudut[7][0],
ruudut[7][1],
ruudut[7][2],
ruudut[7][3],
ruudut[7][4],
ruudut[7][5],
ruudut[7][6],
ruudut[7][7],
ruudut[7][8],
ruudut[8][0],
ruudut[8][1],
ruudut[8][2],
ruudut[8][3],
ruudut[8][4],
ruudut[8][5],
ruudut[8][6],
ruudut[8][7],
ruudut[8][8]);
return 0;
}
int aseta_alku(int ruudukon_numero)
{
//FILE *tiedosto;
//tiedosto = fopen ("RUUDUT.TXT", "r");
//ruudut = /*Lataa ruudukon sisältö tiedotosta.*/
//fclose(tiedosto);
return 0;
}
/***************\
|Tarkistus |
\***************/
int tarkista()
{
if(tarkista_01() != 45) { return 0; }
if(tarkista_02() != 45) { return 0; }
if(tarkista_03() != 45) { return 0; }
if(tarkista_04() != 45) { return 0; }
if(tarkista_05() != 45) { return 0; }
if(tarkista_06() != 45) { return 0; }
if(tarkista_07() != 45) { return 0; }
if(tarkista_08() != 45) { return 0; }
if(tarkista_09() != 45) { return 0; }
if(tarkista_10() != 45) { return 0; }
if(tarkista_11() != 45) { return 0; }
if(tarkista_12() != 45) { return 0; }
if(tarkista_13() != 45) { return 0; }
if(tarkista_14() != 45) { return 0; }
if(tarkista_15() != 45) { return 0; }
if(tarkista_16() != 45) { return 0; }
if(tarkista_17() != 45) { return 0; }
if(tarkista_18() != 45) { return 0; }
return 0;
}
int tarkista_01()
{
int apu;
apu = ruudut[0][0] = ruudut[0][1] = ruudut[0][2] = ruudut[0][3] = ruudut[0][4] = ruudut[0][5] = ruudut[0][6] = ruudut[0][7] = ruudut[0][8];
return apu;
}
int tarkista_02()
{
int apu;
apu = ruudut[1][0] = ruudut[1][1] = ruudut[1][2] = ruudut[1][3] = ruudut[1][4] = ruudut[1][5] = ruudut[1][6] = ruudut[1][7] = ruudut[1][8];
return apu;
}
int tarkista_03()
{
int apu;
apu = ruudut[2][0] = ruudut[2][1] = ruudut[2][2] = ruudut[2][3] = ruudut[2][4] = ruudut[2][5] = ruudut[2][6] = ruudut[2][7] = ruudut[2][8];
return apu;
}
int tarkista_04()
{
int apu;
apu = ruudut[3][0] = ruudut[3][1] = ruudut[3][2] = ruudut[3][3] = ruudut[3][4] = ruudut[3][5] = ruudut[3][6] = ruudut[3][7] = ruudut[3][8];
return apu;
}
int tarkista_05()
{
int apu;
apu = ruudut[4][0] = ruudut[4][1] = ruudut[4][2] = ruudut[4][3] = ruudut[4][4] = ruudut[4][5] = ruudut[4][6] = ruudut[4][7] = ruudut[4][8];
return apu;
}
int tarkista_06()
{
int apu;
apu = ruudut[5][0] = ruudut[5][1] = ruudut[5][2] = ruudut[5][3] = ruudut[5][4] = ruudut[5][5] = ruudut[5][6] = ruudut[5][7] = ruudut[5][8];
return apu;
}
int tarkista_07()
{
int apu;
apu = ruudut[6][0] = ruudut[6][1] = ruudut[0][2] = ruudut[6][3] = ruudut[6][4] = ruudut[6][5] = ruudut[6][6] = ruudut[6][7] = ruudut[6][8];
return apu;
}
int tarkista_08()
{
int apu;
apu = ruudut[7][0] = ruudut[7][1] = ruudut[7][2] = ruudut[7][3] = ruudut[7][4] = ruudut[7][5] = ruudut[7][6] = ruudut[7][7] = ruudut[7][8];
return apu;
}
int tarkista_09()
{
int apu;
apu = ruudut[8][0] = ruudut[8][1] = ruudut[8][2] = ruudut[8][3] = ruudut[8][4] = ruudut[8][5] = ruudut[8][6] = ruudut[8][7] = ruudut[8][8];
return apu;
}
int tarkista_10()
{
int apu;
apu = ruudut[0][0] = ruudut[1][0] = ruudut[2][0] = ruudut[3][0] = ruudut[4][0] = ruudut[5][0] = ruudut[6][0] = ruudut[7][0] = ruudut[8][0];
return apu;
}
int tarkista_11()
{
int apu;
apu = ruudut[0][1] = ruudut[1][1] = ruudut[2][1] = ruudut[3][1] = ruudut[4][1] = ruudut[5][1] = ruudut[6][1] = ruudut[7][1] = ruudut[8][1];
return apu;
}
int tarkista_12()
{
int apu;
apu = ruudut[0][2] = ruudut[1][2] = ruudut[2][2] = ruudut[3][2] = ruudut[4][2] = ruudut[5][2] = ruudut[6][2] = ruudut[7][2] = ruudut[8][2];
return apu;
}
int tarkista_13()
{
int apu;
apu = ruudut[0][3] = ruudut[1][3] = ruudut[2][3] = ruudut[3][3] = ruudut[4][3] = ruudut[5][3] = ruudut[6][3] = ruudut[7][3] = ruudut[8][3];
return apu;
}
int tarkista_14()
{
int apu;
apu = ruudut[0][4] = ruudut[1][4] = ruudut[2][4] = ruudut[3][4] = ruudut[4][4] = ruudut[5][4] = ruudut[6][4] = ruudut[7][4] = ruudut[8][4];
return apu;
}
int tarkista_15()
{
int apu;
apu = ruudut[0][5] = ruudut[1][5] = ruudut[2][5] = ruudut[3][5] = ruudut[4][5] = ruudut[5][5] = ruudut[6][5] = ruudut[7][5] = ruudut[8][5];
return apu;
}
int tarkista_16()
{
int apu;
apu = ruudut[0][6] = ruudut[1][6] = ruudut[2][6] = ruudut[3][6] = ruudut[4][6] = ruudut[5][6] = ruudut[6][6] = ruudut[7][6] = ruudut[8][6];
return apu;
}
int tarkista_17()
{
int apu;
apu = ruudut[0][7] = ruudut[1][7] = ruudut[2][7] = ruudut[3][7] = ruudut[4][7] = ruudut[5][7] = ruudut[6][7] = ruudut[7][7] = ruudut[8][7];
return apu;
}
int tarkista_18()
{
int apu;
apu = ruudut[0][8] = ruudut[1][8] = ruudut[2][8] = ruudut[3][8] = ruudut[4][8] = ruudut[5][8] = ruudut[6][8] = ruudut[7][8] = ruudut[8][8];
return apu;
}
int tayta_sudoku()
{
int x=0;
char mx[3];
int y=0;
char my[3];
bool tayta=true;
while(tayta == true)
{
printf("Anna muokattavan ruudun kordinaatit. Ensin pystyrivi.(1-9). \nSyötä 0 lopettaaksesi täyttämisen.");
gets_s(mx);
x = atoi(mx);
if (x == 0) {tayta=false;}
x--;
printf("Sitten vaakarivi.(1-9)");
gets_s(mx);
y = atoi(my);
y--;
printf("Minkä luvun haluat laittaa ruutuun [x=%d y=%d]? Syötä 0 peruuttaaksesi.", x, y);
scanf_s("%d", ruudut[x][y]);
tulosta(); // TÄS KOHTAA KAATUU
}
return 0;
}
Vastaukset 10
Vanhimmat
Tuota noin... koodissasi on hieman parantamisen varaa. Itse virhe johtunee siitä, että koitat tulostaa alustamattoman taulukon. Jos siirrät tulosta-funktion kutsun while-silmukan jälkeen ja täytät taulukon ennen tulostamista, niin saattaisi toimia (tai ei).
Olet tehnyt ohjelmassasi aika paljon toistoa. Esimerkiksi tarkista-funktiot olet toteuttanut seuraavasti:
int tarkista_01()
{
int apu;
apu = ruudut[0][0] = ruudut[0][1] = ruudut[0][2] = ruudut[0][3] = ruudut[0][4] = ruudut[0][5] = ruudut[0][6] = ruudut[0][7] = ruudut[0][8];
return apu;
}
Ilmeisesti tarkista_01 laskee sudokun ensimmäisen vaakarivin numerot yhteen, tarkista_02 toisen jne. Tarkista_09 sitten ensimmäisen pystyrivin jne. Eikö tuo olisi helpompaa toteuttaa yhdellä funktiolla, jolle annat parametrina tarkistetaanko vaaka- vai pystyriviä ja kuinka monetta riviä? Jos tarkistetaan kolmatta vaakariviä, niin mitkä alkiot summaat? Entä neljättä riviä? Entä ännättä (n) riviä? Vastaavasti pystyrivien kans.
Vastaava pätee tulosta-funktioon. Olet käsin kirjoittanut koko helahoidon yhteen vaikka pärjäisit kahdella yksikertaisella printf:llä (tai yhdelläkin). Ensin tulostat ensimmäisen vaakarivin ensimmäisen alkion [0][0], sitten toisen [0][1] jne. kunnes tulee [0][8], jonka jälkeen tarvitset rivinvaihdon. Sitten aloitat toisesta vaakarivistä, eli alkiosta [1][0], sitten [1][1]... [1][8] etc. Aina siis käydään läpi nollasta kasiin alkiot tietyllä järjestyksellä.
Ehdottaisin miettimään ohjelman rakenteen ensin uusiksi. Sen jälkeen ongelmakohta löytyy helpommin ja bonuksena hiffaat miten for-luuppia käyttämällä voi oikaista paljon ja pääsee huomattavasti helpommalla. Laita vaikka tänne tuotoksia ihailtavaksi, niin eiköhän joku aina heitä vinkkiä (ja varmasti saat ristikkäisiä jumalallisia totuuksiakin, mutta käytä tervettä järkeä niiden tulkitsemisessa).
En alustanut ruudut taulukkoa koska se on globaali muuttuja ja opas sanoi että globaalit alustuu ittestää. Ja sen tulostamisen täytys tapahut se silmukan sisällä. (vai pystykö sinä täyttämään sudokun näkymöttömällä musteella tyhjään ruudukkoon ja siten kun olet valmis muste muuttuu näkyväksi?)
noi tarkista jutut otin laiskuuttani yhdestän vanhast ohjemastani ja muutan ne kyllä sitku ohjelma toimii muuten.
"opas sanoi että globaalit alustuu ittestää."
Kaikki muuttujat pitää alustaa ennen käyttöä jo senkin takia, että se on hyvän ohjelmointitavan mukaista. Standardi (ainakaan mikään tuntemani) ei lupaa muuttujien alustamista ja kääntäjienkin välisiä eroja on paljon.
Alusta se taulukko ensin ja tee tulosta-funktioon ehdottamani muutokset. Sitten on helpompi pähkäillä missä vika saattaisi olla. (vika ei tietty välttämättä sillä korjaannu, mutta sen etsiminen on sinulle helpompaa - tarkoitukseni oli neuvoa suuntaa)
"(vai pystykö sinä täyttämään sudokun näkymöttömällä musteella tyhjään ruudukkoon ja siten kun olet valmis muste muuttuu näkyväksi?) "
Kyllä minä pystyy.
"noi tarkista jutut otin laiskuuttani yhdestän vanhast ohjemastani ja muutan ne kyllä sitku ohjelma toimii muuten."
Aha. Koitan kopsia jostain laiskuuttani jonkun vanhan lähettämäni vastauksen, pärjännetkin sitten sillä.
ja jos joku halua kunnon naurut nii kerompa mikä se ohjelma oli john noi tarkista jutut joskus tein.
Se oli semmonen joka srand:lla arpoo ruudukon täyteen numeroita ja siiten tarkistaa sen noilla tarkista jutuilla ja jos ei ollu oikee nii sit vaa arvottii uuet luvut ja se jatkoi niin kauan kunnes läpimenevä ratkaisu löytyi.
yhtään oikeaa ei koskaan tullut vaikka ruudukkoa täytettiin 12 miljoonaa kertaa.
"yhtään oikeaa ei koskaan tullut vaikka ruudukkoa täytettiin 12 miljoonaa kertaa."
Jos haluat sudoku-ristikon, joka on ilman esiehtoja täytetty oikein, niin esim seuraava systemaattisesti rakennettu käy oikein hyvin... ainakin pikaisesti tsekkaamalla.
123456789
456789123
789123456
231564897
564897231
897231564
312645978
645978312
978312645
Haasteena kysyn, että oletko varma tarkistustesi toimivuudesta :) (en tarkistanut, yleisesti haluan herättää kysymyksen, että milloin voit olla varma ohjelmasi toimivuudesta)
Nyt pitää rientää... lycka till.
Sain toimiin. Nyt van taytyy mietiä miten arvon mitä alku asetelmaa käytetään ja miten ne ladataan tiedostostosta. Mutta luulempa keksin ne ite.
En ole mitenkään tarkistanut tarkistus juttua mutta kyllä se pitäis toimia kun se tarkistaa että jokaisen pysty- ja vaaka rivin summaksi tulee 45, ja lopettaa tarkistamisen kun tulee ensimmäin rivi joka on väärin.
-------------------------------------------------
#include
#include
#include
#include
int ruudut[9][9] = {0};
int kysy_vaikeus();
int arvo_alku(int vaikeus);
int tulosta();
int aseta_alku(int ruudukon_numero);
int tarkista();
int tarkista_01();
int tarkista_02();
int tarkista_03();
int tarkista_04();
int tarkista_05();
int tarkista_06();
int tarkista_07();
int tarkista_08();
int tarkista_09();
int tarkista_10();
int tarkista_11();
int tarkista_12();
int tarkista_13();
int tarkista_14();
int tarkista_15();
int tarkista_16();
int tarkista_17();
int tarkista_18();
int tayta_sudoku();
int onko_tays();
void main()
{
/*******************************\
* Muuttujat *
\*******************************/
//int ruudut[9][9];
bool oikein=false;
int vaikeus=1;
int ruudukon_numero=1;
/*******************************\
* Homma alkaa *
\*******************************/
vaikeus = kysy_vaikeus(); // vaikeus aste(1-5)
ruudukon_numero = arvo_alku(vaikeus); // alku asetelma vaikeuden mukaan
aseta_alku(ruudukon_numero);
tulosta();
/*******************************\
* Sitte ei ku täyttelemään *
\*******************************/
while ( oikein == false )
{
tayta_sudoku();
if ( tarkista() == 1) { oikein = true; } //Tarkistetaan
}
}
int kysy_vaikeus()
{
int vaikeus=1;
char m_vaikeus[3];
/************************/
printf("Syötä vaikeus aste(1-5)\n");
gets_s(m_vaikeus);
vaikeus = atoi(m_vaikeus);
return vaikeus;
}
int arvo_alku(int vaikeus)
{
int ruudukon_numero;
ruudukon_numero = vaikeus;
printf("Ruudukon numeroks on arvottu %d\n\n___________________________________\n\n",ruudukon_numero);
return ruudukon_numero;
}
int tulosta()
{
int x=-1;
int y=0;
int luku;
printf("\n\n|");
for(luku=0; luku < 81; luku++)
{
x++;
printf("%d|", ruudut[x][y]);
if (x == 2) { printf("|"); }
if (x == 5) { printf("|"); }
if( x == 8 )
{
x=-1;
y++;
printf("\n---------------------\n");
if( y == 3 ) {printf("---------------------\n");}
if( y == 6 ) {printf("---------------------\n");}
printf("|");
}
}
return 0;
}
int aseta_alku(int ruudukon_numero)
{
//FILE *tiedosto;
//tiedosto = fopen ("RUUDUT.TXT", "r");
//ruudut = /*Lataa ruudukon sisältö tiedotosta.*/
//fclose(tiedosto);
return 0;
}
/***************\
|Tarkistus |
\***************/
int tarkista()
{
if(tarkista_01() != 45) { return 0; }
if(tarkista_02() != 45) { return 0; }
if(tarkista_03() != 45) { return 0; }
if(tarkista_04() != 45) { return 0; }
if(tarkista_05() != 45) { return 0; }
if(tarkista_06() != 45) { return 0; }
if(tarkista_07() != 45) { return 0; }
if(tarkista_08() != 45) { return 0; }
if(tarkista_09() != 45) { return 0; }
if(tarkista_10() != 45) { return 0; }
if(tarkista_11() != 45) { return 0; }
if(tarkista_12() != 45) { return 0; }
if(tarkista_13() != 45) { return 0; }
if(tarkista_14() != 45) { return 0; }
if(tarkista_15() != 45) { return 0; }
if(tarkista_16() != 45) { return 0; }
if(tarkista_17() != 45) { return 0; }
if(tarkista_18() != 45) { return 0; }
return 0;
}
int tarkista_01()
{
int apu;
apu = ruudut[0][0] += ruudut[0][1] += ruudut[0][2] += ruudut[0][3] += ruudut[0][4] += ruudut[0][5] += ruudut[0][6] += ruudut[0][7] += ruudut[0][8];
return apu;
}
int tarkista_02()
{
int apu;
apu = ruudut[1][0] += ruudut[1][1] += ruudut[1][2] += ruudut[1][3] += ruudut[1][4] += ruudut[1][5] += ruudut[1][6] += ruudut[1][7] += ruudut[1][8];
return apu;
}
int tarkista_03()
{
int apu;
apu = ruudut[2][0] += ruudut[2][1] += ruudut[2][2] += ruudut[2][3] += ruudut[2][4] += ruudut[2][5] += ruudut[2][6] += ruudut[2][7] += ruudut[2][8];
return apu;
}
int tarkista_04()
{
int apu;
apu = ruudut[3][0] += ruudut[3][1] += ruudut[3][2] += ruudut[3][3] += ruudut[3][4] += ruudut[3][5] += ruudut[3][6] += ruudut[3][7] += ruudut[3][8];
return apu;
}
int tarkista_05()
{
int apu;
apu = ruudut[4][0] += ruudut[4][1] += ruudut[4][2] += ruudut[4][3] += ruudut[4][4] += ruudut[4][5] += ruudut[4][6] += ruudut[4][7] += ruudut[4][8];
return apu;
}
int tarkista_06()
{
int apu;
apu = ruudut[5][0] += ruudut[5][1] += ruudut[5][2] += ruudut[5][3] += ruudut[5][4] += ruudut[5][5] += ruudut[5][6] += ruudut[5][7] += ruudut[5][8];
return apu;
}
int tarkista_07()
{
int apu;
apu = ruudut[6][0] += ruudut[6][1] += ruudut[0][2] += ruudut[6][3] += ruudut[6][4] += ruudut[6][5] += ruudut[6][6] += ruudut[6][7] += ruudut[6][8];
return apu;
}
int tarkista_08()
{
int apu;
apu = ruudut[7][0] += ruudut[7][1] += ruudut[7][2] += ruudut[7][3] += ruudut[7][4] += ruudut[7][5] += ruudut[7][6] += ruudut[7][7] += ruudut[7][8];
return apu;
}
int tarkista_09()
{
int apu;
apu = ruudut[8][0] += ruudut[8][1] += ruudut[8][2] += ruudut[8][3] += ruudut[8][4] += ruudut[8][5] += ruudut[8][6] += ruudut[8][7] += ruudut[8][8];
return apu;
}
int tarkista_10()
{
int apu;
apu = ruudut[0][0] += ruudut[1][0] += ruudut[2][0] += ruudut[3][0] += ruudut[4][0] += ruudut[5][0] += ruudut[6][0] += ruudut[7][0] += ruudut[8][0];
return apu;
}
int tarkista_11()
{
int apu;
apu = ruudut[0][1] += ruudut[1][1] += ruudut[2][1] += ruudut[3][1] += ruudut[4][1] += ruudut[5][1] += ruudut[6][1] += ruudut[7][1] += ruudut[8][1];
return apu;
}
int tarkista_12()
{
int apu;
apu = ruudut[0][2] += ruudut[1][2] += ruudut[2][2] += ruudut[3][2] += ruudut[4][2] += ruudut[5][2] += ruudut[6][2] += ruudut[7][2] += ruudut[8][2];
return apu;
}
int tarkista_13()
{
int apu;
apu = ruudut[0][3] += ruudut[1][3] += ruudut[2][3] += ruudut[3][3] += ruudut[4][3] += ruudut[5][3] += ruudut[6][3] += ruudut[7][3] += ruudut[8][3];
return apu;
}
int tarkista_14()
{
int apu;
apu = ruudut[0][4] += ruudut[1][4] += ruudut[2][4] += ruudut[3][4] += ruudut[4][4] += ruudut[5][4] += ruudut[6][4] += ruudut[7][4] += ruudut[8][4];
return apu;
}
int tarkista_15()
{
int apu;
apu = ruudut[0][5] += ruudut[1][5] += ruudut[2][5] += ruudut[3][5] += ruudut[4][5] += ruudut[5][5] += ruudut[6][5] += ruudut[7][5] += ruudut[8][5];
return apu;
}
int tarkista_16()
{
int apu;
apu = ruudut[0][6] += ruudut[1][6] += ruudut[2][6] += ruudut[3][6] += ruudut[4][6] += ruudut[5][6] += ruudut[6][6] += ruudut[7][6] += ruudut[8][6];
return apu;
}
int tarkista_17()
{
int apu;
apu = ruudut[0][7] += ruudut[1][7] += ruudut[2][7] += ruudut[3][7] += ruudut[4][7] += ruudut[5][7] += ruudut[6][7] += ruudut[7][7] += ruudut[8][7];
return apu;
}
int tarkista_18()
{
int apu;
apu = ruudut[0][8] += ruudut[1][8] += ruudut[2][8] += ruudut[3][8] += ruudut[4][8] += ruudut[5][8] += ruudut[6][8] += ruudut[7][8] += ruudut[8][8];
return apu;
}
int tayta_sudoku()
{
int x=0;
char mx[3];
int y=0;
char my[3];
char mr[3];
bool tayta=true;
while(tayta == true)
{
printf("\n\nAnna muokattavan ruudun kordinaatit. Ensin pystyrivi.(1-9). \n");
gets_s(mx);
x = atoi(mx);
x--;
printf("\nSitten vaakarivi.(1-9)\n");
gets_s(my);
y = atoi(my);
y--;
printf("\nMinkä luvun haluat laittaa ruutuun [x=%s y=%s]? Syötä 0 peruuttaaksesi.\n", mx, my);
gets_s(mr);
ruudut[x][y] = atoi(mr);
if(ruudut[x][y] > 9) { ruudut[x][y]=0; }
if(onko_tays() == 0) { tayta=false; }
tulosta();
}
return 0;
}
int onko_tays()
{
int luku=0;
int x=0;
int y=0;
while(luku < 81)
{
if( ruudut[x][y] == 0 ) { return 1; }
if( x=8 )
{
x=-1;
y++;
}
x++;
luku++;
}
return 0;
}
"En ole mitenkään tarkistanut tarkistus juttua mutta kyllä se pitäis toimia kun se tarkistaa että jokaisen pysty- ja vaaka rivin summaksi tulee 45, ja lopettaa tarkistamisen kun tulee ensimmäin rivi joka on väärin. "
Meneekö seuraava ristikko läpi tarkistuksestasi? Siinä pysty- ja vaakarivien summa on 45.
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
jos se oikeen on.
kun 1 2 3 4 5 6 7 8 9=45.
Ensimmäisessä neljänneksessä on nimittäin numerot
123
234
345
kun siinä saisi olla vain yksi kutakin numeroa väliltä 1-9. Muutkaan neljännekset eivät oikein näytä lailliselta sudokulta.
Tuon tarkistuksen koodaaminen taitaakin olla hyvä harjoitus. Ehdothan normaalissa sudokussa ovat pelkästään
1) Jokaisella vaaka- ja pystyrivillä esiintyvät kaikki numerot väliltä 1-9 (tästä seuraa, että summa on 45, mutta siitä, että summa on 45 *ei seuraa*, että siellä olisivat kaikki numerot väliltä 1-9).
2) Jokaisessa yhdeksässä erillisessä 3x3 ruudussa on kaikki numerot väliltä 1-9.
Miten tarkistus menisi ihan pseudokoodilla?
no täytyypä miettiä tarkistusta vähän enemmän sittenkun olen ensiksi pähkäilly alku asetelmien tiedostosta lataamisen