Skocz do zawartości
Mac'

[c]mastermind

Rekomendowane odpowiedzi

otóż pisze program na laborki z infy. Mianowicie masterminda co zgadujesz tam 4 cyfry z zakresu 1-6. Losowane 3ema różnymi metodami. Problem pojawia się przy wczytywaniu odpowiedzi(pierwsze wpisanie odpowiedzi jest ograniczone do naciśniecia jakiegokolwiek klawisza), oraz przy sprawdzaniu wpisanej odpowiedzi(mianowicie nie chce mi sprawdzać pierwszej cyfry). Przypuszczam że są tam jakieś głupie błędy których sam nie potrafię znaleźć.

#include <stdio.h>#include <stdlib.h>#include <string.h>void random(char *tab);void skreslanie(char *tab);void tasowanie(char *tab);int main(){ unsigned short int i,flag=1,kontrola=0;  int wynik[2]={0}; char tab[4],buf[4]; int wybor;  printf("Wybierz jedna z 3 metod(wpisujac 1,2 lub 3:)"); 	 while(flag==1){ 	scanf("%d",&wybor);  	switch(wybor){ 	case 1: random(tab); flag=0; break; 	case 2: skreslanie(tab); flag=0; break; 	case 3: tasowanie(tab);flag=0; break; 	default: printf("Wprowadz liczbe od 1 do 3!!"); flag=1; break;  	} 	 	} 	 for(i=0;i<4;i++){ 	printf("%c", tab[i]); 	} 	 printf("Wpisz 4 niepowtarzajace sie cyfry z zakresu 1-6:"); flag=1;  while(flag==1){ 	 	gets(buf);//tutaj nie chce wczytac za pierwszym razem potem jest ok 	kontrola++; 	sprawdz(tab, buf, wynik); 	if (kontrola>=10) {printf("Przegrales!!"); break;}; 	if(wynik[0]==99) printf("Wprowadz tylko cyfry z zakresu 1-6!!\n");  	else if (wynik[1]==4) {printf("Gratulacje wygrałeś!!\n"); break;} 	 	else if (wynik[1]!=4&&wynik[0]!=99) printf("Trafiles %d cyfr a %d bylo na poprawnych miejscach\n", wynik[0],wynik[1]);//laj sie pojawia jak nie powinno?? 	 	 	} 	 system("pause"); 	 return 0; 	 }void random(char *tab)//bangla{	unsigned short int i,m;	int x;	char cyfry[6]={'1','2','3','4','5','6'};	srand(time(0)); 	x=(rand()%6); 		for(i=0;i<4;i++){ 	 	x=(rand()%6); 	 	tab[i]=cyfry[x]; 	for(m=0;m<i;m++){ 	 	if (tab[i]==tab[m]) i--; 	 	} 	} 	} void skreslanie(char *tab)//dziala{ char cyfry[6]={'1','2','3','4','5','6'};  int x; unsigned short int i,m; srand(time(0)); for (i=0;i<2;i++){ 	x=(rand()%6); 	 	cyfry[x]='0'; 	 	} for (i=0, m=0;i<4;m++){ 	if(cyfry[m]!='0'){tab[i]=cyfry[m];i++;} 	}} 	void tasowanie(char *tab)//dziala{ unsigned short int i,r; char temp; srand(time(0)); char cyfry[6]={'1','2','3','4','5','6'}; for (i=0; i<=(6-1); i++) { 	r = i + (rand() % (6-i));  	temp = cyfry[i]; cyfry[i] = cyfry[r]; cyfry[r] = temp; 	} for(i=0;i<4;i++){tab[i]=cyfry[i];}}void sprawdz(char *tab,char *odpowiedz,int *wynik)//wynik[1]=dobre na popr miejscach wynik[0]=trafione cyfry{		int i,j,flag=0;	wynik[0]=0;	wynik[1]=0;	int k=0,g=0;	char n='0',m='6' ;	for(i=0;i<4;i++){ 	if (odpowiedz[i]<n||odpowiedz[i]>m) {printf("Wprowadz cyfry od 1-6!!\n");flag=1; wynik[0]=99; break;}	 	} 		if (flag==0){ 	//nie sprawdza pierwszej cyfry 	 	for(i=0;i<5;i++){ 	if(odpowiedz[i]==tab[i]) k++; 	 	j=0; 	 	while(j<i){ 	if(odpowiedz[i]==tab[j]){printf("czesc git%d",j); g++;}; 	j++; 	} 	 	} 	 	} 		wynik[1]=k;	wynik[0]=g; 	}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dodaj sobie funkcje czyszczącą bufor, np.

 

fflush(stdin);

printf("Wpisz 4 niepowtarzajace sie cyfry z zakresu 1-6:");

 

Tak przeglądnąłem Twoje posty bo temat programu się wydawał znajomy i faktycznie zajęcia z infy na AiR 1 rok AGH :D.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znowu muszę prosić o pomoc. Chodzi o wygenerowanie ciągu niepowtarzających się liczb. zakres w kodzie jest przykładowy. Jednak o ile funkcja next ładnie generuje ciągi ale z powtarzającymi się cyframi, to jak chce sprawdzić je za pomoca powt to się zaczynają schody. I wychodzi lk+1 jakieś jedynki i w zależności od ilości przebiegów na ostatnich miejscach różne liczby(czasami większe od lk). Myśle nad tym od wczoraj a dalej nie mogę wymyślić co źle robie.

#include <stdio.h>#include <stdlib.h>int next(int *gen,int dk,int lk);int powt(int *tab,int dk);int main(){  int i,dk=6,lk=8,j, tab[6]={1,2,3,4,5,5}; for(i=0;i<lk;i++){ 	 	next(tab,dk,lk); 	 	for(j=0;j<dk;j++) { 	 	printf("%d ",tab[j]); 	 	 	} 	printf("\n"); 	} system("PAUSE");	 return 0;}int next(int *gen,int dk,int lk){	int i,j;		do{ 	 	gen[dk-1]++; 	 	for(i=dk-1;i>0;i--){ 	if(gen[i]>lk){gen[i-1]++;gen[i]=1;}  	if(gen[0]>lk) return 0; 	 	} 	 	}while(powt(gen,dk)); return 1; 	} int powt(int *gen,int dk){	int i,m;	for(i=0;i<dk;i++){ 	for(m=0;m<dk;m++){ 	if(gen[i]==gen[m]) return 1; 	} 	} 	return 0; 	}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Losowanie randomem bez powtórzeń mam. Teraz program z pierwszego postu wyewoluował do tworu który może kazać Ci zgadnąć kod z dowolnej ilości liczb i dowolnej długości. Teraz się biedze nad tym jak go zmusić by zgadł mój kod. I mam problem, bo IMO powinno banglać a cosik się psuje jak chce by generował Mi ciąg liczb ale bez powtórzeń. Jak wywale do{}while to działa jak należy czyli generuje kolejne ciągi z powtórzeniami.

Edytowane przez Mac'

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...