Estruturas
No canal do Youtube do "Professor Carlos Menezes" há uma aula gravada sobre estruturas.
Como faríamos um cadastro de amigos com o que já sabemos (vetor e matriz)?
Veja o código 1 exemplo:
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int main()
{ char nomes[100][60];
long int telefones[100];
char emails[100][30];
int i;
for(i=0; i<5; i++)
{ printf("FICHA %d\n", i+1);
printf("Entre com o nome: ");
fgets(nomes[i], 30, stdin);
nomes[i][strlen(nomes[i])-1] = '\0';
printf("Entre com o telefone: ");
//scanf("%d", &telefones[i]);
//usar scanf aqui deixa um pula-linha no buffer
//de teclado e atrapalha a próxima leitura
char aux[15];
fgets(aux, 15, stdin);
telefones[i] = atoi(aux);
printf("Entre com o e-mail: ");
fgets(emails[i], 20, stdin);
emails[i][strlen(emails[i])-1] = '\0';
}
for(i=0; i<5; i++)
{ printf("FICHA %d\n", i+1);
printf("Nome: %s\n", nomes[i]);
printf("Telefone: %ld\n", telefones[i]);
printf("E-mail: %s\n", emails[i]);
}
return 0;
}
Uma maneira muito melhor: usando Estrutura
O código 2 exemplifica a implementação:#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct amigo {
char nome[60];
long int telefone;
char email[30];
};
int main()
{ struct amigo vet[100];
int i;
for(i=0; i<5; i++)
{ printf("FICHA %d\n", i+1);
printf("Entre com o nome: ");
fgets(vet[i].nome, 30, stdin);
vet[i].nome[strlen(vet[i].nome)-1] = '\0';
printf("Entre com o telefone: ");
//scanf("%d", &vet[i].telefone);
//usar scanf aqui deixa um pula-linha no buffer
//de teclado e atrapalha a próxima leitura
char aux[15];
fgets(aux, 15, stdin);
vet[i].telefone = atoi(aux);
printf("Entre com o e-mail: ");
fgets(vet[i].email, 20, stdin);
vet[i].email[strlen(vet[i].email)-1] = '\0';
}
for(i=0; i<5; i++)
{ printf("FICHA %d\n", i+1);
printf("Nome: %s\n", vet[i].nome);
printf("Telefone: %ld\n", vet[i].telefone);
printf("E-mail: %s\n", vet[i].email);
}
return 0;
}
O próximo código ilustra um caso real em que seria muito vantajoso usarmos estrutura (imagine como seria o código da ordenação sem estrutura!!):
#include<stdlib.h>
#include<string.h>
struct amigo {
char nome[60];
long int telefone;
char email[30];
};
//typedef dá um apelido para a estrutura
typedef struct amigo AMIGO;
void ordenacao(AMIGO vet[], int N)
{ int i, j;
for(i=1; i<= N; i++)
for(j=0; j<N-i; j++)
if(strcmp(vet[j].nome,vet[j+1].nome) > 0)
{ AMIGO aux;
aux = vet[j];
vet[j] = vet[j+1];
vet[j+1] = aux;
}
}
int main(){
AMIGO lista[100];
int i;
for(i=0; i<5; i++){
printf("FICHA %d\n", i+1);
printf("Entre com o nome: ");
fgets(lista[i].nome, 60, stdin);
lista[i].nome[strlen(lista[i].nome)-1] = '\0';
printf("Entre com o telefone: ");
char aux[15];
fgets(aux, 15, stdin);
lista[i].telefone = atoi(aux);
printf("Entre com o e-mail: ");
fgets(lista[i].email, 30, stdin);
lista[i].email[strlen(lista[i].email)-1] = '\0';
}
ordenacao(lista, 5);
for(i=0; i<5; i++)
{ printf("FICHA %d\n", i+1);
printf("Nome: %s\n", lista[i].nome);
printf("Telefone: %ld\n", lista[i].telefone);
printf("E-mail: %s\n", lista[i].email);
}
return 0;
}
Se o uso da função strcmp() não ficou claro, teste este código:
#include <string.h>
int main()
{
printf("a, b -> %d\n", strcmp("a", "b"));
printf("b, a -> %d\n", strcmp("b", "a"));
printf("a, a -> %d\n", strcmp("a", "a"));
return 0;
}
Exercícios
Todos estes exercícios a seguir têm por base o código-base, que é um mini CRUD (Create-Read-Update-Delete, ou Criar-Ler-Atualizar-Remover).
1) Inclua novos campos, como endereço, e-mail, data de nascimento, etc.
2) Crie uma função procurar, com a assinatura abaixo, de modo que ela possa ser aproveitada tanto na funcionalidade procurar, quanto na excluir:
O retorno dessa função será o índice do elemento encontrado, ou -1, caso o mesmo não tenta sido localizado.
3) Reimplemente a função procurar de modo recursivo (particularmente não há nenhuma vantagem nesta alteração, é só para treinarmos recursividade).
DICA: veja o exercício 10 da lista de recursividade
4) Refaça a funcionalidade de exclusão de modo a não ter que copiar todos os elementos abaixo do excluído.
Código a ser substituído:
for(j=i+1; j<fichas_existentes; j++)
{
agenda[j-1] = agenda[j];
}
fichas_existentes--;
proxima--;
5) Refaça o procurar de modo a trabalhar mesmo com pedaços de nomes (dica: pesquise uma função chamada "strstr").
DICA: exemplo de uso da função strstr()
#include <string.h>
int main () {
char texto[20] = "Joao da Silva";
char pedaco1[10] = "Silva";
char pedaco2[10] = "Santos";
if(strstr(texto, pedaco1) != NULL)
printf("O pedaco %s existe dentro de %s\n",
pedaco1, texto);
else printf("O pedaco %s NAO existe dentro de %s\n",
pedaco1, texto);
if(strstr(texto, pedaco2) != NULL)
printf("O pedaco %s existe dentro de %s\n",
pedaco2, texto);
else printf("O pedaco %s NAO existe dentro de %s\n",
pedaco2, texto);
return 0;
}
6) Crie uma funcionalidade de alterar (Update do crUd).
Um gabarito pode ser encontrado em:
https://onlinegdb.com/4LDhqeypX (2º semestre de 2021)
https://onlinegdb.com/vw2meGhSf (1º semestre de 2022 - Tarde)
https://onlinegdb.com/4S2qQRPsV (1º semestre de 2022 - Noite)
Comentários
Postar um comentário