Ir ao conteúdo

Posts recomendados

Postado

Boa tarde.

Estou fazendo um exercício, desenvolvi uma solução porém não esta funcionando, estou há alguns dias tentando resolver porém empaquei.

Escreva um programa que leia a idade e o primeiro nome de 10 pessoas. Seu programa deve terminar quando uma idade negativa for digitada. Ao terminar, seu programa deve escrever o nome e a idade das pessoas mais jovens e mais velhas.

 

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

int main()
{
    int i=0;
    int idade[10];
    int troca_idade;
    char nome[10][20];
    char troca_nome[20];
    
    for (i=0;i<10;i++){
        printf("Digite o %i nome: ",i);
        fgets(nome[i],20,stdin);
        setbuf(stdin,NULL);
        printf("Digite a idade: ");
        scanf("%i",&idade[i]);
        setbuf(stdin,NULL);
        if (idade[i]<0){
            break;
        }
    }
    
    for(i=0;i<10;i++){
        if (idade[i]<idade[i+1]){ // Se a posição atual for menor que a seguinte não faz nada, se for diferente começa.Lembrando que estou espelhando a posição da idade com os nomes.
            
        }
        else{
            troca_idade=idade[i];//troca_idade esta com maior valor
            // troca_nome=nome[0];
            strcpy(troca_nome, nome[i]);
            
            idade[i]=idade[i+1];//idade[i] esta com o valor menor
            //nome[i]=troca_nome[0];
            strcpy(nome[i],nome[i+1]);
            
            
            idade[i+1]=troca_idade; //A posição a frente (i+1) esta com o maior vetor
            //nome[i+1]=troca_nome[0];
            strcpy(nome[i+1],troca_nome);
            
            printf("\n%i",i);
            i=0; //Se for feita uma alteração zera o contador, para refericação de todo o vetor novamente, só sai do loop quando na mudar nada de lugar.
        }
    }
    
    for (i=0;i<10;i++){
        printf("idade: %i nome: %s ",idade[i],nome[i]);
    }
    return 0;
}

A logica e a seguinte, se a posição posterior for maior que a atual ambas trocam de valor, a cada vez que troca zera o contador, para reverificar tudo, só sai do Loop quando não fizer mais nenhuma modificação !

Acredito que o problema esteja no contador i do FOR, quando mando imprimir só aparece o valor 2.

Sei que é um problema simples e banal, mas fiquei alguns dias tentando resolver. E as soluções que tento esta dando perigo no compilador, nem chego a testa-las.

 

Postado
1 hora atrás, Jessé P. de Melo disse:

das pessoas mais jovens e mais velhas.

se estas palavras não estivessem no plural este programa seria muito fácil de fazer.

acho que muitos tentariam com while mas como você deixou seu modelo em for 

então  como dizer as menores idades e as maiores idades? acredito que existam muitas maneiras e uma delas é a ordem numerica.

#include <stdio.h>
#include <string.h>

int main(){
	
    int idade[10],i,aux,j;
    char nome[10][20];
    
    for (i=0;i<10;i++){
        printf("Digite o nome %d: ",i+1);
        scanf("%s",nome[i]);
        printf("Digite a idade %d: ",i+1);
        scanf("%d",&idade[i]);     
}
    	for (i=0;i<10;i++){
    		 for( j=i+1; j<11; j++ ){
    		 	if( idade[i] > idade[j] ){
    		 		aux = idade[i];
    		 		idade[i] = idade[j];
    		 		idade[j] = aux;
    }
}
}
printf("\n A idade dos mais novos para os mais velhos: \n");
           for(i=0;i<10;i++){
            printf(" %d \n",idade[i]);
           }     
    
}

 

  • Curtir 1
Postado

Olá!

veja bem: Seu exercício pede pra você digitar os 10 nome e idade das pessoas. Seu programa termina quando uma Idade negativa for digitada. E no final, seu programa deve mostra os Nomes com idade mais jovens, e Nomes com idade mais velhos. O processo, seria basicamente assim:

Entrada.:

Dig, [1] Nome: Jõ

Dig, [1] Idade: 40

Dig, [2] Nome: Mag

Dig, [2] Idade: 18

 

.....Até 10................

 

Saída deve mostra em Ordem crescente por Idade, Exemplo:

O mais Jovem: Mag, Idade: 18 Anos.

O mais velho: Jô, Idade: 40 Anos

 

Deveria seguir essa Lógica, mas veja detalhes logo nas variável do seu Algorítimo:

int i=0;

int idade[10];

int troca_idade;

char nome[10][20];

char troca_nome[20];

...............................

Que na minha Opinião tá errado em 'troca_nome e idade!', e que o certo seria lá na variável é 'Int Jovem, velhos', muito simples.

 

Por isso que você tá quebrando cabeça... e através da correção, reveja a lógica e corrija  os problemas postando o algoritmo atualizado.

 

Espero ter ajudado.

 

Postado

Você não está acompanhando quantas pessoas leu: entenda que pode não ter lido nenhum por exemplo. Precisa contar o número efetivos dos lidos para fazer do jeito que está tentando.

 

Basta o cara digitar um nome e depois -1 e já era. Do jeito que escreveu só funcionaria (se o resto estivesse certo) para exatamente 10 valores.

 

Você está guardando os valores num vetor. Tudo que você precisa saber é a posição do mais novo e mais velho que você viu. Só isso. Só dois números. Não há necessidade complicar as coisas.


Declare por exemplo

int posicao_do_mais_velho = -1;
int posicao_do_mais_novo = -1;

E conforme vai lendo mantenha atualizado. Só isso. Só um loop. O nome vai estar lá na posição, a idade vai estar lá na posição...

 

E entenda que mesmo isso é desnecessário: Você não precisa sequer do vetor: basta guardar o nome do mais velho e a idade, e o mesmo para o mais novo. E manter atualizado. Tanto faz se vai ler 10 ou 500. Não precisa mostrar os caras na saída. Só o mais velho e o mais novo. Só isso já resolveria seu problema:

 

    int idade;
    char nome[20];

    char nome_do_mais_velho[20];
    char nome_do_mais_novo[20];

    int posicao_do_mais_velho = -1;
    int posicao_do_mais_novo = -1;

 

adicionado 0 minutos depois
3 horas atrás, Jessé P. de Melo disse:

E as soluções que tento esta dando perigo no compilador, nem chego a testa-las

 

Isso eu não entendi

  • Haha 1
Postado

o codigo ficou assim !

Vou fazer uma lista ordenada!

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

int main()
{
    int i=0;
    int idade[10];
    int troca_idade;
    char nome[10][20];
    char troca_nome[20];

    for (i=0;i<10;i++){
        printf("Digite o %i nome:",i);
        scanf("%s",&nome[i]);
        setbuf(stdin,NULL);
        printf("Digite a idade:");
        scanf("%i",&idade[i]);
        setbuf(stdin,NULL);
        if (idade[i]<0){
            break;
        }
    }

    for(i=0;i<9;i++){
        if (idade[i]<idade[i+1]){ // Se a posição atual for menor que a seguinte não faz nada, se for diferente começa.Lembrando que estou espelhando a posição da idade com os nomes.

        }
        else{
            troca_idade=idade[i];//troca_idade esta com maior valor
            strcpy(troca_nome, nome[i]);

            idade[i]=idade[i+1];//idade[i] esta com o valor menor
            strcpy(nome[i],nome[i+1]);


            idade[i+1]=troca_idade; //A posição a frente (i+1) esta com o maior vetor
            strcpy(nome[i+1],troca_nome);


            i=0; //Se for feita uma alteração zera o contador, para refericação de todo o vetor novamente, só sai do loop quando na mudar nada de lugar.
        }
    }
    printf("\n");
    for (i=0;i<10;i++){
        printf("idade:%i nome:%s\n",idade[i],nome[i]);
    }
    return 0;
}

porém não esta da maneira que gostaria. Quando tem que realizar muitos calculos com a primeira posição [0] fica errado, só muda de lugar umas 2 vezes.

Postado
Em 18/04/2020 às 13:38, Jessé P. de Melo disse:

Ao terminar, seu programa deve escrever o nome e a idade das pessoas mais jovens e mais velhas.

Não pude ignorar o enunciado que vem de plurais.

 

Em 18/04/2020 às 13:38, Jessé P. de Melo disse:

Escreva um programa que leia a ¹idade e o primeiro ²nome de 10 pessoas

Respeite mais sua ordem de inserção de dados: Idade, Nome corresponde bem mais a lógica do exame.

 

• Teu programa não ler na ordem ideal mais também solicita que digite por meio de mensagens ao usuário. Esse último item não faz parte do exame então não acrescenta, pois mensagens ao usuário não é um item desse exame.

 

Em 18/04/2020 às 15:21, herbertbahia disse:

se estas palavras não estivessem no plural este programa seria muito fácil de fazer.

Bastante apresentar os dois mais de cada, se couber, que satisfaz adequadamente. Atente apenas que se uma pessoa está nas duas lista então a programação está incorreta.

 

Em 18/04/2020 às 16:51, arfneto disse:

Você está guardando os valores num vetor. Tudo que você precisa saber é a posição do mais novo e mais velho que você viu

Não é somente o mais e sim as mais... o que significa dizer que pelo menos a anterior mais velha, quando couber, também faz parte da seleção. Satisfaz o que está no exame se dado as duas mais de cada critério.

 

Bons Estudos.

  • Curtir 2
Postado
6 horas atrás, Midori disse:

Se for questão de ordenar os dados é só aplicar algum algoritmo de ordenação como o

Verdade ou mais simples que ordenação; uma seleção que também é categorizar assim como é a ordenação, porém resumindo. No caso, cabe dois de cada critério.

 

Bons Estudos.

  • Curtir 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!