Pomoc w poprawieniu programu

damian3k

Nowicjusz
Dołączył
24 Styczeń 2013
Posty
1
Punkty reakcji
0
Polecenie:**foo** Napisać program w C, który wybierze przypadkową kombinację pięciu cyfr zawartych między 1 a 8 i poprosi użytkownika o jej odgadniecie. po każdej próbie program poda:
-liczbę dobrych cyfr na właściwym miejscu;
-liczbę dobrych cyfr na złym miejscu.
gracz będzie podawał każdą ze swoich prób w postaci pięciu cyfr bez odstępów i zakończy ją naciśnięciem klawisza ENTER.
Program powinien obsługiwać niepoprawne odpowiedzi,takie jak wprowadzenie liter zamiast cyfry, za dużo lub za mało cyfr, zła liczba (cyfry 9 lub 0). Należy przewidzieć graniczną liczbę prób, po której program zatrzyma się, podając kombinację, którą trzeba było zgadnąć.

Kto poprawi by poprawnie zliczało cyfry złym miejscu oraz doda komentarz "Ciąg znaków nie poprawny"gdy wpisze się litery lub 0,9 i żeby program wyświetlał komunikat o zbyt długim/krótkim wpisanym ciągu znaków


Kod:
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// losuj liczbe z przedzialu i wpisz do tablicy, zwroc tablice
int* losuj(int x, int y, int n)
{
    int *tab = (int*) malloc (n);
    int i = 0;
    for(i=0; i<n; i++)
    {
	    tab[i] = (rand() %( y - x + 1 ) + x);
    }
    return tab;
}
// wypisuje na ekran tablice o danym rozmiarze
void pokazTablice(int *tab, int n)
{
    int i;
    for(i=0; i<n; i++)
	    printf("tab[%d] = %d\n", i, tab[i]);
}
// funkcja sprawdza, czy w podanej tablicy jest dana liczba,
// jesli jest, zwraca true, jesli nie, zwraca false
bool sprawdzCzyJest(int *tab, int liczba, int n)
{
    int i;
    for(i=0; i<n; i++)
    {
	    if(tab[i] == liczba)
		    return true;
    }
    return false;
}
// program sprawdza, ile jest liczb w podanej tablicy.
// ktore dokladnie pasuja do wylosowanej tablicy,
// zwraca liczbe dobrych cyfr na wlasciwym miejscu
int sprawdzIleDokladniePasuje(int *tab, int *odgadniety, int n)
{
    int i, ileDokladniePasuje = 0;
    for(i=0; i<n; i++)
    {
	    if(tab[i] == (odgadniety[i]))
		    ileDokladniePasuje += 1;
    }
    return ileDokladniePasuje;
}
// sprawdz, ile niedokladnie pasuje, funkcja
// zwraca liczbe dobrych cyfr na zlym miejscu
int sprawdzIleNiedokladniePasuje(int *tab, int *odgadniety, int n)
{
    int i,j, ileNiedokladniePasuje = 0;
    int t[n];
    int k;
    for(i=0; i<n; i++)
    {
	    for(j=0; j<n; j++)
	    {
		    // jesli liczby sa takie same w odgadnietym ciagu i
		    // wylosowanym, ale niekoniczenie na tej samej pozycji oraz
		    // jesli nie ma takiej liczby jeszcze uwzglednionej ...
		    if(tab[i] == (odgadniety[j]) && !(sprawdzCzyJest(t, tab[i], n)))
		    {
			    // .. uwzglednij ta liczbe oraz ...
			    t[j] = tab[i];
			    // ... zwieksz ilosc niedokladnie pasujacych liczb
			    ileNiedokladniePasuje += 1;
		    }
	    }
    }
    // zwroc ilosc niedokladnie pasujacych liczb
    return ileNiedokladniePasuje;
}
int main(int argc, char **argv) {
    // inicjalizuj generator pseudolosowy
    srand(time(NULL));
    // rozmiar tablicy - ilosc cyfr do wczytania
    const int n = 5;
    // losuj do tablicy n liczb z przedzialu [1,8]
    int *t = losuj(1, 8, n);
    // pomocnicza tablica
    int t2[n];
    // maksymalna ilosc prob
    const int maxProb = 20;
    // licznik prob
    int ile = 0;
    // ile wczytano
    int scanfReturned = 0;
    // tablica z odgadnietymi liczbami
    char odgadniete[n];
    // maksymalna ilosc prob
    while(ile < maxProb)
    {
	    int i;
	    printf("Podaj %d liczb, jedna po drugiej (z przedzialu [1,8]):\n\n", n);
	    int good = 1;
	    do{
		    // jesli zmieniamy n, musimy zmienic tez liczbe przy s w scanf! inaczej nie zadziala
		    scanfReturned = scanf("%5s", odgadniete);
		    for(i = 0; i < n; i++) {
			    if((odgadniete[i] >= '1' && odgadniete[i] <= '8') == 0) {
				    good = 0;
				    i = 0;
				    break;
			    }
			    good = 1;
		    }
	    }while(good == 0);
	    int k;
	    for(k=0;k<n;k++)
		    t2[k] = odgadniete[k] - '0';
	    //pokaz ile pasuje, a ile nie
	    int dokladnie = sprawdzIleDokladniePasuje(t, t2, n);
	    int niedokladnie = sprawdzIleNiedokladniePasuje(t, t2, n);
	    ile += 1;
	    if(dokladnie == n)
	    {
		    printf("\nWygrales za %d razem!:-)\n\n", ile);
		    break;
	    }
	    printf("Dokladnie pasuje %d liczb, niedokladnie pasuje %d liczb. Pozostalo %d prob.\n\n", dokladnie, niedokladnie, maxProb-ile);
    }
    printf("Wylosowany kod: \t");
    int m;
    for(m=0; m<n; m++)
	    printf("%d", t[m]);
    printf("\n");
    return 0;
}
 
Do góry