Everything else works fine but try going to the subtraction or division part (Part of the exercise is not to ask questions in subtraction that have negative answers or division question that have division by 0 or the answer is less than 1). At first it works, then try answering another question. It gives out this complicated question not included in my initialize function So I tried answering it, and it can still detect a right from wrong answer. Then it gives out this 32 – 9 or 32/9 (Couldn’t answer the division part because it requires a remainder and the question was too complicated). After you give out the correct answer try answering another subtraction/division question and it will crash and give this error out Process returned -1073741819 Whats wrong with my code? Thanks in advance also!
BTW I put comments to the part of my code that is supposed to restrict the division and subtraction
/* Arithmetic Quiz Practice Program */
#include <stdio.h>
#include <stdlib.h>
int numbers[10];
int clear(void);
int initialize(void);
int additionquiz(void);
int subtractionquiz(void);
int multiplicationquiz(void);
int divisionquiz(void);
/* Main Menu */
int main()
{
while(1==1)
{
int choice;
initialize();
printf("Arithmetic Quiz 4/10/2012");
printf("\n1 - Addition Quiz\n2 - Subtraction Quiz\n3 - Multiplication Quiz\n4 - Division Quiz\n5 - Exit Program\n");
scanf("%d",&choice);
if(choice==1)
{
clear();
additionquiz();
}
else if(choice==2)
{
clear();
subtractionquiz();
}
else if(choice==3)
{
clear();
multiplicationquiz();
}
else if(choice==4)
{
clear();
divisionquiz();
}
else if(choice==5)
{
exit(EXIT_SUCCESS);
}
else
{
printf("\n%cPlease input a valid option\n",7);
main();
}
}
return 0;
}
/* Function for clearing the page */
int clear()
{
int i;
for(i=0;i<25;i++)
{
printf("\n");
}
return 0;
}
/* Function for initializing the Array */
int initialize()
{
numbers[0]=9;
numbers[1]=5;
numbers[2]=1;
numbers[3]=4;
numbers[4]=7;
numbers[5]=8;
numbers[6]=3;
numbers[7]=6;
numbers[8]=2;
numbers[9]=0;
return 0;
}
/* Function for the Addition Quiz */
int additionquiz()
{
/* Randomizing the question in addition quiz */
int a,b,diff,ans,again;
a=0;
diff=1;
b=a+diff;
if(a>9)
{
a=0;
diff++;
}
if(diff>9);
{
diff=0;
}
if(b>9);
{
b=0;
}
/* Main part of the addition quiz */
while(1==1)
{
printf("\n%d + %d = ",numbers[a],numbers[b]);
scanf("%d",&ans);
if(ans==numbers[a]+numbers[b])
{
printf("\nYour answer is CORRECT!!!\n");
a++;
}
else
{
printf("\nYour answer is WRONG!!!\n");
additionquiz();
}
/* The loop for addition quiz" */
while(1==1)
{
printf("\n1 - Answer another addition question\n2 - Go back to main menu\n3 - Exit program\n");
scanf("%d",&again);
if(again==1)
{
clear();
break;
}
else if(again==2)
{
clear();
main();
}
else if(again==3)
{
exit(EXIT_SUCCESS);
}
else
{
printf("%cPlease input a valid option.\n",7);
continue;
}
}
continue;
}
}
/* Function for the subtraction quiz */
int subtractionquiz()
{
/* Randomizing the question in subtraction quiz */
int a,b,diff,ans,again;
a=0;
diff=1;
if(a>9)
{
a=0;
diff++;
}
if(diff>9);
{
diff=0;
}
b=a+diff;
if(b>9);
{
b=0;
}
/* Main part of the subtraction quiz */
while(1==1)
{
/* Not allowing questions with negative answer */
while(numbers[a]<numbers[b])
{
a++;
}
printf("\n%d - %d = ",numbers[a],numbers[b]);
scanf("%d",&ans);
if(ans==numbers[a]-numbers[b])
{
printf("\nYour answer is CORRECT!!!\n");
a++;
}
else
{
printf("\nYour answer is WRONG!!!\n");
subtractionquiz();
}
/* Loop for the subtraction quiz */
while(1==1)
{
printf("\n1 - Answer another subtraction question\n2 - Go back to main menu\n3 - Exit program\n");
scanf("%d",&again);
if(again==1)
{
clear();
break;
}
else if(again==2)
{
clear();
main();
}
else if(again==3)
{
exit(EXIT_SUCCESS);
}
else
{
printf("%cPlease input a valid option.\n",7);
continue;
}
}
continue;
}
}
/* Function for multiplication quiz */
int multiplicationquiz()
{
/* Randomizing the multiplication quiz */
int a,b,diff,ans,again;
a=0;
diff=1;
b=a+diff;
if(a>9)
{
a=0;
diff++;
}
if(diff>9);
{
diff=0;
}
if(b>9);
{
b=0;
}
/* Main part of the multiplication quiz */
while(1==1)
{
printf("\n%d x %d = ",numbers[a],numbers[b]);
scanf("%d",&ans);
if(ans==numbers[a]*numbers[b])
{
printf("\nYour answer is CORRECT!!!\n");
a++;
}
else
{
printf("\nYour answer is WRONG!!!\n");
clear();
multiplicationquiz();
}
/* Loop for multiplication quiz */
while(1==1)
{
printf("\n1 - Answer another multiplication question\n2 - Go back to main menu\n3 - Exit program\n");
scanf("%d",&again);
if(again==1)
{
clear();
break;
}
else if(again==2)
{
clear();
main();
}
else if(again==3)
{
exit(EXIT_SUCCESS);
}
else
{
printf("%cPlease input a valid option.\n",7);
continue;
}
}
continue;
}
}
/* Function for division quiz */
int divisionquiz()
{
/* Randomizing the division quiz */
int a,b,diff,ans,again,remain;
a=0;
diff=1;
if(a>9)
{
a=0;
diff++;
}
if(diff>9);
{
diff=0;
}
b=a+diff;
if(b>9);
{
b=0;
}
/*Main part of the division quiz */
while(1==1)
{
/* Not allowing division by 0 or answers less than 1 */
if(numbers[b]==0 || (numbers[a]<numbers[b]))
{
a++;
continue;
}
printf("%d %% %d =\n",numbers[a],numbers[b]);
printf("What is the whole number in your answer?\n");
scanf("%d",&ans);
printf("\nWhat is the remainder in your answer?(0 if none)\n");
scanf("%d",&remain);
if((ans==numbers[a]/numbers[b])&&(remain==numbers[a]%numbers[b]))
{
printf("\nYour answer is CORRECT!!!\n");
a++;
}
else
{
printf("\nYour answer is WRONG!!!\n");
divisionquiz();
}
/* Loop for division quiz */
while(1==1)
{
printf("\n1 - Answer another division question\n2 - Go back to main menu\n3 - Exit program\n");
scanf("%d",&again);
if(again==1)
{
clear();
break;
}
else if(again==2)
{
clear();
main();
}
else if(again==3)
{
exit(EXIT_SUCCESS);
}
else
{
printf("%cPlease input a valid option.\n",7);
continue;
}
}
continue;
}
}
There are several problems. But the reason you see the strange numbers is that
aeventually increments past the end of thenumbers[]array into unassigned memory.Since you’re starting to learn C, here are some tips.
When you don’t care about a function’s return value you can declare it to return
void. It’s also a good idea to declare a no-args function explicitly:In each part of the quiz, you need to check
aandbinside thewhile()loop, to ensure they’re always valid when you repeat the same quiz.Finally, since you’re repeating the same validation checks for
aandbin each quiz, you might want to extract that code into its own function. Since the function may need to change the values, you’ll need to pass them by address and then dereference the pointers: