Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2008, 14:01   #1
Al3x
 
Регистрация: 20.12.2008
Сообщений: 6
Восклицание Помогите доделать код!

Задали на дом написать код игры крестики-нолики на языке Си! Код - сделал, но проблема в том, что когда вместо числа вводишь буву или символ - прога начинает глючить!
Сказали сделать условие по средствам операции if, чтоб можно было вводить только цифры от 1 до 9, а когда вводишь символ - было бы сообщение что "символ некорректен - введите число от 1 до 9"
Так вот - я не знаю как это условие сделать! Помогите пожалуйста!
Заранее благодарен!

Вот мой код:
Код:
//---------------------------------------------------------------------------

#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[]){
	int a=0,b=0,c=0,d=1,e=0,q=0,h[3][3];
	printf("Pravila igri:\n1) Vvodite tolko simvoli ot 1 do 9!\n2) Viigrivaer tot, kto vistroit tri svoih simvola v ryad\n3) Nel'zya stavit' simvol tuda, gde on uge stoit\n\n");
	d:
	printf("| 1 || 2 || 3 |\n| 4 || 5 || 6 |\n| 7 || 8 || 9 |\n");
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			h[a][b]=35;
			d++;
		}
		printf("\n");
	}
	a:
	printf("\nVvedite nomer, gde budet X: ");
	scanf("%d",&c);
	switch(c)
	{
		case 1: if(h[0][0]==35)	  h[0][0]=88; else goto a; break;
		case 2: if(h[0][1]==35)	  h[0][1]=88; else goto a; break;
		case 3: if(h[0][2]==35)	  h[0][2]=88; else goto a; break;
		case 4: if(h[1][0]==35)   h[1][0]=88; else goto a; break;
		case 5: if(h[1][1]==35)   h[1][1]=88; else goto a; break;
		case 6: if(h[1][2]==35)   h[1][2]=88; else goto a; break;
		case 7: if(h[2][0]==35)   h[2][0]=88; else goto a; break;
		case 8: if(h[2][1]==35)   h[2][1]=88; else goto a; break;
		case 9: if(h[2][2]==35)   h[2][2]=88; else goto a; break;
		default: goto a;
	};
	for(d=0;d<3;d++)
	{
		if (h[d][0]+h[d][1]+h[d][2]==264){goto f;}
		if (h[0][d]+h[1][d]+h[2][d]==264){goto f;}
		if (h[0][0]+h[1][1]+h[2][2]==264){goto f;}
		if (h[2][0]+h[1][1]+h[0][2]==264){goto f;}
	}
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			if (h[a][b]==35) e=h[a][b];
			printf("| %c |",h[a][b]);
		}
		printf("\n");
	}
	if (e==0) goto e;
	e=0;
	b:
	printf("\nVvedite nomer, gde budet 0: ");
	scanf("%d",&c);
	switch(c)
	{
		case 1: if(h[0][0]==35)	h[0][0]=79; else goto b; break;
		case 2: if(h[0][1]==35)	h[0][1]=79; else goto b; break;
		case 3: if(h[0][2]==35)	h[0][2]=79; else goto b; break;
		case 4: if(h[1][0]==35)	h[1][0]=79; else goto b; break;
		case 5: if(h[1][1]==35)	h[1][1]=79; else goto b; break;
		case 6: if(h[1][2]==35)	h[1][2]=79; else goto b; break;
		case 7: if(h[2][0]==35)	h[2][0]=79; else goto b; break;
		case 8: if(h[2][1]==35)	h[2][1]=79; else goto b; break;
		case 9: if(h[2][2]==35)	h[2][2]=79; else goto b; break;
		default: goto b;
	}
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			printf("| %c |",h[a][b]);
		}
		printf("\n");
	}
	for(d=0;d<4;d++)
	{
		if (h[d][0]+h[d][1]+h[d][2]==237){goto f;}
		if (h[0][d]+h[1][d]+h[2][d]==237){goto f;}
		if (h[0][0]+h[1][1]+h[2][2]==237){goto f;}
		if (h[2][0]+h[1][1]+h[0][2]==237){goto f;}
		goto a;
	}
	getchar();
	f:
	printf("Ty viigral!\n");
	getchar();
	printf("Hochesh opat' sigrat'?   Yes(1) / No(2)\n");
	scanf("%d",&q);
	if(q==1) goto d;
	goto c;
	e:
	printf("Nichya!");
	getchar();
	c:
	return 0;
}
//---------------------------------------------------------------------------
Al3x вне форума Ответить с цитированием
Старый 20.12.2008, 23:12   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

это сообщение можно прописать в ветке default

Код:
default: printf("%s","not num");
	          getch();goto a;
через if это можно сделать так

Код:
printf("\nVvedite nomer, gde budet X: ");
          scanf("%d",&c);
          
           if(c<1 || c>9)

              {
                  printf("%s","not num");
	       getch();
                  goto a;
               }
а еще есть функция isdigit(int ch) в ctype.h, которая возвращает 0 если введенный символ не является цифрой от 0 до 9
counter вне форума Ответить с цитированием
Старый 21.12.2008, 17:39   #3
Al3x
 
Регистрация: 20.12.2008
Сообщений: 6
По умолчанию

Спасибо огромное!
Al3x вне форума Ответить с цитированием
Старый 21.12.2008, 21:10   #4
Al3x
 
Регистрация: 20.12.2008
Сообщений: 6
По умолчанию

Блин! Сделал так, но теперь ошибка вылазит если вместо цифры ввести несколько символов! =(
Код:
//---------------------------------------------------------------------------

#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[]){
	int a=0,b=0,c=0,d=1,e=0,q=0,h[3][3];
	printf("Pravila igri:\n1) Vvodite tolko simvoli ot 1 do 9!\n2) Viigrivaer tot, kto vistroit tri svoih simvola v ryad\n3) Nel'zya stavit' simvol tuda, gde on uge stoit\n\n");
	d:
	printf("| 1 || 2 || 3 |\n| 4 || 5 || 6 |\n| 7 || 8 || 9 |\n");
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			h[a][b]=35;
			d++;
		}
		printf("\n");
	}
	a:
	printf("\nVvedite nomer, gde budet X: ");
	scanf("%d",&c);
	if(c<1 || c>9)
    {
        printf("%s","Vvedenniy simvol ne verniy!");
        getchar();
        goto a;
    }
	switch(c)
	{
		case 1: if(h[0][0]==35)	  h[0][0]=88; else goto a; break;
		case 2: if(h[0][1]==35)	  h[0][1]=88; else goto a; break;
		case 3: if(h[0][2]==35)	  h[0][2]=88; else goto a; break;
		case 4: if(h[1][0]==35)   h[1][0]=88; else goto a; break;
		case 5: if(h[1][1]==35)   h[1][1]=88; else goto a; break;
		case 6: if(h[1][2]==35)   h[1][2]=88; else goto a; break;
		case 7: if(h[2][0]==35)   h[2][0]=88; else goto a; break;
		case 8: if(h[2][1]==35)   h[2][1]=88; else goto a; break;
		case 9: if(h[2][2]==35)   h[2][2]=88; else goto a; break;
		default: goto a;
	};
	for(d=0;d<3;d++)
	{
		if (h[d][0]+h[d][1]+h[d][2]==264){goto f;}
		if (h[0][d]+h[1][d]+h[2][d]==264){goto f;}
		if (h[0][0]+h[1][1]+h[2][2]==264){goto f;}
		if (h[2][0]+h[1][1]+h[0][2]==264){goto f;}
	}
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			if (h[a][b]==35) e=h[a][b];
			printf("| %c |",h[a][b]);
		}
		printf("\n");
	}
	if (e==0) goto e;
	e=0;
	b:
	printf("\nVvedite nomer, gde budet 0: ");
	scanf("%d",&c);
	if(c<1 || c>9)
    {
        printf("%s","Vvedenniy simvol ne verniy!");
        getchar();
        goto a;
    }
	switch(c)
	{
		case 1: if(h[0][0]==35)	h[0][0]=79; else goto b; break;
		case 2: if(h[0][1]==35)	h[0][1]=79; else goto b; break;
		case 3: if(h[0][2]==35)	h[0][2]=79; else goto b; break;
		case 4: if(h[1][0]==35)	h[1][0]=79; else goto b; break;
		case 5: if(h[1][1]==35)	h[1][1]=79; else goto b; break;
		case 6: if(h[1][2]==35)	h[1][2]=79; else goto b; break;
		case 7: if(h[2][0]==35)	h[2][0]=79; else goto b; break;
		case 8: if(h[2][1]==35)	h[2][1]=79; else goto b; break;
		case 9: if(h[2][2]==35)	h[2][2]=79; else goto b; break;
		default: goto b;
	}
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			printf("| %c |",h[a][b]);
		}
		printf("\n");
	}
	for(d=0;d<4;d++)
	{
		if (h[d][0]+h[d][1]+h[d][2]==237){goto f;}
		if (h[0][d]+h[1][d]+h[2][d]==237){goto f;}
		if (h[0][0]+h[1][1]+h[2][2]==237){goto f;}
		if (h[2][0]+h[1][1]+h[0][2]==237){goto f;}
		goto a;
	}
	getchar();
	f:
	printf("Ty viigral!\n");
	getchar();
	printf("Hochesh opat' sigrat'?   Yes(1) / No(2)\n");
	scanf("%d",&q);
	if(q==1) goto d;
	goto c;
	e:
	printf("Nichya!");
	getchar();
	c:
	return 0;
}
//---------------------------------------------------------------------------
Al3x вне форума Ответить с цитированием
Старый 21.12.2008, 21:29   #5
Al3x
 
Регистрация: 20.12.2008
Сообщений: 6
По умолчанию

или например если вводить симворы и числа в переммешку - например: fgd5d5fgdf564ad541v1 dr fds45gs - прога тоже виснет! =(
Вот второй вариант:
Код:
//---------------------------------------------------------------------------

#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[]){
	int a=0,b=0,c=0,d=1,e=0,q=0,h[3][3];
	printf("Pravila igri:\n1) Vvodite tolko simvoli ot 1 do 9!\n2) Viigrivaer tot, kto vistroit tri svoih simvola v ryad\n3) Nel'zya stavit' simvol tuda, gde on uge stoit\n");
	d:
	printf("\n| 1 || 2 || 3 |\n| 4 || 5 || 6 |\n| 7 || 8 || 9 |\n");
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			h[a][b]=35;
			d++;
		}
		printf("\n");
	}
	a:
	printf("\nVvedite nomer, gde budet X: ");
	scanf("%d",&c);
	switch(c)
	{
		case 1: if(h[0][0]==35)	  h[0][0]=88; else goto a; break;
		case 2: if(h[0][1]==35)	  h[0][1]=88; else goto a; break;
		case 3: if(h[0][2]==35)	  h[0][2]=88; else goto a; break;
		case 4: if(h[1][0]==35)   h[1][0]=88; else goto a; break;
		case 5: if(h[1][1]==35)   h[1][1]=88; else goto a; break;
		case 6: if(h[1][2]==35)   h[1][2]=88; else goto a; break;
		case 7: if(h[2][0]==35)   h[2][0]=88; else goto a; break;
		case 8: if(h[2][1]==35)   h[2][1]=88; else goto a; break;
		case 9: if(h[2][2]==35)   h[2][2]=88; else goto a; break;
		default: printf("%s","Vvedenniy simvol ne verniy!");
        	getchar();
        	goto a;
	};
	for(d=0;d<3;d++)
	{
		if (h[d][0]+h[d][1]+h[d][2]==264){goto f;}
		if (h[0][d]+h[1][d]+h[2][d]==264){goto f;}
		if (h[0][0]+h[1][1]+h[2][2]==264){goto f;}
		if (h[2][0]+h[1][1]+h[0][2]==264){goto f;}
	}
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			if (h[a][b]==35) e=h[a][b];
			printf("| %c |",h[a][b]);
		}
		printf("\n");
	}
	if (e==0) goto e;
	e=0;
	b:
	printf("\nVvedite nomer, gde budet 0: ");
	scanf("%d",&c);
	switch(c)
	{
		case 1: if(h[0][0]==35)	h[0][0]=79; else goto b; break;
		case 2: if(h[0][1]==35)	h[0][1]=79; else goto b; break;
		case 3: if(h[0][2]==35)	h[0][2]=79; else goto b; break;
		case 4: if(h[1][0]==35)	h[1][0]=79; else goto b; break;
		case 5: if(h[1][1]==35)	h[1][1]=79; else goto b; break;
		case 6: if(h[1][2]==35)	h[1][2]=79; else goto b; break;
		case 7: if(h[2][0]==35)	h[2][0]=79; else goto b; break;
		case 8: if(h[2][1]==35)	h[2][1]=79; else goto b; break;
		case 9: if(h[2][2]==35)	h[2][2]=79; else goto b; break;
		default: printf("%s","Vvedenniy simvol ne verniy!");
        	getchar();
        	goto b;
	}
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			printf("| %c |",h[a][b]);
		}
		printf("\n");
	}
	for(d=0;d<4;d++)
	{
		if (h[d][0]+h[d][1]+h[d][2]==237){goto f;}
		if (h[0][d]+h[1][d]+h[2][d]==237){goto f;}
		if (h[0][0]+h[1][1]+h[2][2]==237){goto f;}
		if (h[2][0]+h[1][1]+h[0][2]==237){goto f;}
		goto a;
	}
	getchar();
	f:
	printf("Ty viigral!\n");
	getchar();
	printf("Hochesh opat' sigrat'?   Yes(1) / No(2)\n");
	scanf("%d",&q);
	if(q==1) goto d;
	goto c;
	e:
	printf("Nichya!");
	getchar();
	c:
	return 0;
}
//---------------------------------------------------------------------------
Al3x вне форума Ответить с цитированием
Старый 22.12.2008, 13:27   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

попробуйте сделать так
вроде работает

Код:
         a:
	printf("\nVvedite nomer, gde budet X: ");
	c=0; // обнуляем переменную
	scanf("%d",&c);
	switch(c)
	{
		case 1: if(h[0][0]==35)	  h[0][0]=88; else goto a; break;
		case 2: if(h[0][1]==35)	  h[0][1]=88; else goto a; break;
		case 3: if(h[0][2]==35)	  h[0][2]=88; else goto a; break;
		case 4: if(h[1][0]==35)   h[1][0]=88; else goto a; break;
		case 5: if(h[1][1]==35)   h[1][1]=88; else goto a; break;
		case 6: if(h[1][2]==35)   h[1][2]=88; else goto a; break;
		case 7: if(h[2][0]==35)   h[2][0]=88; else goto a; break;
		case 8: if(h[2][1]==35)   h[2][1]=88; else goto a; break;
		case 9: if(h[2][2]==35)   h[2][2]=88; else goto a; break;
		default: printf("%s","Vvedenniy simvol ne verniy!");
        	                         c=getchar(); //  функция считывает нажатую клавишу как переменную поэтому ее нужно присвоить чему нибудь
			 goto a;
	};
counter вне форума Ответить с цитированием
Старый 22.12.2008, 19:06   #7
Admirol
Новичок
Джуниор
 
Регистрация: 22.12.2008
Сообщений: 1
По умолчанию

Al3x,
Ну как програма нормально работает?
какой её интерфеис, можеш вкинуть screen?
Admirol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите доделать задачу motaro Фриланс 3 09.06.2008 19:59
Помогите доделать Povar Паскаль, Turbo Pascal, PascalABC.NET 1 16.05.2008 14:43
Помогите доделать Калькулятор Ivanich Помощь студентам 12 18.12.2007 06:26
помогите доделать диплом AGA Помощь студентам 5 06.06.2007 12:42