Üdv!
Van egy komplett kódom, a probléma a következő, egy 2D-s charakterekből álló mátrixban kéne megtalálnom egy szót, az ötletem az volt hogy megkeresem a szó elejét és megnézem mindegyik irányt, sajnos állandóan azt adja vissza, hogy nem talált semmit és nem tudom mért :S
Segítséget előre is köszönöm
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
#define START 0
#define TRUE 1
#define FALSE 0
typedef struct matrix{
int sorok;
int oszlopok;
char **matrix;
}TMatrix;
typedef struct vector{
int darab;
char **szavak;
}Tvektor;
int szobeolvas(Tvektor *vektor){
FILE *cteni;
int i=0;
cteni = fopen("szavak.txt","r");
vektor->szavak=malloc(sizeof(char*)*100);
vektor->szavak[i]=malloc(sizeof(char)*100);
fscanf(cteni,"%s",vektor->szavak[i]);
printf("%s\n",vektor->szavak[i]);
vektor->darab = strlen(*vektor->szavak);
printf("%d\n",(vektor->darab));
return 0;
}
int matrixbeolvas(TMatrix *m){
FILE* fInput;
fInput=fopen("matrix.txt","r");
fscanf(fInput,"%d %d",&m->sorok,&m->oszlopok);
m->matrix=malloc(m->sorok * sizeof(int*));
if (m->matrix==NULL) exit(-2);
for (int i=0;i<m->sorok;i++){
m->matrix[i]=malloc(m->oszlopok * sizeof(int));
if (m->matrix[i]==NULL) exit(-2);
}
for (int i=0;i<m->sorok;i++)
for (int j=0;j<m->oszlopok;j++){
fscanf(fInput,"%s",&m->matrix[i][j]);
}
fclose(fInput);
return 0;
}
void printmatrix(TMatrix m){
printf("%d %d\n",m.sorok,m.oszlopok);
for (int i=0;i<m.sorok;i++){
for (int j=0;j<m.oszlopok;j++){
printf("%c ",m.matrix[i][j]);
if(j==m.oszlopok-1)
printf("\n");
}
}
}
int indexek(int r, int s, TMatrix m)
{
return (m.oszlopok * r + s);
}
int search(Tvektor *vektor, TMatrix *m)
{
int x = 0, y = 0, darab = 1;
int allapot = FALSE, vege = FALSE;
for(x = 0; x < m->sorok; x++) { // sorokot nezzuk
for(y = 0; y < m->oszlopok; y++) { // oszlopokat nezuk
if(m->matrix[indexek(x, y, *m)] == vektor->szavak[START]) { // ha megegyezik az elso elemmel kezdunk keresni
// az egyses ciklusok bizonyos iranzakat neznek at addig meg nem egyezik
for(darab = 1; darab < vektor->darab; darab++) {
if(x - darab >= 0) { // pohyb na sever
if(m->matrix[indexek((x - darab), y, *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE; // ha egyezik akkor igazat adunk vissza
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
for(darab = 1; darab < vektor->darab; darab++) {
if(x - darab >= 0 && y + darab < m->oszlopok && vege == FALSE) { // kereses eszaknygatra
if(m->matrix[indexek((x - darab), (y + darab), *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE;
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
for(darab = 1; darab < vektor->darab; darab++) {
if(y + darab < m->oszlopok && vege == FALSE) { // nyugat
if(m->matrix[indexek(x, (y + darab), *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE;
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
for(darab = 1; darab < vektor->darab; darab++) {
if(x + darab < m->sorok && y + darab < m->oszlopok && vege == FALSE) { // delnyugat
if(m->matrix[indexek((x + darab), (y + darab), *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE;
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
for(darab = 1; darab < vektor->darab; darab++) {
if(x + darab < m->sorok && vege == FALSE) { //del
if(m->matrix[indexek((x + darab), y, *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE;
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
for(darab = 1; darab < vektor->darab; darab++) {
if(x + darab < m->sorok && y - darab >= 0 && vege == FALSE) { // delnyugat
if(m->matrix[indexek((x + darab), (y - darab), *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE;
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
for(darab = 1; darab < vektor->darab; darab++) {
if(y - darab >= 0 && vege == FALSE) { // nyugat
if(m->matrix[indexek(x , (y - darab), *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE;
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
for(darab = 1; darab < vektor->darab; darab++) {
if(x - darab >= 0 && y - darab >= 0 && vege == FALSE) { // ;eszaknyugat
if(m->matrix[indexek((x - darab) , (y - darab), *m)] == vektor->szavak[darab]) {
allapot = TRUE;
if(darab + 1 == vektor->darab)
vege = TRUE;
} else {
allapot = FALSE;
break;
}
} else {
break;
}
}
if(vektor->darab == 1) { // ha csak egy eleme van igazat adunk vissza
return TRUE;
}
if(vege == TRUE && allapot == TRUE) {
return TRUE;
} else {
allapot = FALSE;
}
}
}
}
printf("%d\n",allapot);
return allapot;
}
int main(){
Tvektor v;
TMatrix m;
matrixbeolvas(&m);
szobeolvas(&v);
search(&v,&m);
return 0;
}
A kód többi része teljesen működőképes, igen tudom, hogy malloc-nál es fopen-nél kellene ellenőrizni..
- 5116 megtekintés
Hozzászólások
"A kód többi része teljesen működőképes, ..."
Ne érts félre, nem a rossz szándék vezérel, de ez a kód gyanúsan NEM működőképes.
Csak néhány probléma, amiket szerintem először kezelni kellene, hogy utána lehessen az algoritmus javítására fókuszálni:
- Ha van rá lehetőség, hagyd el a C-t, C++-ban könnyebb kódolni, főleg kezdőknek.
- Használj CamelCase vagy más hasonló konvenciót a változó- és függvénynevekhez!
Én személy szerint az angol változó elnevezéseket preferálom, de ha a magyarnál maradsz, akkor is kerüld el a cteni és egyéb
olvashatatlan elnevezéseket!
- Az isorok változó egyáltalán definiálva van valahol? Ugye nem egy másik fájlban van deklarálva, amit az include-dal hívsz be?
- Egyáltalán nem látok search függvényt...
- Ellenben a printmatrix függvény csinálna valami hasonlót, de az meg nem vár vektort paraméterként, pluszban a TMatrix paramétert is érték szerint kapja meg, és nem cím szerint.
- A matrixbeolvas és a vektorbeolvas függvények teljesen rosszak (és most nem arra gondolok, hogy fclose előtt van egy return utasítás is ... ), hanem pl. az i ciklusváltozóhoz nem tartozik ciklus ...
Van még pár dolog, de egyelőre szerintem ennyi is elég.
Ha tényleg működő kódot szeretnél, jelezd, melyik részében segítsünk. A matrix es vektor beolvasas pl. egy jó kiinduló feladat lenne, mert ha azok nem mennek, akkor az algoritmusnak nem lesz inputja, amin dolgozzon.
De ha nem akarsz szenvedni a beolvasassal, hasznalj egy - a forraskodban létrehozott - adattal feltöltött mátrixot és vektort, és azon lehetne fejleszteni a kereső algoritmust.
- A hozzászóláshoz be kell jelentkezni
azt hiszem valahova bemasolom akodot, mert egy csomo dolgot nem jelenit meg ami ott van :S
Remélem így jobban átlátható, ki írja a mátrixomat gond nélkül, a szót elmenti a sturkturába, de egyszerűen a keresés ami nem megy
- A hozzászóláshoz be kell jelentkezni
Figyelj, te hogyan is vizsgálod, hogy két szó egyezik?
- A hozzászóláshoz be kell jelentkezni
a for ciklusokban, keresem a legközelebbi egyező karaktereket, de lehet valami oltári baromságot csináltam
- A hozzászóláshoz be kell jelentkezni
Csak gyorsan átfutva nekem is gyanús. Mit tárolsz egy adott [i][j] pontban, mire végzed az egyezést?
(direkt nem is nézek kódot, mondd el magadtól az algoritmust, hogy magad találd meg a hibát, az célravezetőbb)
- A hozzászóláshoz be kell jelentkezni
Nekem kicsit házi feladat gyanús a téma.
- A hozzászóláshoz be kell jelentkezni
És?
Nem kész megoldást vár egy kódsor megírása nélkül.
- A hozzászóláshoz be kell jelentkezni
Igen, de innentől kezdve az "állj át c++-ra/javara, stb." tanácsok, amik kb. harmadik kommentben elő szoktak jönni nem alkalmazhatóak.
- A hozzászóláshoz be kell jelentkezni