Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wagnermoliveira

O que usar Do..while ou so while? Ou nenhum dos dois?

Recommended Posts

Bom a protosta é a seguinte: Desenvolva um programa que determinará o pagamento bruto para seus empregados. A empresa paga o salário-hora “normal” para as primeiras 40 horas trabalhadas por cada empregado e paga “uma vez e meia” o salário-hora normal para todas as horas excedentes a 40 horas. Você recebe uma lista de empregados da empresa, com os nomes, o número de horas que cada empregado trabalhou na semana anterior e o salário-hora de cada empregado. Seu programa deve receber estas informações como entrada para cada empregado e deve determinar e exibir o valor bruto a ser pago para o empregado. O programa deverá funcionar em um loop infinito até que o nome do empregado seja “nulo”.

Dae criei esse codigo aki:

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

main(){
		system("cls");
		char nome[20];
		float horas,salario,pgnormal,pgextra,hextra,total;
		do{
			   system("cls");
			   printf("Nome: ");
			   scanf("%s",&nome);
			   printf("Horas trabalhadas: ");
			   scanf("%f",&horas);
			   printf("Salario Hora: ");
			   scanf("%f",&salario);
			   hextra=0;
			   pgextra=0;
			   if(horas<=40){
				   pgnormal=salario*horas;
				   total=pgnormal;}else{
								 hextra=horas-40;
								 pgnormal=(horas-hextra)*salario;
								 pgextra=(salario*1.5)*hextra;
								 total=pgnormal+pgextra;
								  }	
				printf("\nNome: %s\n",nome);
				printf("Horas Trabalhadas: %f\n",horas);
				printf("Salario Hora: %f\n",salario);
				printf("Total de Horas Extras: %f\n",hextra);
				printf("Salario a total: %f\n",pgnormal);
				printf("Total de Horas Extras: %f\n",pgextra);
				printf("Total a Receber: %f\n",total);
		getche();
		}while(nome!='nulo');
		
}
Uso o Dec-C++, se alguem puder dar uma ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for parar p/ pensar, nenhum dos dois do jeito normal.

 

O problema do while comparando o nome a nulo é que você precisa inicializar a variável nome p/ algo não-nulo, o que vai ser uma perda de tempo, já que você vai sobrescrever em seguida.

 

Já o do-while você duplica a condição de parada do loop após a leitura do nome (if nome == 'nulo' break). Isso evita trabalho desnecessário.

 

O mais simples é ter um while(1) com a verificação de nome == 'nulo' dando break no laço.

 

 

EDIT: dê uma olhada no enunciado:

 

O programa deverá funcionar em um loop infinito até que o nome do empregado seja “nulo”.

 

Novamente: while(1)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O "do while" é usado quando você precisa executar as instruções pelo menos uma vez e verificar a condição de permanecer no loop depois que a instrução for executada.

 

E você não precisa colocar toda as instruções dentro de um laço: coloque somente a parte do nome. :)

 

do
{
	 printf("Nome: ");
	 scanf("%s",&nome);
} while ( nome = "" );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, agora que eu li o que o programa pede. Nesse caso está certo.

 

Nesse caso é melhor usar o "do while", porque se fosse usar somente while, você precisaria "forçar" ele entrar no loop, ao menos que esteja como while(1), mas ai não teria como sair do loop.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Nesse caso é melhor usar o "do while", porque se fosse usar somente while, você precisaria "forçar" ele entrar no loop, ao menos que esteja como while(1), mas ai não teria como sair do loop.

 

Leia de novo,então...

A condição já dá o modo de sair:é só usar um break.

E como já falei: usando do-while você duplica o teste, porque fazer tudo aquilo p/ "nulo" é besteira,além de estar errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse caso é melhor usar o "do while", porque se fosse usar somente while, você precisaria "forçar" ele entrar no loop, ao menos que esteja como while(1), mas ai não teria como sair do loop.

Leia de novo,então...

A condição já dá o modo de sair:é só usar um break.

E como já falei: usando do-while você duplica o teste, porque fazer tudo aquilo p/ "nulo" é besteira,além de estar errado.

 

Se tem do...while, pra que usar break nesse caso? A nao ser se voce aprendeu if ontem e esta' querendo por em pratica.

 

Mensagem um ano e alguns meses atrasados, mas ok.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por este raciocínio, se tem for(), pra que usar while()? Com for() dá pra economizar a linha de inicialização e a de incremento. Mas enfim:

 


#include <stdio.h>
#include <stdlib.h>


int main()
{
	char nome[50] = "";

	while (fgets(nome, sizeof nome, stdin) && strncmp(nome, "nulo\n", 5))
	{
		nome[strlen(nome)] = 0;
		printf("\n%s", nome);
	}

	return 0;
}

Ou com for():

 


#include <stdio.h>
#include <stdlib.h>


int main()
{
	char nome[50];

	for (nome[0] = 0; strncmp(nome, "nulo", 4); fgets(nome, sizeof nome, stdin), nome[strlen(nome)] = 0)
	{
		printf("\n%s", nome);
	}

	return 0;
}

Cuidado com o jeito com que você tentou comparar strings.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ressuscitando coisas mortas.

 

 

 

 

Nesse caso é melhor usar o "do while", porque se fosse usar somente while, você precisaria "forçar" ele entrar no loop, ao menos que esteja como while(1), mas ai não teria como sair do loop.

Leia de novo,então...

A condição já dá o modo de sair:é só usar um break.

E como já falei: usando do-while você duplica o teste, porque fazer tudo aquilo p/ "nulo" é besteira,além de estar errado.

 

 

 

Se tem do...while, pra que usar break nesse caso? A nao ser se voce aprendeu if ontem e esta' querendo por em pratica.

 

Mensagem um ano e alguns meses atrasados, mas ok.

 

 

 

 

Eu aprendi if uns 6 meses antes de entrar p/ faculdade, quando comecei a programar em C. E isso foi há 7 anos.

Quotando o que você mesmo disse há quase 2 anos:

 

 

Nesse caso é melhor usar o "do while", porque se fosse usar somente while, você precisaria "forçar" ele entrar no loop, ao menos que esteja como while(1), mas ai não teria como sair do loop.

Achei que não seria necessário explicar que o break é o modo de sair do while(1), que você disse não ter modo de sair.

O "estar errado", como tudo que envolve professores, é relativo. Na minha interpretação, um loop infinito é melhor expressado por while(1) ou for(;wink.gif. Fica bem evidente o fato de que se você mexer em algo ou fizer algo errado, o programa pode não parar nunca. Serve mais como um alerta visual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.