Capa / Portfolio / 244 posts / 1,043 comentários

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&ccedil;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;
}

Nenhum Comentário