Linha | Codigo |
001 | // Prof. Leo^nidas - http://www.matematica.br http://line.ime.usp.br |
002 | // MAC122 |
003 | // 2017/09/07 |
004 | |
005 | // Ordena vetor de palavras ("strings") usando o metodo da Bolha e trocando efetivamente as palavras de posicao |
006 | // Le de arquivo "N\n" e a seguir N linhas com um nome cada |
007 | // Complexidade: O(n*n * u), se u = comprimento medio das palavras |
008 | |
009 | // Exercicio 1: Altere o codigo para ler as linhas e deduzir numero nomes |
010 | // Exercicio 2: Prove que o algoritmo de ordenacao implementado e' estavel |
011 | |
012 | #include <stdio.h> |
013 | #include <stdlib.h> |
014 | #include <string.h> |
015 | |
016 | #define MAXCOMPLINHA 512 // maior comprimento de linha aceito |
017 | #define MAX 10000 // maior quantidade de linhas aceitas (no arquivo de entrada) |
018 | |
019 | // Leia proxima linha do arquivo apontado por 'aptf', devolva no endereco da "string" que a recebeu |
020 | char * leituraElemento (FILE *aptf, char linha[]) { |
021 | if (fgets(linha, MAXCOMPLINHA, aptf)==NULL || ferror(aptf) || feof(aptf) ) { // char *fgets(char *str, int n, FILE *stream) |
022 | printf(" - %s", linha); |
023 | if (linha != NULL) return linha; |
024 | return NULL; // final de arquivo |
025 | } |
026 | printf(" * %s", linha); |
027 | return linha; |
028 | } |
029 | |
030 | // Leia todas as linhas (de palavras) presentes no arquivo de entrada |
031 | // Primeira linha deve ter um inteiro com numero de palavras no arquivo (isso pode ser alterado, experimente) |
032 | void leituraVetor (FILE *apf, char vetStr[][MAXCOMPLINHA], int *N) { |
033 | int i = 0, f; |
034 | char *linha0; |
035 | fscanf(apf, "%d", N); printf(" - n=%d\n", *N); |
036 | f = *N; |
037 | // Em geral, apos ler o inteiro o apontador e' posicionado para proximo caractere que |
038 | // corresponderia ao final de linha ('\n'), assim precisa forcar para evitar pegar esta linha "nula". |
039 | linha0 = leituraElemento(apf, vetStr[i]); |
040 | if (linha0!=NULL && linha0[0]=='\0') f = *N+1; // ignore primeira linha |
041 | for (i = 0; i < f; i++) |
042 | if (leituraElemento(apf, vetStr[i]) == NULL) |
043 | break; |
044 | } |
045 | |
046 | // Auxiliar |
047 | void imprimeVetor (char vetStr[][MAXCOMPLINHA], int n) { |
048 | int i; |
049 | for (i = 0; i < n; i++) { |
050 | printf("%s", vetStr[i]); |
051 | } |
052 | } |
053 | |
054 | // Troque de lugar as "strings" nas posicoes i e j |
055 | void trocaEmVetor (char vetStr[][MAXCOMPLINHA], int i, int j) { |
056 | char aux[MAXCOMPLINHA]; |
057 | strcpy(aux, vetStr[i]); // aux <- vetStr[i]; |
058 | strcpy(vetStr[i], vetStr[j]); // vetStr[i] <- vetStr[j]; |
059 | strcpy(vetStr[j], aux); // vetStr[j] <- aux; |
060 | } |
061 | |
062 | // Ordena comparando palavras usando o metodo da Bolha e trocando as "strings" de posicao. |
063 | void ordenaBolha (char vetStr[][MAXCOMPLINHA], int N) { |
064 | int i, j; |
065 | for (i = 1; i < N; i++) { //D printf("\ni=%3d: ", i); |
066 | for (j = i; j > 0; j--) { //D printf("%d ", j); |
067 | if (strcmp(vetStr[j-1], vetStr[j]) > 0) |
068 | trocaEmVetor(vetStr, j, j-1); |
069 | } |
070 | } //D printf("\n"); |
071 | } |
072 | |
073 | // Comeca aqui! |
074 | int main (int argc, char *argv[]) { |
075 | FILE *apont; |
076 | char vetorDados[MAX][MAXCOMPLINHA]; |
077 | int N; |
078 | |
079 | if (argc < 2) { |
080 | printf("Necessario um nome de arquivo como parametro\n"); |
081 | printf("Arquivo com: N seguido de N strings para ordenar\n"); |
082 | return 1; |
083 | } |
084 | printf("Abre %s\n", argv[1]); //return 1; |
085 | apont = fopen(argv[1], "r"); |
086 | |
087 | leituraVetor(apont, vetorDados, &N); |
088 | |
089 | printf("\nInicial:\n"); |
090 | imprimeVetor(vetorDados, N); |
091 | |
092 | ordenaBolha(vetorDados, N); |
093 | |
094 | printf("\nOrdenado:\n"); |
095 | imprimeVetor(vetorDados, N); |
096 | |
097 | return 0; |
098 | |
099 | } |