Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

1. Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Pedro Victor
Nerdiarretado

(usa Arch Linux)

Enviado em 10/04/2019 - 22:02h

Questão:
Escreva um programa que leia números inteiros até o usuário digitar 0. Depois, escreva na tela quantas vezes cada número de 1 a 9 foi lido do usuário.

Estou totalmente perdido nessa resolução, já tentei várias ações mas sem sucesso algum



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/04/2019 - 22:39h

Esqueça o computador e o C. Vamos imaginar uma situação semelhante em que você teria de fazer algo parecido, usando, no máximo, lápis e papel para ajudá-lo.

Suponha que você está entrevistando pessoas para ver em que elas vão votar em uma eleição, mas lhe interessa computar apenas os votos válidos. Você tem uma relação com os números dos candidatos válidos, e você entrevista cada pessoa que passa pela sua frente, perguntando o número do candidato em quem ela vai votar. A pessoa pode dizer que vai votar no 11 (PP), 12 (PDT), 13 (PT), 14 (PDT), 15 (MDB), 16 (PSTU), 17 (PSL), e assim por diante. Como você faria para saber quantos votos foram dados a cada um desses números de partido, usando sua memória ou um lápis e um papel? Pode ser que, pelo meio do caminho, a pessoa diga que vai votar em branco ou em num número que não está na sua relação (caracterizando um voto nulo), mas como lhe interessa computa apenas votos válidos, você não precisa se preocupar com a computação desses votos.

Suponha, ainda, que quem encomendou a pesquisa foi o José Maria Eymael, cujo partido, Democracia Cristã, tem o número 27, e que, na verdade, ele quer apenas estimar quantos votos cada candidato de outro partido receberia antes de ele receber seu primeiro voto, de modo que quando algum dos seus entrevistados responder “27”, você pode parar sua pesquisa, e levar os dados coletados até o candidato que o contratou, para receber a rica recompensa de R$100,00 mais o dinheiro do “busão”

Você consegue descrever, em Português, como você faria para realizar manualmente essa pesquisa?

E você consegue perceber que ela é quase perfeitamente análoga ao problema computacional que você propôs? Veja só: os entrevistados (usuários) respondem (digitam) com um número qualquer, mas apenas um subconjunto desses números, que correspondem aos candidatos válidos (números de 1 a 9), são de interesse para a sua contabilização, e um valor específico, 27 (0), lhe indica que pode interromper a pesquisa (leitura) e apresentar a contabilização até o momento.

Se você sabe resolver um problema, sabe resolver o outro. E se você sabe expressar a solução de um deles em Português, transformar isso num programa em C (ou qualquer outra linguagem) é uma mera questão de tradução.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Pedro Victor
Nerdiarretado

(usa Arch Linux)

Enviado em 12/04/2019 - 15:46h

paulo1205 escreveu:

Esqueça o computador e o C. Vamos imaginar uma situação semelhante em que você teria de fazer algo parecido, usando, no máximo, lápis e papel para ajudá-lo.


Agradeço desde já toda a preocupação em criar um texto todo, porém eu gostaria não de um código mas, de um ponto inicial, pois comecei a estudar c a pouco tempo, e fico muito confuso, tentei com for e não consegui e agora tentando com do while.

Consegui fazer para até 20 números, porém para n números se torna complicado e confuso ao mesmo tempo.

#include <stdio.h>

int main() {

int numOcorrencias[10];
int n;

for(int i = 0; i < 10; i++) {
numOcorrencias[i] = 0;
}

printf("Digite 20 numeros entre 0 e 9: ");

for(int i = 0; i < 20; i++) {
scanf("%d", &n);
numOcorrencias[n]++;
}

for(int i = 0; i < 10; i++) {
printf("%d ocorreu %d vezes\n", i, numOcorrencias[i]);
}

return 0;

}




4. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/04/2019 - 17:04h

Permita-me insistir com a dica de deixar o C de lado, por enquanto.

Você conseguiria escrever os passos em Português, puro e simples, sem tentar fazer em “Portugol” ou linguajar técnico? Se sim, experimente fazer isso, aqui mesmo, no fórum.



Depois, na hora de voltar ao C, você pode usar as dicas dadas pelo próprio enunciado. Veja como ele diz “leia números inteiros até o usuário digitar [o valor igual a] 0”. Outra forma de dizer a mesma coisa é “leia números inteiros enquanto o usuário não digitar [o valor igual a] 0” ou “leia números inteiros enquanto o usuário digitar valores diferentes de 0”.

Note que nada o enunciado diz quando o valor zero será detectado, nem que você tenha de se preocupar com quantos valores foram digitados até um dado momento. A única condição para parar o laço de repetição é o valor que acabou de ser lido.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


5. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Pedro Victor
Nerdiarretado

(usa Arch Linux)

Enviado em 02/05/2019 - 12:46h

CONSEGUI
Depois de muita insistência desenrolei.

#include <stdio.h>

int main () {
int i, n, nVezes[10];

for(i=0; i < 10; i++) {
nVezes[i] = 0; }

printf("Digite números entre 1 e 9 (inclusive)\n");

for(i= 0; i <100; i++) {
scanf("%i", &n);
if (n== 0) { break; }
nVezes[n]++;
}

for(i=1; i<10; i++) {
printf("%i foi digitado %i vezes\n", i, nVezes[i]);
}
}




6. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 02/05/2019 - 13:04h

Amigo, se me permite acrescentar um detalhe, mesmo depois de já ter dado por resolvido o tópico.

Seu código não me parece o mais adequado à situação dada na questão. Como o Paulo bem disse, a palavra-chave é "enquanto", que em C se transmuta no comando "while".

Se fosse você faria uma revista nele, já com esse comando em mente.


7. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 02/05/2019 - 17:51h

Segue exemplo em bash . . .
#!/bin/bash
VM="\e[1;38;05;1m"
FC="\e[0m"
clear;
n=0;N=0;Z=0;

LINE() { printf '%*s' "40" '' | sed "s/ /—/g";}

for ((X=1;X<10;X++)) { NNS[$X]=0;} #Gera array NNS[1] a NNS[9] com VALOR=0, para cada Nº, um array...

while :;do #Laço infinito
let Z++;
printf "\e[2;f Participante Nº $Z \e[3;f Digite um Número Inteiro: ";read -n1 NN
sleep 0.0625;printf "\e[3;28f "; #"Apaga o anterior"
if [[ $NN =~ ([1-9]) ]];then #Se digitado de 1 a 9
let N++; #Contabiliza Nº de "eleitores" válidos
let NNS[$NN]++; #Guarda no array
elif [[ $NN =~ ([^[:digit:]]) ]];then #Se não é número, manda mensagem
echo -e "\n$(LINE)\n${VM} Digitação Incorreta! \n Digite um Nº Inteiro.\n \"$NN\", não é um Número! ${FC}\n$(LINE)\n";sleep 1;clear;
elif [[ $NN =~ ([0]) ]];then #Se é "0", interrompe o laço, e mostra os resultados.
clear;
((${N}>0)) && { #Evitar divisão por "0" na resposta...
Z=$((Z-1));
echo -e "$(LINE)\n Resultado da Pesquisa:\n$(LINE)\n"
for n in {1..9};do
awk '{printf " Num: %02d escolhido %01d X => %.4f%%\n" ,$1,$2,($2/$3*100)}' <<< "$n ${NNS[$n]} $N";
done
echo -e "\n$(LINE)\n \"$Z\" Participantes, \"$N\" escolhas válidas.\n Indice: $(awk '{printf "%.2f%%\n" ,($1/$2*100)}' <<< "$N $Z")\n$(LINE)\n"
break; }\
|| { echo -e "$(LINE)\n${VM} Sem Resultados.\n \"$N\" Participantes.${FC}\n$(LINE)\n";break;}
fi
done



Att.: Marcelo Oliver


8. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/05/2019 - 08:56h

Sem firulas de cores (ainda mais hardcoded para um tipo de terminal específico), linhas e apagamentos de tela, e em C.

#include <stdio.h>

#define PRIMEIRO_NUMERO_INTERESSE 1
#define ULTIMO_NUMERO_INTERESSE 9

// Declarando o array como variável estática (globais são estáticas) ele já começa com todos os elementos zerados.
unsigned numeros_interesse[ULTIMO_NUMERO_INTERESSE+1-PRIMEIRO_NUMERO_INTERESSE];


int main(void){
int numero;
do {
// O enunciado não pede que tenha um prompt antes de ler cada número, mas vamos colocar um prompt
// aqui, cientes de que é uma firula, e porque é para demonstração. Se o exercício tiver vindo de um site
// como o SPOJ, esse prompt vai fazer com que o resultado seja interpretado como errado.
printf("Digite um valor inteiro (0 para encerrar): ");
if(scanf("%d", &numero)!=1){
// O enunciado também não pede detecção e tratamento de erros de leitura, mas fica aqui como
// ilustração, e porque Debian e derivados exigem que se trate o valor retornado por scanf().
fprintf(stderr, "Erro de leitura.\n");
return 1;
}
if(numero>=PRIMEIRO_NUMERO_INTERESSE && numero<=ULTIMO_NUMERO_INTERESSE)
// O deslocamento “-PRIMEIRO_NUMERO_INTERESSE” é porque, em C, todos os arrays
// iniciam com índice 0.
++numeros_interesse[numero-PRIMEIRO_NUMERO_INTERESSE];
} while(numero!=0);
for(numero=PRIMEIRO_NUMERO_INTERESSE; numero<=ULTIMO_NUMERO_INTERESSE; ++numero)
// O enunciado só pede que se diga quantas vezes foram lidos cada um dos números de interesse.
// Num site como o SPOJ, bastaria imprimir a sequência dos valores de cada número (uma vez que
// eles são mesmo sequenciais). Aqui, porém, vou imprimir um texto explicativo.
printf("O valor %d foi lido %u vezes.\n", numero, numeros_interesse[numero-PRIMEIRO_NUMERO_INTERESSE]);

return 0;
}



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


9. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Pedro Victor
Nerdiarretado

(usa Arch Linux)

Enviado em 03/05/2019 - 10:35h

Eu agradeço a todos os comentários, mas tenho uma filosofia de tentar resolver os algortimos sempre com o for, caso seja inviável para mim tento com os outros laços.


10. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/05/2019 - 14:03h

Nerdiarretado escreveu:

Eu agradeço a todos os comentários, mas tenho uma filosofia de tentar resolver os algortimos sempre com o for, caso seja inviável para mim tento com os outros laços.


O problema com o seu programa não é que você tenha usado for, mas sim o fato de ter uma condição de parada que não existe no enunciado, que é a de parar a repetição após ler cem números.

Outro é supor que todos os valores inteiros lidos estarão na faixa que tem de ser contabilizada. O enunciado não diz que os valores digitados estarão na faixa de 1 a 9, mas que serão digitados valores inteiros e que você deve contabilizar os que estiverem na faixa de 1 a 9. Percebe a diferença?


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


11. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/05/2019 - 19:32h

Nerdiarretado escreveu:

Eu agradeço a todos os comentários, mas tenho uma filosofia de tentar resolver os algortimos sempre com o for, caso seja inviável para mim tento com os outros laços.


Cuidado com essa “filosofia”, pois ela está em algum lugar entre o simplista demais para ser séria e o contraproducente inútil.

O comando for do C é bastante versátil. Para entender por que, eis duas construções equivalentes.
for(expressão_1; expressão_2; expressão_3)
comando

{
expressão_1;
if(expressão_2)
do
comando
while((expressão_3), (expressão_2))
}

Nos exemplos acima, “comando” pode ser um comando simples (inclusive um comando vazio), terminado por um ponto-e-vírgula, ou um bloco de comandos, colocados entre chaves. Adicionalmente, quando se usa for, qualquer uma das três expressões pode ser uma expressão vazia; com a segunda construção equivalente, a expressão_2 não pode ser vazia (mas pode-se conseguir efeito semelhante trocando-a por um valor não-nulo, como 1 ou true), e uma expressão_3 vazia implicaria remover a vírgula da expressão entre parênteses do while (ou manter a vírgula, mas trocar a expressão por uma expressão inócua qualquer).

Mesmo assim, nem sempre vale a pena usar for. O principal caso é quando você quer que o comando (e possivelmente também a expressão_3) seja executado pelo menos uma vez antes de avaliar a expressão_2, caso esse em que se costuma preferir a construção “do comando while(expressão);”. Para conseguir o mesmo resultado com for, você teria de repetir o comando uma vez antes do laço de repetição, o que é deselegante e particularmente inconveniente quando se trata de um comando composto.

Outro caso em que não vale a pena usar for é quando você não tem de avaliar algo que seria a expressão_1 e também quer executar a expressão_3 (ou parte dela) apenas em determinados casos, não ao final de cada iteração.

Outra razão para não usar sempre for, que nos traz de volta ao campo de “filosofia”, é que é conveniente que você use construções semelhantes ao que outros programadores usariam, de modo que seja mais fácil para que eles compreendam seu código, e você, os deles. Um certo paper de teor humorístico (se não me engano, intitulado “Real Programmers Don't use Pascal”) dizia que “um Programador de Verdade determinado consegue escrever programas em FORTRAN usando qualquer linguagem”. É óbvio que é uma piada. Você não quer ser o cara que quer escrever um programa com uma cara diferente da que se espera de programas escritos naquela linguagem, e eu garanto que, se você realmente enveredar pela área, não vai gostar de encontrar código feitos por terceiros que pareçam muito diferentes do que você esperaria encontrar. Assim como acontece com as linguagens naturais, a comunicação é melhor quando as pessoas falam a mesma língua e usam as mesmas expressões com os mesmos sentidos. É em geral, portanto, uma boa filosofia falar a mesma língua dos seus pares.

Outra boa filosofia, diretamente aplicável (mas não aplicada) no seu programa, é a de sempre verificar o valor informado pelo usuário, antes de fazer operações diretas com ele. Para entender por que, pense no que aconteceria com o programa se o usuário digitasse 1000000 (ou mesmo apenas 10, ou um valor negativo) como valor na entrada.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


12. Re: Escreva um programa que leia números inteiros até o usuário digitar 0 [VETORES] [RESOLVIDO]

Pedro Victor
Nerdiarretado

(usa Arch Linux)

Enviado em 08/05/2019 - 11:48h

Olá Paulo,
Muito esclarecedor seu texto, agradeço bastante e percebo que estou um tanto errado. Comcei a programar em C recentemente (em uma disciplina de programação, no meu curso) e acaba para mim, sendo um pouco complicado ver outros laços, pois me acostumei com o for e consigo fazer praticamente tudo com ele. Dessa forma para mim fica mais fácil desenvolver um programa que use somente o laço for. Sei que estou totalmente errado, mas o curso faz com que você não tenha tempo para se aprofundar melhor na linguagem e acabe tendo que se virar. Mas gostaria que se pudesse me indicar uma boa fonte para futuramente está estudando agradeceria bastante.