Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
ricardosaran

C contador ++ não funcionando

Recommended Posts

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

Compartilhar este post


Link para o post
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 .

Editado por devair1010
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 horas atrás, ricardosaran disse:

if (x<menornumero){ menornumero=x; }

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

 

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

E se alguém digitar  um numero maior? já que o programa não testa, o primeiro valor é o menor e contador começa com um.

você digita um valor e logo ele é o maior, menor e média, matemática básica.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas MUITO obrigado pela ajuda e pelas dicas. :)

Agradeço a todos os outros por terem ajudado também.

Editado por ricardosaran
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×