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:


//Sem uso de Estruturas
#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<stdio.h>
#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 <stdio.h>
#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:


int procurar(char procurado[], struct ficha vetor[], int num_fichas)


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:

int j;
       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 <stdio.h>
#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

Postagens mais visitadas deste blog