Ir para conteúdo
Fórum Script Brasil
  • 0

Armazenar strings da mesma forma que vetor


princknoby

Pergunta

Olá a todos mais uma vez rsrs (as dúvidas são muitas).
 

Iniciei o estudo de string a um tempinho atrás, mas estava com bastante dificuldade, então resolvi voltar o conteúdo um pouco, e agora estou novamente em strings (as coisas estão um pouco mais claras agora).

 

Estava fazendo uma lista de exercícios, e estava indo tudo MUITO bem, mas de repente, surgiu um exercício que quebrou minha cabeça, passei horas tentando fazer, e pesquisando, mas ainda não consegui.

O exercício é o seguinte: 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.

 

Eu tentei fazer, mas não consegui, então tentei "deixar o exercício mais fácil" pra que talvez ficasse mais fácil de entender.
Então o que tentei fazer foi, ler os 10 nos e as 10 idades, e apresentar apenas o nome e idade da pessoa mais velha, consegui entender como fazer, mas pra satisfazer o exercício isso não serve, e eu ainda continuo sem saber como fazer o exercício.

O meu código:

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

void limpar () {
	int ch=fgetc(stdin);
	while (ch != EOF && ch != '\n');
}

void pausar () {
	printf ("\nPress [ENTER] to quit...");
	scanf ("%*c");
}

int main () {
	char nome[100], nomem[100];
	int i, idade[100], mid=0;

	for (i = 0; i < 5; i++) {
		printf ("Nome: ");
		scanf ("%99[^\n]", nome);
		limpar ();
		printf ("Idade %s: ", nome);
		scanf ("%d", &idade[i]);
		limpar ();
		if (idade[i] > mid) {
			mid=idade[i];
			strcpy(nomem, nome);

		}
	}

	printf ("\nPessoa mais velha: %s\n", nomem);
	printf ("Idade dessa pessoa: %d\n", mid);
	pausar ();
	return 0;
}

 

A única coisa que eu consigo pensar pra resolver, é armazenar os nomes em posições assim como eu vazia com vetores:

 scanf ("%d", &vetor[i]); //no caso de vetor 

Mas no caso de strings não faço ideia de como fazer isso, e por isso fiz o 'if' a cada laço, porque cada vez que eu fazia o laço, eu perdia o nome digitado...
Então eu já fiz o laço, e fui armazenando o nome da pessoa mais velha, em outra string, já que não consegui fazer um for comparando algo do tipo >>

 if (idade[i] > pessoa_mais_velha) {
	                      pessoa_mais_velha=idade[i];
	                     nome_pessoa_mais_velha=nome[i];//nome[i] >> nome na posição da idade da mais velha, mas isso não dá certo 😞
	} 

 

Enfim, não sei pra onde vu, alguém poderia por favor me dar uma ajuda?

Obrigado

 

 

 

Strings ainda estão sendo bem confusas pra mim ><

Editado por princknoby
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Ola @princknoby, vou tentar ajudar com o que for possivel.

2 horas atrás, princknoby disse:

Strings ainda estão sendo bem confusas pra mim ><

Não se preocupe, strings são confusas para todos que estão começando.

COMENTARIOS:

Antes de começar, gostaria de destacar alguns pontos do seu código.

2 horas atrás, princknoby disse:

void limpar () { int ch=fgetc(stdin); while (ch != EOF && ch != '\n'); }

1- Cuidado com essa função, apesar de estar funcionando, caso a primeira entrada não satisfaça o loop, o seu codigo fica presso nele já que o "ch" não é alterado. Caso seja do seu interesse abaixo vou deixar uma macro que um professor me passou para limpeza de buffer

#define CLEAN_BUFF do{ int c; while((c = getchar()) != '\n' && c != EOF);}while(0)

 

2 horas atrás, princknoby disse:

scanf ("%99[^\n]", nome);

2- Nunca tinha visto a entrada limitando quantidade de caracteres, aprendi essa agora hehe obrigado

SOLUCAO:

Agora sim, vamos ao codigo, optei por refazer e comentar, espero que dessa maneira seja o suficiente para sanar suas duvidas.

#include <stdio.h>

#define MAX_PESSOAS 10
#define MAX_NOME 100

#define CLEAN_BUFF do{ int c; while((c = getchar()) != '\n' && c != EOF);}while(0)
	
int main ()
{
	// O limite de pessoas é 10, porém o codigo pode encerrar antes.
	// essa variavel controla situacoes onde ele acabe antes
	unsigned qtdPessoas = 0;

	/// Na situacao abaixo, 
	///o nome guardado em nomes[1] esta LOGICAMENTE ligado a idades[1]
	
	// Uma matriz de strings é como um lista de nomes
	char nomes[MAX_PESSOAS][MAX_NOME];
	// E nós faremos uma ligacao logica¹ entra a matriz de nome e o vetor de idades 
	int idades[MAX_PESSOAS];
	
	// Vamos armazenar o indice do mais velho e mais novo aqui
	int velho = 0, novo = 0;
	
	//Contadores
	int i;
	
	// Inicialmente vamos supor que nosso codigo ira rodar da forma esperada
	// onde as 10 pessoas são inseridas
	for (i = 0; i < MAX_PESSOAS; i++)
	{
		printf ("Nome: ");	scanf ("%99[^\n]", nomes[i]);
		CLEAN_BUFF;
		
		printf ("Idade: "); scanf ("%d", &idades[i]);
		CLEAN_BUFF;
		
		//Caso a idade entrada seja negativa, o loop se encerra
		if (idades[i] < 0)
			break;
		// Caso contrario uma pessoa foi adicionado e a nossa variavel de controle
		// deve ser incrementada
		else
			qtdPessoas++;
	}
	
	// As variaveiz velho e novo comecaram em 0, significa que inicialmente
	// a primeira pessoa é a mais velha e a mais nova ao mesmo tempo
	for (i = 1; i < qtdPessoas; i++)
	{
		// Se a pessoa atual for mais velha que o mais velho conhecido
		if (idades[i] > idades[velho])
			velho = i;
		
		// Se a pessoa atual for mais nova que o mais novo conhecido
		if (idades[i] < idades[novo])
			novo = i;
	}
	
	printf ("Velha:\n%s\t%d\n", nomes[velho], idades[velho]);
	printf ("Novo:\n%s\t%d\n", nomes[novo], idades[novo]);
	
    return (0);
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

Cara!!!!! Incrível, aprendi MUITAS coisas com esse seu código.

Ah que fiquei mais "chocado" foi declarar uma variável e depois chamar ela de posição, e atribuir posições a ela, e na hora de imprimir, imprimir essa variável que na verdade é uma posição!!!!!!!!!!!!!!!!!!!!!!!!!
 

Aqui:

	int velho=0, novo=0;
	.....
	if ( idade[i] < idade[novo]) {novo=i}//A variavel vai receber uma posição!!!
	.....
	printf (".....%s %d", idade[novo], nome[novo]); //E eu vou poder imprimir ela aqui!!!
	



Fiquei chocado kkkkkkk e um pouco triste por nunca ter conseguido pensar isso antes kkkkk

 

Obrigado pelo código de limpeza, eu comecei a me interessar por isso quando comecei a usar o linux para programar, e queria pausar o programa, e acabei recebendo dicas aqui no fórum mesmo de qual função usar, segue o link:


Sobre limitar o scanf  aprendi aqui também rsrs link:


Seu código me ajudou muito!!!! Tentei fazer um em paralelo ao seu, até usei as mesmas variáveis, só mudei, que se digitar um negativo, ele sai do programa, olha o código ai:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PESSOAS 3
#define MAX_NOME 100
	#define limpar do{ int c; while((c = getchar()) != '\n' && c != EOF);}while(0)
	void pausar () {
    printf ("\nPress [ENTER] to quit...");
    scanf ("%*c");
}
	int main () {
    char nome[MAX_PESSOAS][MAX_NOME];
    int idade[MAX_PESSOAS];
    int i, velho=0, novo=0;
	    for (i = 0; i < MAX_PESSOAS; i++) {
        printf ("%d(o) nome: ", i+1);
        scanf ("%99[^\n]", nome[i]);
        limpar;
        printf ("Idade de '%s': ", nome[i]);
        scanf ("%d", &idade[i]);
        limpar;
        if (idade[i] < 0) {
            printf ("\nEssa idade é inválida!");
            printf ("\nSaindo do programa!\n");
            pausar ();
            exit (0);
        }
    }
	    for (i = 0; i < MAX_PESSOAS; i++) {
            if (idade[i] < idade[novo]) { //achar o mais novo
                novo=i;
            }
	            if (idade[i] > idade[velho]) {
                velho=i;
            }
    }
	    printf ("\nA pessoa mais velha é: %s com %d anos!\n", nome[velho], idade[velho]);
    printf ("\nA pessoa mais nova é: %s com %d anos!\n", nome[novo], idade[novo]);
	    pausar ();
    return 0;
} 

OBS: limitei o MAX_PESSOAS em 3 porque como ainda estou tentando compreender ao máximo, usar o valor 10 daria iria gastar mai tempo pra quando eu fosse executar o programa pra ver se esta funcionando, digitar 3 nomes e idades é bem mais rápido que 10 kkkkkk

Enfim... Você me ajudou MUITO com esse código, aprendi muitas coisas até o momento, e sei que ainda tem muita coisa ai que preciso aprender rsrs
Vamos ver se agora o programa sai rsrs

Obrigado irmão 😄

___________________________________________________________________________________
EDIT:

Acho que agora o programa saiu rsrs

Como ele pediu >> A's' mais velhas e mais novas, imaginei que quisesse que fizesse uma média de idade, e as pessoas acima da média seriam as mais velhas, e as abaixo da média seriam as mais novas. Então partindo disso (espero não estar errado na interpretação do exercício), fiz o seguinte código com a ajuda do @Nefisto :

CÓDIGO:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PESSOAS 3
#define MAX_NOME 100
#define limpar do{ int c; while((c = getchar()) != '\n' && c != EOF);}while(0)

void pausar () {
    printf ("\nPress [ENTER] to quit...");
    scanf ("%*c");
}
int main () {
    char nome[MAX_PESSOAS][MAX_NOME];
    int idade[MAX_PESSOAS];
    int i, velho=0, novo=0, soma=0, media;
    for (i = 0; i < MAX_PESSOAS; i++) {
        printf ("%d(o) nome: ", i+1);
        scanf ("%99[^\n]", nome[i]);
        limpar;
        printf ("Idade de '%s': ", nome[i]);
        scanf ("%d", &idade[i]);
        limpar;
        soma=soma+idade[i];
        if (idade[i] < 0) {
            printf ("\nEssa idade é inválida!");
            printf ("\nSaindo do programa!\n");
            pausar ();
            exit (0);
        }
    }
    //fazer a media de idades
    media=soma/MAX_PESSOAS;
    //achar as pessoas mais velhas
    /*ACIMA DA MEDIA É AS MAIS VELHAS, ABAIXO DA MEDIA AS MAIS NOVAS*/
    printf ("\n*********************\n");
    printf ("*PESSOAS MAIS VELHAS*\n");
    printf ("*********************\n");
    for (i = 0; i < MAX_PESSOAS; i++) {
        if (idade[i] > media) {
            printf ("Nome: %s - Idade: %d\n", nome[i], idade[i]);
        }
    }
    //achar pessoas mais novas
    printf ("\n********************\n");
    printf ("*PESSOAS MAIS NOVAS*\n");
    printf ("********************\n");
    for (i = 0; i < MAX_PESSOAS; i++) {
        if (idade[i] < media) {
            printf ("Nome %s - Idade: %d\n", nome[i], idade[i]);
        }
    }
    pausar ();
    return 0;
}

OBS: ainda estou lendo apenas 3 pessoas.

Obrigado @Nefisto 😄

 

Editado por princknoby
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...