infoarena

infoarena - concursuri, probleme, evaluator, articole => Teme => Subiect creat de: George Alexandru din Ianuarie 08, 2014, 01:40:31



Titlul: Spanzuratoarea
Scris de: George Alexandru din Ianuarie 08, 2014, 01:40:31
Am de facut o problema care simuleaza jocul de spanzuratoarea
cerinta suna cam asa

Input: un fisier care sa contina x cuvinte, x nu va fi in fisier si numarul maxim de incercari pe care il acceptati pana la terminarea jocului.

Alegeti random un cuvant, de la tastatura introduceti cate un caracter, daca acel caracter nu se afla in cuvant se va afisa un mesaj corespunzator, in caz contrar cuvantul obtinut dupa completarea caracterului.


problema functioneaza aproximativ...adica daca introduc o litera de la tastatura o sa imi arate ceva de genul

Tasteaza litera care crezi ca se afla in cuvant: a

m o _ _ o
Tasteaza litera care crezi ca se afla in cuvant:
Litera aceasta nu se afla in cuvant
m o _ _ o
Tasteaza litera care crezi ca se afla in cuvant:

Cand spune a doua oara "Tasteaza litera care crezi ca se afla in cuvant:" pur si simplu programul sare de parca am introdus un enter sau altceva,dar a treia oara "Tasteaza litera care crezi ca se afla in cuvant:" merge si se tot repeta pana se termina numarul de greseli sau pana gasesc cuvantul....O sa postez codul

Cod:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

FILE *f;

int main()
{
     char s[25],copie[25],litera;
     int x,nr=0,i,aux=0,ok,gasit_odata,nrgreseli;
     f=fopen("fisier.txt","r");

     //testam fisierul daca e vid

     if(f!=NULL)
            printf("Fisier deschis cu succes");
     else printf("Fisierul nu s-a deschis cu succes");

     //Gasim numarul de gresi permise

     while(fgets(s,25,f)!=NULL)
            nr++;
     int y=atoi(s);
     nrgreseli=y;
     printf("\n Numarul greseli maxime este %d",nrgreseli);
     fclose(f);

     //generam random un x care va fi cuvantul de ghicit

     x=rand()%(nr-1);

     //gasim cuvantul x in fisier
     f=fopen("fisier.txt","r");
     aux=1;
     while(fgets(s,25,f)!=NULL)
     {
         if(aux==x)
            break;
         else
            aux++;
     }

     //Creem copia cuvantului pentru apartii

     for(i=0;i<strlen(s)-1;i++)
        copie[i]=s[i];

     //Printez pe ecran cuvantul in faza originala

     aux=0;
     printf("\n");
     for(i=0;i<strlen(s)-1;i++)
     {
          if(i==0)
          {
              printf(" %c",s[i]);
              copie[i]='0';
              aux++;
          }
          else
            if(i==strlen(s)-2)
            {
                printf(" %c",s[strlen(s)-2]);
                copie[i]='0';
                aux++;
            }
          else
            if(s[i]==s[0] || s[i]==s[strlen(s)-2])
            {
                printf(" %c",s[i]);
                copie[i]='0';
                aux++;
            }
          else
            printf(" _ ");
     }

     // Programul de introducere a literelor

     while(aux<=strlen(s)-2 && nrgreseli>0)
     {
         printf("\n Tasteaza litera care crezi ca se afla in cuvant: ");
         scanf("%c",&litera);
         ok=0;
         gasit_odata=0;
         for(i=0;i<strlen(s)-1;i++)
         {
             if(aux<=strlen(s)-2 && nrgreseli>0 && litera==s[i] && copie[i]!='0')
             {
                    copie[i]='0';
                    aux++;
                    ok=1;
             }
             if(aux<=strlen(s)-2 && nrgreseli>0 && litera==s[i] && copie[i]=='0')
                    gasit_odata=1;
         }
         if(ok==1)
            printf("\n Felicitari ai gasit o litera ce apartine cuvantului");
         else
         {
            printf("\n Litera aceasta nu se afla in cuvant ");
            nrgreseli--;
         }
         if(gasit_odata==1)
                printf("\n Litera aceasta ai mai introduso odata sau se afla deja in cuvant");

         printf("\n");
         for(i=0;i<strlen(s)-1;i++)
            if(copie[i]=='0')
                printf(" %c",s[i]);
            else
                printf(" _ ");
     }
     if(nrgreseli>0)
        printf("\n Felicitari ai gasit cuvantul");
     else
            printf("\n Imi pare rau dar ai prea multe incercari");

     return 0;


Titlul: Răspuns: Spanzuratoarea
Scris de: George Marcus din Ianuarie 08, 2014, 12:34:36
Probabil ramane caracterul '\n' (newline) in buffer. Ai putea sa fortezi scoaterea acestuia citit asa scanf("%c\n",&litera). Dar tot o sa ai probleme daca introduci mai multe caractere. Ar fi ok sa citesti toata linia cu fgets si iei doar prima litera.


Titlul: Răspuns: Spanzuratoarea
Scris de: George Alexandru din Ianuarie 08, 2014, 14:47:52
Multumesc de raspuns stiu ca o sa am probleme daca introduc mai multe caractere dar eu vroiam sa introduc doar unul a si cum mi-ai zis tu nu a mers...dar daca am pus scanf("\n%c",&litera a mers),oricum daca nu era pentru raspunsul tau nu imi dadeam seama