Instrução auxiliada por computador: variando os tipos de problemas. Modifique o programa do Exercício 5.53 de modo a permitir que o usuário escolha um tipo de problema aritmético para estudar. Uma opção 1 significa problemas de adição, 2 significa problemas de subtração, 3 significa problemas de multiplicação e 4 significa uma mistura aleatória de todos esses tipos.
Passo 1
Fala ai, blz?
Tá pronto pra mais um programinha?
Primeiro, colocamos todas as bibliotecas que vamos precisar, nesse programa foram utilizadas a

Depois, vamos para função main, nela usamos a função srand para que se possa gerar números distintos e também utilizamos um laço while para chamar a nossa função Tabuada infinitas vezes.
Passo 2
Agora vamos criar nossa função Tabuada, primeiro determinamos o seu tipo, após isso definimos as variáveis que serão essenciais dentro da função. Em seguida é impresso ao aluno a mensagem “Escolha o tipo de problema aritmético…” e depois que o aluno digita o tipo, esse é armazenado na variável tipo . Logo em seguida é impresso uma nova mensagem ao aluno, “Escolha um nível de dificuldade de 1- 3”, e a resposta do aluno é armazenada na variável nivel.

Passo 3
Utilizando o laço for para assegurar que cada usuário responda 10 perguntas do nível e com o tipo de operação já escolhidas.
Em seguida é realizado duas chamadas da função SorteiaNum em cada passada do laço for, essa função vai fornecer os números aleatórios que serão utilizados em cada operação de acordo com o nível escolhido.

calma aí que tem mais, agora utilizamos o switch para selecionar o tipo de operação que será realizada com os números obtidos. Quando o aluno digita 1 por exemplo, ele receberá 10 probleminhas envolvendo a adição, e a cada vez que ele acerta um probleminha é acrescentado uma unidade na variável acertos. Lembrando que isso é feito para as demais operações (soma, subtração e multiplicação).
Passo 4
Entretanto na opção de número 4, que consiste na mistura aleatória dos tipos de problemas aritméticos, fazemos um pouco diferente.

Chamamos novamente a função SorteiaNum, para que nossa operação aleatória envolva 3 números . Posteriormente chamamos a função OpAleatoria , que iremos já conhecer sua estrutura, e armazenamos o retorno dessa função na variável acertos.
Passo 5
Conhecendo a função SorteiaNum…
Nessa função receberemos como parâmetro o nível do qual o usuário deseja que seja seu problema. Se o nível for 1, será sorteado um número entre 0 e 9. No entanto, se o nível for 2, será sorteado um número entre 0 e 99. Porém, se o nível for 3, será sorteado um número entre 0 e 999. Em seguida esse número será retornado para a função Tabuada, e armazenado nas variáveis num1, num2 e num3.

Passo 6
Conhecendo a função OpAleatoria…
Essa função é executada quando o aluno opta pela opção 4, de problemas com operações aleatórias. Por isso que são passados para a função três parâmetros(num1, num2 e num3).
Nessa função utilizamos o rand para sortear números de 1 até 5, cada um desses números representará no switch um problema diferente. Caso seja o 1, então o usuário deverá realizar primeiro uma multiplicação e depois uma soma. E assim por diante, lembrando que a cada vez que o usuário digitar uma resposta certa, será acrescido uma unidade na variável acerto.


E por fim, a quantidade de acertos será retornado para função Tabuada e armazenado na variável acertos, como já vimos anteriormente.
Passo 7
Retornando para a função Tabuada…
Temos o feedback para o aluno, caso ele tenha acertado 75% das perguntas independente do tipo de operação aritmética escolhida será exibido a mensagem “Parabéns, você está pronto para o próximo nível!”. Todavia, se ele acertar menos que 75%, será exibido a mensagem “Por favor, peça ajuda a seu professor.” Ufaaa, deu trabalho né? Mas o programa ficou show!

Abraços, e bons estudos! :)
Resposta
#include
#include
#include
/* protótipos das funções que serão utilizadas */
void Tabuada();
int SorteiaNum(int nivel);
int OpAleatoria(int num1, int num2, int num3);
/* função main inicia a execução do programa */
int main(){
srand(time(NULL)); /* semente gerador de números aleatórios */
while(1){
Tabuada(); /* chamada da função Tabuada */
}
return 0; /* indica conclusão bem-sucedida */
} /* fim do main */
/* Essa função é utilizada para escolher números de acordo com o nível */
int SorteiaNum(int nivel){
int num;
switch(nivel){
case 1:
num = rand() % 9; /* escolhe um número entre 0 - 9 */
break;
case 2:
num = rand() % 99; /* escolhe um número entre 0 - 99 */
break;
case 3:
num = rand() % 999; /* escolhe um número entre 0 - 999 */
break;
}
return num; /* a função retorna o num para função Tabuada*/
} /* fim da função SorteiaNum */
/* A função sorteia a opção aleatória a ser realizada*/
int OpAleatoria(int num1, int num2, int num3){
int op;
int resultado;
double certo = 0;
op = 1 + rand() % 5;
switch(op){
case 1:
printf("Quanto é %d + %d * %d ?\n", num1,num2,num3);
scanf("%d", & resultado);
if((num1 + num2 * num3) == resultado){
certo++;
} /* fim do if */
break;
case 2:
printf("Quanto é %d - %d * %d ?\n", num1,num2,num3);
scanf("%d", & resultado);
if((num1 - num2 * num3) == resultado){
certo++;
}
break;
case 3:
printf("Quanto é %d + %d - %d ?\n", num1,num2,num3);
scanf("%d", & resultado);
if((num1 + num2 - num3) == resultado ){
certo++;
}
break;
case 4:
printf("Quanto é %d - %d + %d ?\n", num1,num2,num3);
scanf("%d", & resultado);
if((num1 - num2 + num3) == resultado){
certo++;
}
break;
case 5:
printf("Quanto é %d * %d * %d ?\n", num1,num2,num3);
scanf("%d", & resultado);
if((num1 * num2 * num3) == resultado){
certo++;
}
break;
}
return certo; /* retorna a quantidade de acertos para a função Tabuada */
} /* fim da função opAleatoria*/
void Tabuada(){
int tipo, nivel;
int num1,num2, num3;
int resp;
double acertos = 0;
printf("Escolha o tipo de problema aritmético.\nDigite: \n1 - Adição\n2 - Subtração\n3 - Multiplicação\n4 - Mistura Aleatória\n");
scanf("%d", & tipo);
printf("Escolha um nível de dificuldade de 1 - 3:\n");
scanf("%d", & nivel);
for(int i = 0; i
num1 = SorteiaNum(nivel);
num2 = SorteiaNum(nivel);
switch(tipo){
case 1:
printf("Quanto é %d + %d ?\n", num1, num2);
scanf("%d",& resp);
if((num1 + num2)== resp){
acertos++;
}
break;
case 2:
printf("Quanto é %d - %d ?\n", num1, num2);
scanf("%d",& resp);
if((num1 - num2) == resp){
acertos++;
}
break;
case 3:
printf("Quanto é %d x %d ?\n", num1, num2);
scanf("%d",& resp);
if((num1 * num2) == resp){
acertos++;
}
break;
case 4:
num3 = SorteiaNum(nivel);
acertos = OpAleatoria(num1, num2,num3);
break;
} /* fim do switch */
} /* fim do for */
/* dando o feedback para cada usuário sobre seu desempenho */
if(acertos / 10 >= 0.75){
printf("Parabéns, você está pronto para o próximo nível!\n");
} /* fim do if*/
else{
printf("Por favor, peça ajuda a seu professor.\n");
} /* fim do else */
}/* fim da função Tabuada */