[c] Rozpoznawanie napisów.

Awatar użytkownika
Andrzejmm
Użytkownik
Użytkownik
Posty: 187
Rejestracja: 19 lis 2006, o 16:24
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 58 razy
Pomógł: 13 razy

[c] Rozpoznawanie napisów.

Post autor: Andrzejmm »

Kod: Zaznacz cały

#include <stdio.h>
main(){
  int tw[9][2]={{'a','1'},{'a','2'},{'a','3'},{'b','1'},{'b','2'},{'b','3'},{'c','1'},{'c','2'},{'c','3'}};
  int i=0,j,w,k=1;
  int wcz[2]={0,0};
  while(wcz[0]!='q'){
     wcz[0]=getchar();
     wcz[1]=getchar();
     
     while(i<9){
       if(wcz[0]==tw[i][0] && wcz[1]==tw[i][1]){w=i; printf("%d\n",w);}
       i++;
    }
     /* printf("%d",w);*/
      i=0;
}
}
Program ma wypisać na standardowym wyjściu indeks tablicy tw, który określa umiejscowienie ciągu 2 pierwszych znaków wprowadzonych na standardowe wejście. Chodzi o ciąg postaci:
\(\displaystyle{ AB \vee ABq,\ gdzie\ A\in\{a,b,c\},\ B\in\{1,2,3\}}\)
Niestety po uruchomieniu program raz wypisuje iterator a raz nie. Gdzie tkwi błąd?
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[c] Rozpoznawanie napisów.

Post autor: Szemek »

znaki powinny być w tablicy char, a nie w int

przynajmniej od tego osobiście bym zaczął
Awatar użytkownika
Andrzejmm
Użytkownik
Użytkownik
Posty: 187
Rejestracja: 19 lis 2006, o 16:24
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 58 razy
Pomógł: 13 razy

[c] Rozpoznawanie napisów.

Post autor: Andrzejmm »

Wprowadziłem zmiany:

Kod: Zaznacz cały

#include <stdio.h>
main(){
  char tw[9][2]={{'a','1'},{'a','2'},{'a','3'},{'b','1'},{'b','2'},{'b','3'},{'c','1'},{'c','2'},{'c','3'}};
  int i=0,j,w,k=1;
  char wcz[2]={'0','0'};
  while(wcz[0]!='q'){
    scanf("%c",&wcz[0]);
    scanf("%c",&wcz[1]);
     
     while(i<9){
       if(wcz[0]==tw[i][0] && wcz[1]==tw[i][1]){w=i; printf("%d\n",w);}
       i++;
    }
     /* printf("%d",w);*/
      i=0;
}
}
Problem zostaje.
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] Rozpoznawanie napisów.

Post autor: smiechowiec »

Może przeczyścić bufor klawiatury po odczycie zmiennych np.

Kod: Zaznacz cały

#include <stdio.h>

int main(){
  char tw[9][2] = {
    {'a', '1'}, {'a', '2'}, {'a', '3'},
    {'b', '1'}, {'b', '2'}, {'b', '3'},
    {'c', '1'}, {'c', '2'}, {'c', '3'}};
  int i = 0;
  char wcz[2] = {'0', '0'};
  
  while(wcz[0] != 'q') {
    printf("\nPodaj litere (q - koniec) ");    scanf("%c", &wcz[0]);    fflush(stdin);
    printf("\nPodaj cyfre ");    scanf("%c", &wcz[1]);    fflush(stdin);
    printf("\nWybrano %c %c\n", wcz[0], wcz[1]);
     
     while (i < 9) {
       if (wcz[0]==tw[i][0] && wcz[1]==tw[i][1]) {
         printf("%d\n", i);
       }
       i++;
    }
      i = 0;
  }
  return 0;
} 
Awatar użytkownika
Andrzejmm
Użytkownik
Użytkownik
Posty: 187
Rejestracja: 19 lis 2006, o 16:24
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 58 razy
Pomógł: 13 razy

[c] Rozpoznawanie napisów.

Post autor: Andrzejmm »

Skompilowałem ten program. Omija podanie cyfry. Tzn wypisuje komunikat podaj cyfrę ale nie pozwala mi jej wpisać.

[ Dodano: 14 Stycznia 2008, 18:31 ]
A czy ten mój program u innych działa dobrze?
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] Rozpoznawanie napisów.

Post autor: smiechowiec »

Nie wiem czy zwróciłeś uwagę, że kod, który podałem to Twój program program, przedzielony jedynie napisami aby było jasne co się dzieje i czyszczeniem bufora klawiatury.
Awatar użytkownika
Andrzejmm
Użytkownik
Użytkownik
Posty: 187
Rejestracja: 19 lis 2006, o 16:24
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 58 razy
Pomógł: 13 razy

[c] Rozpoznawanie napisów.

Post autor: Andrzejmm »

To może pokażę o co mi chodziło:

Kod: Zaznacz cały

andrzej@prywatny:~$ cc m.c
andrzej@prywatny:~$ ./a.out

Podaj litere (q - koniec) a

Podaj cyfre 
Wybrano a 


Podaj litere (q - koniec) a

Podaj cyfre 
Wybrano a 


Podaj litere (q - koniec) q

Podaj cyfre 
Wybrano q 

andrzej@prywatny:~$ 

Jak podam a to odrazu mnie przenosi do nastepnego podaj literę.
Wiem oczywiście, że to mój program.
Może to w nim tkwi błąd. Próbowałem wyłapać i nic.
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] Rozpoznawanie napisów.

Post autor: smiechowiec »

Sprawdziem pobieranie zarówno przez funkcję gets("%c", ..) jak i getchar() i obie niestety nie radzą sobie ze znakiem końca lini, w zalezności od terminala trzeba czyścić bufor, albo ponownie wywołać getchar().
Proponuje więc najprosztszą funckcję gets, która nie jest idealna, ale w tym przypoadku chyba najłatwiej da nam oczywkiwany wynik. Musiałem w związku z tym zwiększyć byfor wcz o 1 znak aby dało się dopisać tam znak 0.

Kod: Zaznacz cały

#include <stdio.h> 

int main(){ 
  char tw[9][2] = { 
    {'a', '1'}, {'a', '2'}, {'a', '3'}, 
    {'b', '1'}, {'b', '2'}, {'b', '3'}, 
    {'c', '1'}, {'c', '2'}, {'c', '3'}}; 
  int i = 0; 
  char wcz[] = "00"; 
  
  while(wcz[0] != 'q') { 
    printf("\nPodaj litere (q - koniec) ");  gets(&wcz[0]);
    if (wcz[0] != 'q') {
      printf("\nPodaj cyfre ");    gets(&wcz[1]);
      printf("\nWybrano %c %c\n", wcz[0], wcz[1]); 
       while (i < 9) { 
         if (wcz[0]==tw[i][0] && wcz[1]==tw[i][1]) { 
           printf("Jest to pozycja nr %d\n", i + 1); 
         } 
         i++; 
      } 
      i = 0; 
    }
  }
  return 0; 
} 
Właściwie to można by bardzioej elegancko podać od razu oba elementy tzn zamiast
printf("\nPodaj litere (q - koniec) "); gets(&wcz[0]);
printf("\nPodaj cyfre "); gets(&wcz[1]);
dać od razu
printf("\nPodaj jedna litere i jedna cyfre (q - koniec) "); gets(wcz);
i od razu mamy w zmiennej wczs to o co nam chodzi.
Podajemy np b1.
Ostatecznie kod wyglądał by tak

Kod: Zaznacz cały

#include <stdio.h> 

int main(){ 
  char tw[9][2] = { 
    {'a', '1'}, {'a', '2'}, {'a', '3'}, 
    {'b', '1'}, {'b', '2'}, {'b', '3'}, 
    {'c', '1'}, {'c', '2'}, {'c', '3'}}; 
  int i = 0; 
  char wcz[] = "00"; 
  
  while(wcz[0] != 'q') { 
    printf("\nPodaj jedna litere i jedna cyfre (q - koniec) ");  gets(wcz);
    if (wcz[0] != 'q') {
      printf("\nWybrano %s\n", wcz); 
       while (i < 9) { 
         if (wcz[0]==tw[i][0] && wcz[1]==tw[i][1]) { 
           printf("Jest to pozycja nr %d\n", i + 1); 
         } 
         i++; 
      } 
      i = 0; 
    }
  }
  return 0; 
} 
ODPOWIEDZ