While quebrando loop [RESOLVIDO]

1. While quebrando loop [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 09/09/2018 - 16:56h

Boa tarde, estou estudando programação e estou vendo a Linguaguem C.
Estou fazendo um exercicio e nele tenho uma função que tem um while de repetição ilimitada (se o usuario quiser pode seguir infinitamente). porém na primeira execução do loop ele funciona normalmente, mas quando deveria entrar novamente ele para o loop. A seguir esta o codigo da função. Caso alguem puder me ajudar, posso explicar o codigo caso seja necessario.

void incluirProjeto(projeto *p, float *receber, float *recebido, int *contPro, cliente *pCli, int *contCod){
int saida=1;
pCli->lista=0;
int a;

while(saida==1){
a=(*contPro);
p[a].cod=(*contCod);
printf("\nDigite o Nome do Projeto: ");
scanf("%s", p[a].nome);
printf("\nData de inicio do Projeto: \nDia: ");
scanf("%d", &p[a].inicio.dia);
printf("\nMes: ");
scanf("%d",&p[a].inicio.mes);
printf("\nAno: ");
scanf("%d", &p[a].inicio.ano);
printf("\nDigite a data de término do projeto (ou previsão):\nDia: ");
scanf("%d", &p[a].fim.dia);
printf("\nMes: ");
scanf("%d",&p[a].fim.mes);
printf("\nAno: ");
scanf("%d", &p[a].fim.ano);
printf("\nInforme o custo do projeto: ");
scanf("%f", &p[a].preco);
retorno: printf("Informe a situação do projeto. \n6 - pago \n7 - a receber: \n");
scanf("%d",&p[a].situacao);

if (p[a].situacao==6){
strcpy(p[a].sit, "Pago");
*recebido += p[a].preco;
}
else if (p[a].situacao==7){
strcpy(p[a].sit, "A Receber");
*receber += p[a].preco;
}
else{
printf("\nOpção invalida");
goto retorno;
}

p[a].cli=pCli; //Associa no projeto o seu respectivo cliente
pCli->codigo[pCli->lista]=&p[a]; //Armazena no vetor de proetos de clientes o ponteiro para os projjetos
pCli->lista++; //incrementa o meu contador de posiçao do vetor de projetos em cliente
*contPro++;
*contCod++;

printf("\nDeseja cadastrar outro projeto? <0 - Não || 1 - Sim: ");
scanf("%d",&saida);
}
}



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/09/2018 - 15:31h

jussim escreveu:

Boa tarde, estou estudando programação e estou vendo a Linguaguem C.
Estou fazendo um exercicio e nele tenho uma função que tem um while de repetição ilimitada (se o usuario quiser pode seguir infinitamente). porém na primeira execução do loop ele funciona normalmente, mas quando deveria entrar novamente ele para o loop. A seguir esta o codigo da função. Caso alguem puder me ajudar, posso explicar o codigo caso seja necessario.

void incluirProjeto(projeto *p, float *receber, float *recebido, int *contPro, cliente *pCli, int *contCod){
int saida=1;
pCli->lista=0;
int a;

while(saida==1){


Se o seu laço de repetição sempre vai executar pelo menos uma vez, então você provavelmente deveria usar dowhile em lugar de while.
do {
/* bla, bla, bla... */
} while(condicao_de_repeticao);


        a=(*contPro);
p[a].cod=(*contCod);
printf("\nDigite o Nome do Projeto: ");
scanf("%s", p[a].nome);


Este comentário se aplica a todas as operações de leitura: você deve testar os valores de retorno, para ter certeza de que sua leitura é válida, e deve cuidar de não deixar sobras no buffer de entrada, que possam comprometer as operações de leitura seguintes.

Especificamente sobre a leitura de strings, seria melhor você usar formas de leitura mais seguras e com menos restrições do que a conversão "%s" de scanf(). Você deveria limitar a quantidade máxima de caracteres a serem lidos, e deve se lembrar que a conversão "%s" não aceita espaços como parte da string lida.

        printf("\nData de inicio do Projeto: \nDia: ");
scanf("%d", &p[a].inicio.dia);
printf("\nMes: ");
scanf("%d",&p[a].inicio.mes);
printf("\nAno: ");
scanf("%d", &p[a].inicio.ano);
printf("\nDigite a data de término do projeto (ou previsão):\nDia: ");
scanf("%d", &p[a].fim.dia);
printf("\nMes: ");
scanf("%d",&p[a].fim.mes);
printf("\nAno: ");
scanf("%d", &p[a].fim.ano);
printf("\nInforme o custo do projeto: ");
scanf("%f", &p[a].preco);
retorno: printf("Informe a situação do projeto. \n6 - pago \n7 - a receber: \n");
scanf("%d",&p[a].situacao);

if (p[a].situacao==6){
strcpy(p[a].sit, "Pago");
*recebido += p[a].preco;
}
else if (p[a].situacao==7){
strcpy(p[a].sit, "A Receber");
*receber += p[a].preco;
}
else{
printf("\nOpção invalida");
goto retorno;
}

p[a].cli=pCli; //Associa no projeto o seu respectivo cliente
pCli->codigo[pCli->lista]=&p[a]; //Armazena no vetor de proetos de clientes o ponteiro para os projjetos
pCli->lista++; //incrementa o meu contador de posiçao do vetor de projetos em cliente
*contPro++;
*contCod++;


Nas duas linhas acima, o operador de pós-incremento tem precedência mais alta do que o operador de indireção. Assim sendo, o que você faz com esses comandos é alterar os valores dos ponteiros, não os dos dados por eles apontados. Antes do incremento de cada ponteiro, uma cópia do valor original é gerada, e essa cópia do ponteiro original é passada ao operador de indireção para acesso ao conteúdo, mas como o acesso ao conteúdo não é usado para nada, ele é descartado.

Provavelmente você deveria ter dito o seguinte, para incrementar os conteúdos dos dados apontados (mostrados com dois modos diferentes de incremento, um para cada dado):
	++*contPro;  // obtém conteúdo de contPro e aplica sobre ele o operador de pré-incremento
(*contCod)++; // obtém conteúdo de contCod e aplica sobre ele o operador de pós-incremento



printf("\nDeseja cadastrar outro projeto? <0 - Não || 1 - Sim: ");
scanf("%d",&saida);
}
}


3. Re: While quebrando loop [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 11/09/2018 - 14:42h

Muito Obrigado pela orientação. Resolveu o problema aqui.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts