Logo Hardware.com.br
vitor hugo2014
vitor hugo20... Novo Membro Registrado
7 Mensagens 0 Curtidas

(Duvida de Iniciante)Fazer um programa em C finalizar ou recomeçar

#1 Por vitor hugo20... 20/01/2015 - 21:50
Boa noite a todos novamente! Estou com um problema na manipulação de strings: quero que,dada as opçao '' o programa recomece ou que o programa feche.Porém, meu código da erro e acredito que possa ser por conta da seguinte passagem: ''strcasecmp( fixo, decisao)==0 ''

Pois,quando não atribuo '0' ou '1' na funcao 'strcasecmp' ou seja,se escrevo apenas "strcasecmp( fixo, decisao)" o programa até roda,mas não da maneira que gostaria. Como contornar o erro?Segue o código completo e,desde já, grato:
[code=C]
#include
#include

int main() {
char fixo[1]={'s'},decisao[1]={'s'};
float mp[3];


while (strcasecmp( fixo, decisao)==0){
struct id{
char nome[10];
float nota[5],media;};

struct id ids[1];


printf("***Calculo da nota individual para engenharias/ciencia da computacao no ENEM ***\n\n\n");


printf("Digite o nome do candidato: ");
gets(ids[0].nome);

printf("Digite a nota do candidato em codigo,linguagens e suas tecnologias: ");
scanf(" %f",&ids[0].nota[0]);

printf("Digite a nota do candidato em Matematica: ");
scanf(" %f",&ids[0].nota[1]);

printf("Digite a nota do candidato em ciencias da natureza e suas tecnologias: ");
scanf(" %f",&ids[0].nota[2]);

printf("Digite a nota do candidato em ciencias humanas e suas tecnologias: ");
scanf(" %f",&ids[0].nota[3]);

printf("Digite a nota do candidato na redacao:");
scanf(" %f",&ids[0].nota[4]);
printf("\n");


mp[0]=(ids[0].nota[0]+ids[0].nota[1]+ids[0].nota[2]+ids[0].nota[3]+ids[0].nota[4])/5;
mp[1]=((ids[0].nota[1])*4+(ids[0].nota[2])*4+(ids[0].nota[3])*2+(ids[0].nota[0])*2+(ids[0].nota[4])*3)/15;
mp[2]=((ids[0].nota[1])*4+(ids[0].nota[2])*3+(ids[0].nota[3])*1+(ids[0].nota[0])*1+(ids[0].nota[4])*3)/12;

printf("A nota bruta no ENEM do candidato(a) %s e: %.3f\n\nA nota do candidato para engenharias na UFRJ e: %.3f\n\nA nota do candidato para ciencias da computacao na UFRJ e: %.3f\n\n",ids[0].nome,mp[0],mp[1],mp[2]);

printf("Deseja calcular novamente? ");
gets(decisao);
}


printf("ATE PROXIMA!");

}[/code]
vitor hugo2014
vitor hugo20... Novo Membro Registrado
7 Mensagens 0 Curtidas
#2 Por vitor hugo20...
21/01/2015 - 13:33
dei uma boa enxugada no programa e tentei usar o 'do while'; o programa roda, mas não está funcionando o ''loop''! Alguma sugestão? Segue o código:
[code=C]
#include
#include

int main() {
char fixo[1]={'s'},decisao[1]={'s'},nome[20];
float mp[3],nota[5];

do{
printf("***Calculo da nota individual para engenharias/ciencia da computacao ***\n\n\n");

printf("Digite o nome do candidato: ");
gets(nome);

printf("Digite a nota do candidato em codigo,linguagens e suas tecnologias: ");
scanf(" %f",&nota[0]);

printf("Digite a nota do candidato em Matematica: ");
scanf(" %f",&nota[1]);

printf("Digite a nota do candidato em ciencias da natureza e suas tecnologias: ");
scanf(" %f",&nota[2]);

printf("Digite a nota do candidato em ciencias humanas e suas tecnologias: ");
scanf(" %f",&nota[3]);

printf("Digite a nota do candidato na redacao:");
scanf(" %f",&nota[4]);
printf("\n");


mp[0]=(nota[0]+nota[1]+nota[2]+nota[3]+nota[4])/5;
mp[1]=((nota[1])*4+(nota[2])*4+(nota[3])*2+(nota[0])*2+(nota[4])*3)/15;
mp[2]=((nota[1])*4+(nota[2])*3+(nota[3])*1+(nota[0])*1+(nota[4])*3)/12;

printf("A nota bruta no ENEM do candidato(a) %s e: %.3f\n\nA nota do candidato %s para engenharias na UFRJ e: %.3f\n\nA nota do candidato %s para ciencias da computacao na UFRJ e: %.3f\n\n",nome,mp[0],nome,mp[1],nome,mp[2]);

printf("Deseja calcular novamente?");
gets(decisao);
}

while
( strcasecmp(decisao,fixo)==0);

if (strcasecmp(decisao,fixo)==1){
printf("ATE PROXIMA!");
}

}[/code]
JOMARUMU
JOMARUMU General de Pijama Registrado
2.7K Mensagens 342 Curtidas
#3 Por JOMARUMU
21/01/2015 - 23:50
De várias formas, uma NÃO recomendada é o Goto (nem pesquise sobre isso, foi uma grande burrice eu ter lido sobre ela e ter passado a utilizar).

Outra forma é com um while e utilizar uma função para isso.
Por exemplo:


int calcula_media()
{
...... (programa)

if ( o usuário digitar N ){ return 0;}
eles { return 1;}
}

int main() {
int roda = 1; //ou bool
while (roda == 1)
{
roda = calcula_media();

}

}



Acho que ficou bem confusa a resposta, para ficar mais explicado recomendo que leia os textos desses links:
http://linguagemc.com.br/funcoes-em-c/
https://www.inf.pucrs.br/~pinho/LaproI/Funcoes/AulaDeFuncoes.htm


Tem como utilizar o main como uma função recursiva, seria mais fácil, mas não recomendo também, a solução acima é bem mais fácil de ser entendida.
vitor hugo2014
vitor hugo20... Novo Membro Registrado
7 Mensagens 0 Curtidas
#4 Por vitor hugo20...
23/01/2015 - 14:33
Primeiramente gostaria de lhe agradecer, Jomar. Os sites que me passou foram de grande ajuda! quase que estou conseguindo fazer o looping do jeito que eu gostaria! Mas, está dando um pequeno problema no meu código:

[HASHTAG]#include[/HASHTAG]
[HASHTAG]#include[/HASHTAG]
[HASHTAG]#include[/HASHTAG]

void looping(){
int tecla;
int n;
printf("Digite um numero: ");
scanf("%d",&n);
fflush(stdin);
printf("Deseja escolher outro numero?");
tecla = getch();
tecla=toupper(tecla);
fflush(stdin);

while(tecla == 83){looping();}
while( tecla !=83 && tecla != 78){
printf("Digite uma opcao valida!");
tecla = getch();
tecla=toupper(tecla);
fflush(stdin);
}if(tecla==78){printf("Ate a proxima!");}
}


int main(){
looping();
}


Quando executo o programa, ele faz todos os comandos perfeitamente,a princípio. porém, se eu pedir um numero mais de uma vez e desejar sair,o programa imprime o ''até a próxima'', porém ele contiua a solicitar um numero em vez de fechar. Não consegui identificar meu erro.

Aproveito a oportunidade para perguntar: o segredo desse loopin foi a variavel 'tecla' ser um inteiro, mas eu poderia fazer esse só utilizando strings? Minha duvida seria, por exemplo: usando a função strcmp eu poderia escrever strcmp( parametro1, parametro2)==0 para ver se as strings sao iguais, mas eu poderia escrever: strcmp(parametro1, "letra/frase qualquer") ?
Grato.
JOMARUMU
JOMARUMU General de Pijama Registrado
2.7K Mensagens 342 Curtidas
#5 Por JOMARUMU
23/01/2015 - 22:43
Não entendi bem a sua dúvida, rodei aqui e funcionou. Utilizei o Code Blocks com o GCC.
Notei que está usando uma função recursiva, como disse, não recomendo, é uma boa escolha, mas pode dificultar o entendimento.
Segue o que eu teria feito:

#include<stdio.h>
#include<ctype.h>
#include<conio.h>

int looping()
{
int tecla;
int n;
printf("Digite um numero: \n&quot;
scanf("%d",&n);
fflush(stdin);
printf("Deseja escolher outro numero?<S/N>\n&quot;

while (1)
{
tecla = getch();
tecla = toupper(tecla);
fflush(stdin);
if(tecla == 83){return 1;}
else
{
if(tecla==78){printf("Ate a proxima!\n&quot; return 0;}
else
{
printf("Digite uma opcao valida!<S/N>\n&quot;
}
}
}

}

int main(){
int roda = 1;
while (roda == 1)
{
roda = looping();
}
}


vitor hugo2014 disse:

Aproveito a oportunidade para perguntar: o segredo desse loopin foi a variavel 'tecla' ser um inteiro, mas eu poderia fazer esse só utilizando strings? Minha duvida seria, por exemplo: usando a função strcmp eu poderia escrever strcmp( parametro1, parametro2)==0 para ver se as strings sao iguais, mas eu poderia escrever: strcmp(parametro1, "letra/frase qualquer") ?
Grato.

Você só quer um S ou um N, um Char bastaria; No caso, as linhas que você mudaria (no programa que postei acima) seriam:
int tecla; -> char tecla;
if(tecla == 83) -> if(tecla == 'S')
if(tecla==78) -> if(tecla=='N')

Como você usou o toupper então só é necessário comparar com as letras maiúsculas.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal