Ir ao conteúdo
  • Cadastre-se

C contador ++ não funcionando


ricardosaran

Posts recomendados

Não estou conseguindo fazer o contador++ funcionar. Onde estou errando? Preciso fazer que ele diga quantas vezes o menor número é repetido.

codigo(){
	int x,i,contador=0;
	int menornumero=100.00;
	for (i=0;i<6;i++){
		printf("Digite um número: ");
		scanf("%d",&x);
			if (x<menornumero){
		menornumero=x;
		}
		if (x==menornumero){
		contador++;
		}	
		}
	printf("o menor número é %d e %d números são iguais ao menor número lido\n",menornumero,contador);		
	}			
 	

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@ricardosaran    ele só vai somar o contador quando você digitar 100.00 .

você precisa usar um vetor para guardar os números e depois verificar qual é o menor e quantas vezes ele repete, e para isso você usa dois loop um dentro do outro para que teste cada número com os outros .    ou se não puder usar vetor então use 6 variáveis pois serão seis números .

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1#

@ricardosaran, sobre:

5 horas atrás, ricardosaran disse:

Não estou conseguindo fazer o contador++ funcionar. Onde estou errando? Preciso fazer que ele diga quantas vezes o menor número é repetido.

 

Veja, você só disse que não conseguiu fazer funcionar, e postou um código...  Então, o que está acontecendo de errado?

 

A sugestão seria tentar entender o que acontece, e tentar corrigir, daí, caso não consiga, relata o que não está conseguindo corrigir... (vou complementando mais abaixo)

 

 

2#

@devair1010,

 

Sobre:

5 horas atrás, devair1010 disse:

@ricardosaran    ele só vai somar o contador quando você digitar 100.00 .

No caso seria "só quando digitar um valor menor que 100.00", ou seja, se todos os números forem maiores que 100, o programa não vai funcionar. Se tiver algum menor que 100, o problema vai passaria despercebido.

 

@ricardosaran, essa questão de usar 100 também precisa ser verificado... o enunciado limita que o máximo será até 100?

Se possível, poste o enunciado completo para analisarmos também.

 

Sobre:

5 horas atrás, devair1010 disse:

você precisa usar um vetor para guardar os números e depois verificar qual é o menor e quantas vezes ele repete, e para isso você usa dois loop um dentro do outro para que teste cada número com os outros .    ou se não puder usar vetor então use 6 variáveis pois serão seis números .

Dá para pensar de maneira mais simples... então, creio que essa forma com vetores funcione também, mas seria muito engenhosa... Então, como os números são lidos em sequência, ao encontrar um atual menor, a contagem começa a partir dele.. logo, não precisando verificar o que está atrás..  (o que tira a necessidade de vetores ou variáveis para armazenar números. A medida que vai lendo um número, já dá para ir verificando)

 

Pelo que eu vi, a lógica do código original está no caminho correto, só precisando ajustar o citado no item 3#.

 

 

3#

Aqui entra o pré-comenado no item 1#: faltou relatar o que está acontecendo de errado!

 

Então, ao executar o código deu para verificar que "a quantidade de repetição" as vezes dá acima do correto... essa seria o problema?

 

Perceba que entender o problema em si já indicaria onde verificar, que no caso seria no contador, ou seja, o sugerido por @Boko Moko.

 

2 horas atrás, Boko Moko disse:

Toda vez que o menor número mudar, tem que voltar o contador, concorda ? Para que valor o contador deve voltar ?

 

Logo, ao encontrar um novo menor, é necessário reinicializar o contador (já que ele poderá estar com a quantidade do menor anterior... é simples: mudou o menor, zera o contador)

 

 

***

 

No aguardo.

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Olá! O enunciado do problema é este aqui! >> Fazer um algoritmo com uma função que leia diversos números inteiros e escreva quantos números são iguais ao menor número lido. Os números somente poderão ser lidos uma única vez.<<

Eu consegui fazer o código, onde está dando erro é na soma de quantas vezes o menor número é repetido. Ele fica assism.

Screenshot_6.png.67c4e58bb77e3eef3899fee30000879b.png

Para o programar ficar certo o resultado teria que ser "O menor número é 2 e ele é repetido 3 vezes''.

13 minutos atrás, Simon Viegas disse:

icardosaran, essa questão de usar 100 também precisa ser verificado... o enunciado limita que o máximo será até 100?

Não. Foi por minha escolha mesmo.

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Pois então.. o contador está acumulando... veja:

9 era o menor... daí, contator=1.

8 passou a ser o menor contador=2

6, contador=3

2, contador=4

2 continuou o menor, contador=5

2 novamente, contador=6.

 

Como citado:

1 hora atrás, Simon Viegas disse:

Logo, ao encontrar um novo menor, é necessário reinicializar o contador (já que ele poderá estar com a quantidade do menor anterior... é simples: mudou o menor, zera o contador)

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

É simples resolver esse questão, o primeiro número digitado é o menor número, faça antes do loop. Depois dentro do loop você terá duas situações ao ler um valor:

 

O valor será igual a ao menor número, incremente contador++.

 

Valor será menor ao menor número, ou seja temos um novo menor número, contador = 1.

 

Implemente esse algoritmo e poste os resultados obtidos.

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Eu usaria um menor número artificial, 99999

Assim o codigo fica mais simples

 

menor = 99999

A primeira comparaçào que fizzer, o número digitado sera menor, aí reinicia o contador. No mesmo lugar 

Se número for menor que o menor, o número passa a ser o menor e o contador volta a 1

se o número for igual ao menor, conta mais um

se o número num for menor que o menor, nem for igual, faz nada ...

testa o  próximo número

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1#

32 minutos atrás, daniel.oliveira disse:

E se alguém digitar  um numero maior?

 

No sentido prático da coisa, só irá dá problema se TODOS fossem maiores que o número escolhido (se pelo menos um for menor, vai funcionar de boa)... mas de qualquer forma, acredito que seria um falha na lógica mesmo...

 

Resumindo:

Para inicializar a variável menor com um valor, ideal seria utilizar o máximo valor possível do tipo numérico escolhido; ou, inicializa a variável com o primeiro valor lido. Arbitrar um valor alto creio que não é suficiente, teria que ser o máximo possível.

 

De um modo geral acho que utilizar o primeiro número seria melhor.

 

 

2#

1 hora atrás, daniel.oliveira disse:

Depois dentro do loop você terá duas situações ao ler um valor:

 

O valor será igual a ao menor número, incremente contador++.

 

Valor será menor ao menor número, ou seja temos um novo menor número, contador = 1.

 

Exatamente... (apenas que usaria o termo "se", em vez de "será". Algo como: "se o número igual ao menor número...." etc)

 

O detalhe é que  o contador só deve ser incrementado se o próximo número for igual, não poderia caso fosse maior!

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Dentro de toda análise de função é preciso saber o domínio. Por exemplo, qual temperatura da água ? então saberemos que é algum valor entre 0 e 100 portanto 9999 seria impossível. 

Se for uma idade ? 200 seria um valor impossível

Porém, a gente nunca pode subestimar a estupidez dos usuários, né mesmo ? Para esse caso, os testes que tornariam o programa a prova de débil-mental o tornariam bastante complicados. Por exemplo, o usuário está usando input de valores inteiros. Entào devolvo a pergunta. E se o usuário digitar uma palavra em vez de um número ? 

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Boko Moko.

 

1#

Sobre:

38 minutos atrás, Boko Moko disse:

Dentro de toda análise de função é preciso saber o domínio.

De fato. Se inicialmente tomarmos como base que serão só inseridos valores válidos, o "domínio" resumiria bem o limite máximo, ou seja, o menor até poderia ser inicializado com o maior valor possível dentro do domínio. (já que toda imagem pertence ao domínio)

 

 

2#

Sobre:

42 minutos atrás, Boko Moko disse:

Por exemplo, qual temperatura da água ? então saberemos que é algum valor entre 0 e 100 portanto 9999 seria impossível. 

Deu para entender o contexto, mas só para enriquecer o papo.. "a temperatura da água" não está só nessa faixa de 0 a 100... isso talvez apenas na CNTP e só considerando como ela no estado líquido... (e sendo H20 puro). Logo, a faixa então poderia ser diferente, pois depende do que define como "água" e qual a pressão envolvida... (a pressão influencia no ponto de ebulição e fusão)... acho que seria por ai... :D

 

 

3#

49 minutos atrás, Boko Moko disse:

Porém, a gente nunca pode subestimar a estupidez dos usuários, né mesmo ? Para esse caso, os testes que tornariam o programa a prova de débil-mental o tornariam bastante complicados.

Sim... mas esse tipo de teste está além do escopo... ou seja, aqui estaria subentendido que seriam inseridos números válidos. Em um contexto comum de testes, poderíamos inserir números maiores que 100 normalmente... da mesma forma maiores que 99999. Entende?  Se todos os números forem maior que esse número, o programa não vai funcionar.

 

Nesse sentido, continuo achando que caso queira já inicializar, teria que usar um limite máximo do tipo numérico escolhido, pois o domínio de números do programa estaria limitado pela faixa de números do tipo numérico escolhido (já que não houve limitação explícita no enunciado)

 

 

Complemento mais abaixo:

 

4#

55 minutos atrás, Boko Moko disse:

Por exemplo, o usuário está usando input de valores inteiros. Entào devolvo a pergunta. E se o usuário digitar uma palavra em vez de um número ? 

Como sugerido, essa seria uma questão posterior... diria como uma "implementação de melhoria" no algoritmo... geralmente, para exercícios, não é aplicada. Digitar um "não número" não está no escopo em si... como comentado, é esperado que os dados sejam digitados corretamente. Da mesma forma que pode ocorrer de informarem um não número, poderiam também inserir números fora da faixa do tipo numérico (um número muito alto, ou baixo de mais)... ou seja, são possíveis problemas, que no nível de programação do contexto, não precisam se preocupar...  Daí, caso queiram ir além, poderia ser implementado APÓS ter um código simples pronto.

 

 

 

 

 

 

 

 

adicionado 27 minutos depois

Para não perder o foco...

 

@ricardosaran. De um modo simples, você só precisa inicializar o contador ao encontrar um novo número menor, algo assim:

#include <stdio.h>  /* printf() */
codigo() {
    int x,i,contador=0;
    /*int menorNumero=100.00; */ //se o número é inteiro, ele não tem parte decimal
    int menorNumero=100;

    for (i=0;i<6;i++) {
        printf("Digite um número: ");
        scanf("%d",&x);
        if (x<menorNumero) {  //se o número lido for menor que o menor atual
            menorNumero=x;    //atualiza o menor
            contador=0;       //zera o contador
        }
        if (x==menorNumero) { //se o númerido lido é igual ao então menor
            contador++;       //incrementa em um o contator
        }	
    }
    printf("O menor número é %d e %d números são iguais ao menor número lido\n",menorNumero,contador);
}
main() {
    codigo();
}


Ai entra um outro ponto sensível... no caso definir o valor inicial do contador OU inicializar o contador com o primeiro valor.

 

Por ai vai.

adicionado 35 minutos depois

 

Caso queira inicializar com o "maior valor possível", poderia fazer algo assim:

int menorNumero=INT_MAX; //inicializa com o maior número possível

E para funcionar, talvez seja necessário inserir lá em cima:

#include <climits>  /* INT_MAX     */

 

  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

5 horas atrás, Simon Viegas disse:

Deu para entender o contexto, mas só para enriquecer o papo.. "a temperatura da água" não está só nessa faixa de 0 a 100... isso talvez apenas na CNTP e só considerando como ela no estado líquido... (e sendo H20 puro). Logo, a faixa então poderia ser diferente, pois depende do que define como "água" e qual a pressão envolvida... (a pressão influencia no ponto de ebulição e fusão)... acho que seria por ai..

Isso mesmo :) Eu citei a temperatura da água justamente por causa disso que você falou. Em condições normais, variará de 0 a 100 porém, submetida a pressão alta ou muito baixa ... pode-se ter água em muitas outras temperaturas.

 

5 horas atrás, Simon Viegas disse:

Sim... mas esse tipo de teste está além do escopo... ou seja, aqui estaria subentendido que seriam inseridos números válidos. Em um contexto comum de testes, poderíamos inserir números maiores que 100 normalmente... da mesma forma maiores que 99999. Entende?  Se todos os números forem maior que esse número, o programa não vai funcionar.

Concordo novamente. Por isso que acho que o debate é bom. O argumento do Oliveira é "ahhh mas se o cara digitar um valor maior" ... portanto, abrimos a porteira e fugimos do escopo como você mencionou. Podemos supor que o usuário digitará letras e nào só algarismos, e por aí vai. O que importa é a técnica demonstrada. Se usar um valor grande para inicializar a variável o algoritmo fica mais simples e mais eficaz e está dentro do escopo.

 

adicionado 14 minutos depois
5 horas atrás, Simon Viegas disse:

E para funcionar, talvez seja necessário inserir lá em cima:


#include <climits>  /* INT_MAX     */

excelente dica.

 

No COBOL velho de guerra tinha o famigerado "high value"

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Admitir o primeiro número digitado pelo usuário como sendo o menor número inicial é a solução mais robusta, justamente porque não há necessidade de lidar com valores maiores que um valor máximo atribuído inicialmente.

#include <stdio.h>  /* printf() */
#include <stdio.h>  /* printf() */
void codigo() {
    int x,i,contador=0;
    int menorNumero;

    printf("Digite um número: ");
    scanf("%d",&menorNumero);
    contador++;
    for (i=0;i<5;i++) {
        printf("Digite um número: ");
        scanf("%d",&x);
        if (x<menorNumero) {  //se o número lido for menor que o menor atual
            menorNumero=x;    //atualiza o menor
            contador=0;       //zera o contador
        }
        if (x==menorNumero) { //se o númerido lido é igual ao então menor
            contador++;       //incrementa em um o contator
        }    
    }
    printf("O menor número é %d e %d números são iguais ao menor número lido\n",menorNumero,contador);
}
int main() {
    codigo();
    return 0;
}
  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1#

@isrnick, sobre:

12 horas atrás, isrnick disse:

Admitir o primeiro número digitado pelo usuário como sendo o menor número inicial é a solução mais robusta, justamente porque não há necessidade de lidar com valores maiores que um valor máximo atribuído inicialmente.

 

Eu também acho assim um melhor opção. mas de um certo modo tanto faz.

 

Só complementando. Além de assim:

12 horas atrás, isrnick disse:

    printf("Digite um número: ");
    scanf("%d",&menorNumero);
    contador++;
    for (i=0;i<5;i++) {

 

Poderia fazer assim:

    printf("Digite um número: ");
    scanf("%d",&x);
    menorNumero=x; //inicializa o menor com o primeiro
    contador++;
    for (i=0;i<5;i++) {

Vai dar no mesmo... só uma forma, talvez, mais didática.

 

 

2#

@ricardosaran

Sobre o uso de acentos, aqui no Dev++ 5.11 fica bagunçado. Uma solução seria fazer assim:

int main() {
    setlocale(LC_ALL, "Portuguese"); //habilitar acentos no console      
    codigo();
    return 0;
}

Para o comando ser reconhecido, precisa inserir lá a biblioteca correspondente lá no topo do código, algo assim:

#include <locale.h> /* setlocale() */
#include <stdio.h>  /* printf()    */   //obs.: acho que o locate.h também já carrega o printf(), mas pode deixar assim

 

Desta forma... os acentos dos textos funcionaram normalmente... (pelo menos aqui no Dev++ funciona).

 

***

 

Att

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu não queria causar polêmica, mas programação é isso mesmo existe diversas formas de resolver um determinado problema, e todas alternativas estão certa. Mas sempre penso em reutilização de código e professores ensinam isso, por exemplo ao setar um valor como limite, você ao usar seu programa para números maiores terá que reescrever a linha de código para suportar tal limite, isso é simples em um programa de 100 linhas de código, agora imagine ter 50 mil linhas? Os criadores de C fizeram uma biblioteca padrão de limites até porque o limite de um int varia de computador para computador, de sistema para sistema. Então eu formulei minha resposta sendo que solucionando a questão assim eu não precisarei de mudar meu algoritmo futuramente, ele rodará até sei lá num computador pré histórico onde o valor máximo de um int seja maior que 99999.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

aproveitando o código do ISRNICK

#include <stdio.h>  /* printf() */
void codigo() {
    int x,contador=1;
    int menorNumero;

    printf("Digite um número: ");
    scanf("%d",&menorNumero);
    /* como a variável i só servirá para contar o loop, é bom declarará-la no bloco do for */ 
    for (int i=1;i<=4;i++) {  /* já que não estamos indexando vetor algum, para ficar mais claro o for use de 1 até o limite */ 
        printf("Digite um número: ");
        scanf("%d",&x);
        if (x<menorNumero) {  //se o número lido for menor que o menor atual
            menorNumero=x;    //atualiza o menor
            contador=0;       //zera o contador
        }
        contador +=  (x==menorNumero) { //se o númerido lido é igual ao então menor
        }    
    }
    printf("O menor número é %d e %d números são iguais ao menor número lido\n",menorNumero,contador);
}
int main() {
    codigo();
    return 0;
}

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...