Member 13548331 Ответов: 2

Может ли кто - нибудь помочь мне найти ошибку?


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define false   0
#define true    1
#define bool int
void responsegood();
void responsebad();
void generatePattern1(int*, int*);
void generatePattern2(int*, int*);
void generatePattern3(int*, int*);

int main()
{

	int a,b,no,mul;
	char ch;
	int i ;
	int level;

	bool correct=true;
	int passes;
	srand(time(NULL));

	printf("Choose your level of difficulty (1-3)\n");
	scanf("%d", &level);
	while (level !=-1){

	do{
			if((level != 1 && level != 2) && (level != 3 && level !=-1)){
				printf("The value is invalid\n");
				printf("Choose your level of difficulty (1-3)\n");
				scanf("%d", &level);
			}

		}
		while ((level !=1 && level !=2) && (level !=3 && level !=-1));
		while (level !=-1){
			do{
				if(level == 1){
					generatePattern1(&a, &b);
				}
				else if(level == 2){
					generatePattern2(&a, &b);
				}
				else if(level == 3){
					generatePattern3(&a ,&b);

	while(correct)

{

	passes=0;

	for (i = 1 ; i <= 10 ; ++i ) {

	a=rand()%10;
	b=rand()%10;

	printf("How much is %d times %d = ",a,b);

	scanf("%d",&no);

	mul=a*b;


    if(mul==no)
       
      {
	responsegood();

		passes++ ;
	}
   else

    {
      responsebad();

	  
	}
	}
	if ( passes < 7.5 ) {
		printf( "Please ask your teacher for extra help.\n" );
	}
	else { 
		printf( "Congratulations , you are ready to go to the next level!\n " );
	}

	
	do{


      printf("\nWant to try another multiplication question? If yes then press 'y' else 'n' = ");

      scanf(" %c",&ch);

	  

      if(ch=='y'||'Y')
	  {
        continue;
	  }
      else if (ch=='n'||'N')
	  {
        correct=false;     
	  }
	  else
	  { 
		  printf("invalid value\n");
	  }

      }while ((ch !='y'&&ch !='n')&&(ch !='Y'&&ch !='N'));
        
	}
	
system("pause");

return 0;

}

void responsegood()
{
	char rangood;
	srand(time(NULL));
	rangood = 1 + rand() % 4;

		switch (rangood){
		case 1:
			printf("Very good!\n\n");
			break;
		case 2:
			printf("Excellent!\n\n");
			break;
		case 3:
			printf("Nice work!\n\n");
			break;
		case 4:
			printf("Keep up the good work!\n\n");
			break;
		}
	
}
	void responsebad()
	{
	char ranbad;
	srand(time(NULL));
	ranbad = 1 + rand() % 4;
	
		switch (ranbad){
			case 1:
			printf("no.please try again!\n\n");
			break;
		case 2:
			printf("wrong,Try again!\n\n");
			break;
		case 3:
			printf("Dont give up!\n\n");
			break;
		case 4:
			printf("No.keep trying!\n\n");
			break;}
	}

	void generatePattern1(int*a, int*b){
	*a = rand() % 9+1;
	*b = rand() % 9+1;
}

void generatePattern2(int*a, int*b){
	*a = rand() % 99+1;
	*b = rand() % 99+1;
}

void generatePattern3(int*a, int*b){
	*a = rand() % 999+1;
	*b = rand() % 999+1;

return;
}


Что я уже пробовал:

я пробовал много раз, но просто не могу найти ошибку.

CHill60

В чем же проблема?

Richard MacCutchan

Было бы полезно, если бы вы объяснили, что это за ошибка (разместите любые сообщения об ошибках) и где она возникает.

2 Ответов

Рейтинг:
2

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
while (level !=-1){

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Мы не можем сказать вам, в чем "проблема": мы понятия не имеем, что он должен делать, что он делает то, чего вы не ожидали, или не делает то, что вы сделали - но это не трудно сделать самому, и вы узнаете что-то действительно стоящее в то же время!


Рейтинг:
2

Patrice T

C++ 101: в языках C/C++/C# структуры разделяются символом { и }, они идут парами, для каждого открывающего есть закрывающий.
Как вы можете видеть после отступа, ваш код имеет пару } потерянный.

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define false   0
#define true    1
#define bool int
void responsegood();
void responsebad();
void generatePattern1(int*, int*);
void generatePattern2(int*, int*);
void generatePattern3(int*, int*);

int main()
{
    int a,b,no,mul;
    char ch;
    int i ;
    int level;

    bool correct=true;
    int passes;
    srand(time(NULL));

    printf("Choose your level of difficulty (1-3)\n");
    scanf("%d", &level);
    while (level !=-1){

        do{
            if((level != 1 && level != 2) && (level != 3 && level !=-1)){
                printf("The value is invalid\n");
                printf("Choose your level of difficulty (1-3)\n");
                scanf("%d", &level);
            }

        }
        while ((level !=1 && level !=2) && (level !=3 && level !=-1));
        
        while (level !=-1){
            do{
                if(level == 1){
                    generatePattern1(&a, &b);
                }
                else if(level == 2){
                    generatePattern2(&a, &b);
                }
                else if(level == 3){
                    generatePattern3(&a ,&b);

                    while(correct)
                    {
                        passes=0;

                        for (i = 1 ; i <= 10 ; ++i ) {

                            a=rand()%10;
                            b=rand()%10;

                            printf("How much is %d times %d = ",a,b);

                            scanf("%d",&no);

                            mul=a*b;


                            if(mul==no)

                            {
                                responsegood();

                                passes++ ;
                            }
                            else

                            {
                                responsebad();

                            }
                        }
                        if ( passes < 7.5 ) {
                            printf( "Please ask your teacher for extra help.\n" );
                        }
                        else {
                            printf( "Congratulations , you are ready to go to the next level!\n " );
                        }


                        do{


                            printf("\nWant to try another multiplication question? If yes then press 'y' else 'n' = ");

                            scanf(" %c",&ch);



                            if(ch=='y'||'Y')
                            {
                                continue;
                            }
                            else if (ch=='n'||'N')
                            {
                                correct=false;
                            }
                            else
                            {
                                printf("invalid value\n");
                            }

                        }while ((ch !='y'&&ch !='n')&&(ch !='Y'&&ch !='N'));

                    }

                    system("pause");

                    return 0;

                }

                void responsegood()
                {
                    char rangood;
                    srand(time(NULL));
                    rangood = 1 + rand() % 4;

                    switch (rangood){
                    case 1:
                        printf("Very good!\n\n");
                        break;
                    case 2:
                        printf("Excellent!\n\n");
                        break;
                    case 3:
                        printf("Nice work!\n\n");
                        break;
                    case 4:
                        printf("Keep up the good work!\n\n");
                        break;
                    }

                }
                void responsebad()
                {
                    char ranbad;
                    srand(time(NULL));
                    ranbad = 1 + rand() % 4;

                    switch (ranbad){
                    case 1:
                        printf("no.please try again!\n\n");
                        break;
                    case 2:
                        printf("wrong,Try again!\n\n");
                        break;
                    case 3:
                        printf("Dont give up!\n\n");
                        break;
                    case 4:
                        printf("No.keep trying!\n\n");
                        break;
                    }
                }

                void generatePattern1(int*a, int*b){
                    *a = rand() % 9+1;
                    *b = rand() % 9+1;
                }

                void generatePattern2(int*a, int*b){
                    *a = rand() % 99+1;
                    *b = rand() % 99+1;
                }

                void generatePattern3(int*a, int*b){
                    *a = rand() % 999+1;
                    *b = rand() % 999+1;

                    return;
                }

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

Как только вы сделаете эти исправления, вам нужно будет изучить отладчик, потому что у вас есть другие проблемы в вашем коде.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.