Questão: Implemente um programa em linguagem C que leia (da entrada padrão) diversos nomes de pessoas, um nome por linha (cada linha terminada pelo caractere ‘\n’) até encontrar o sinal ‘EOF’. Linhas em branco devem ser ignoradas, e ao final da leitura o programa deve imprimir os nomes ordenados lexicograficamente (em ordem alfabética).
Utilize alocação dinâmica de meḿória e apontadores.
Exemplo :
Entrada:
Silveira Pereira
Jose da Silva Xavier Mendonca de Barros Pereira
Joao Hilton
Maria dos Santos
Saída:
Joao Hilton
Jose da Silva Xavier Mendonca de Barros Pereira
Maria dos Santos
Silveira Pereira
Modifique o programa anterior de forma que agora os dados de entrada consistam de Nome, Endereç̧o e Telefone das pessoas, cada item destes em uma linha. Ao final da leitura o programa deve imprimir os dados (nome, endereçoo e telefone) ordenados lexicograficamente pelo Nome.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define STRING_INIT 50 #define LINES_INIT 25 struct item { char *nome; char *endereco; int telefone; }; char* le_linha() { int i = 0, j = STRING_INIT; char c, *str; str = malloc(sizeof(char) * j); while ((c = getc(stdin)) && (c != '\n')) { if (c == EOF) return 0; if (i >= j) { str = realloc(str, j *= 2); } str[i++] = c; } str[i] = ''; return str; } char** le_texto() { int i = 0, j = LINES_INIT; char **txt, *tmp; txt = malloc(j * (sizeof(char*))); while ((tmp = le_linha())) { txt[i] = tmp; if (i >= j) txt = realloc(txt, j *= 2); i++; } return txt; } char** ordena_texto (char** txt) { int i = 0, j = 1; char **ret, *tmp; while (txt[i]) { while(txt[j]) { if (strcmp(txt[i], txt[j]) >= 0) { tmp = txt[i]; txt[i] = txt[j]; txt[j] = tmp; } j++; } i++; j = i; } return ret; } struct item* le_itens() { int i = 0, j = LINES_INIT; struct item *p; p = malloc (sizeof(*p) * j); while (1) { if (i >= j) p = realloc (p, j *= 2); p[i].nome = le_linha(); if (!p[i].nome) break; p[i].endereco = le_linha(); scanf("%d\n", &p[i].telefone); i++; } return p; } void imprime_itens (struct item *p) { int i = 0; while (p[i].nome) { printf ("Nome: %s\n", p[i].nome); printf ("Endereço: %s\n", p[i].endereco); printf ("Telefone: %d\n\n", p[i].telefone); i++; } } void imprime_texto (char** txt) { int i = 0; while (txt[i]) printf("%s\n",txt[i++]); } void troca (void *coisa1, void *coisa2) { void *tmp; tmp = &coisa1; coisa1 = &coisa2; coisa2 = &tmp; } struct item* ordena_itens (struct item *p) { int i = 0, j = 1, tmpi; char *tmp; while (p[i].nome) { while (p[j].nome) { if (strcmp(p[i].nome, p[j].nome) >= 0) { tmp = p[i].nome; p[i].nome = p[j].nome; p[j].nome = tmp; tmp = p[i].endereco; p[i].endereco = p[j].endereco; p[j].endereco = tmp; tmpi = p[i].telefone; p[i].telefone = p[j].telefone; p[j].telefone = tmpi; } j++; } i++; j = i; } return p; } int main () { // Primeira solução //char **txt; //txt = le_texto(); //imprime_texto(ordena_texto(txt)); // Segunda solução struct item *p = malloc (sizeof(char*)); p = le_itens(); imprime_itens(ordena_itens(p)); return 0; }