diff --git a/.gitignore b/.gitignore index cd531cf..f335526 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ Module.symvers Mkfile.old dkms.conf +# Project-generated files +dicionario.txt +bin/main \ No newline at end of file diff --git a/Arquivo-Guia - Pergunta.pdf b/Arquivo-Guia - Pergunta.pdf new file mode 100644 index 0000000..bee1c76 Binary files /dev/null and b/Arquivo-Guia - Pergunta.pdf differ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fb71ea1 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +BIN_DIR = bin + +all: $(BIN_DIR)/main + +$(BIN_DIR)/main: main.c include/dicionario.c + @echo "Compiling main.c" + @gcc -c main.c -I include/ -o main.o + + @echo "Compiling dicionario.c" + @gcc -c include/dicionario.c -o dicionario.o + + @echo "Linking main.o and dicionario.o" + @gcc main.o dicionario.o -o bin/main + + @echo "Cleaning up" + @rm -f main.o + @rm -f dicionario.o + +clean: + @echo "Cleaning up" + @rm -f bin/main + @rm -f dicionario.txt diff --git a/README.md b/README.md index ef1f88f..d431d1a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,44 @@ -# Trabalho_Bimestral_C +# Primeiro Dicionário do Samuel +Este projeto é um programa simples de linha de comando que lê um arquivo de texto, cria um dicionário de palavras únicas e escreve o dicionário em um arquivo de saída em ordem decrescente. O programa é escrito em C e consiste em três arquivos: `main.c`, `dicionario.c` e `dicionario.h`. O arquivo `main.c` contém a função principal que executa o programa, enquanto `dicionario.c` e `dicionario.h` contêm funções auxiliares para trabalhar com o dicionário. + +## Como usar + +Para usar este programa, siga estes passos: + +1. Clone o repositório ou baixe os arquivos para o seu computador. +2. Abra um terminal e navegue até o diretório que contém os arquivos. +3. Execute o comando `make` para compilar o programa. +4. Execute o programa digitando `./bin/main` no terminal. +5. O programa lerá o arquivo de entrada `texto.txt`, criará um dicionário de palavras únicas e escreverá o dicionário no arquivo de saída `dicionario.txt`. + +## Arquivos + +### main.c + +O arquivo `main.c` contém a função principal que executa o programa. Ele abre o arquivo de entrada, cria um dicionário de palavras únicas, escreve o dicionário no arquivo de saída e, em seguida, libera a memória usada pelo dicionário. O arquivo inclui o arquivo de cabeçalho `dicionario.h` e usa as funções definidas em `dicionario.c`. + +### dicionario.c + +O arquivo `dicionario.c` contém funções auxiliares para trabalhar com o dicionário. Ele inclui o arquivo de cabeçalho `dicionario.h`, que define as funções usadas em `main.c`. O arquivo contém três funções: + +- `insert_word`: Insere uma nova palavra no dicionário em ordem alfabética. +- `binary_search`: Procura no dicionário por uma palavra específica usando busca binária. +- `to_lowercase`: Converte uma palavra em minúsculas. + +### dicionario.h + +O arquivo `dicionario.h` contém protótipos de função para as funções auxiliares definidas em `dicionario.c`. Ele é incluído tanto em `main.c` quanto em `dicionario.c`. + +### Makefile + +O `Makefile` é usado para compilar o programa. Ele inclui regras para compilar `main.c` e `dicionario.c` e vinculá-los em um arquivo executável `main`. Ele também inclui uma regra `clean` para remover o arquivo executável e o arquivo de saída. + +## Conclusão + +Este projeto demonstra como ler e escrever arquivos em C, bem como como usar funções auxiliares para manipular dados. Ele fornece um exemplo simples de como criar um dicionário de palavras únicas a partir de um arquivo de texto. + +## Pendente + +- Inserir testes alternativos em uma pasta +- Comentar melhor o código diff --git a/bin/.gitkeep b/bin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/include/dicionario.c b/include/dicionario.c new file mode 100644 index 0000000..e66b671 --- /dev/null +++ b/include/dicionario.c @@ -0,0 +1,37 @@ +#include +#include +#include "dicionario.h" + +// Insere uma nova palavra no dicionário de palavras +void insert_word(char **dict, int *size, char *word) { + int i; + for (i = *size-1; i >= 0 && strcmp(dict[i], word) < 0; i--) { + strcpy(dict[i+1], dict[i]); + } + strcpy(dict[i+1], word); + (*size)++; +} + +// Faz busca binária no dicionário de palavras +int binary_search(char **dict, int left, int right, char *word) { + if (right >= left) { + int mid = left + (right - left) / 2; + if (strcmp(dict[mid], word) == 0) { + return mid; + } + if (strcmp(dict[mid], word) > 0) { + return binary_search(dict, mid+1, right, word); + } + return binary_search(dict, left, mid-1, word); + } + return -1; +} + +// Converte a palavra para letras minúsculas +void to_lowercase(char *word) { + int i = 0; + while (word[i] != '\0') { + word[i] = tolower(word[i]); + i++; + } +} diff --git a/include/dicionario.h b/include/dicionario.h new file mode 100644 index 0000000..ec92ddb --- /dev/null +++ b/include/dicionario.h @@ -0,0 +1,8 @@ +#ifndef DICIONARIO_H +#define DICIONARIO_H + +void insert_word(char **dict, int *size, char *word); +int binary_search(char **dict, int left, int right, char *word); +void to_lowercase(char *word); + +#endif \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..50743fe --- /dev/null +++ b/main.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include "dicionario.h" + +const int MAX_WORDS = 100; +const int MAX_WORD_SIZE = 50; + +int main() { + FILE *input_file, *output_file; + char word[MAX_WORD_SIZE]; + char **dict; + int dict_size = 0; + + // Abre o arquivo de entrada + input_file = fopen("texto.txt", "r"); + if (input_file == NULL) { + printf("Erro ao abrir arquivo de entrada\n"); + exit(1); + } + + // Aloca memória para o dicionário de palavras + dict = (char**) malloc(MAX_WORDS * sizeof(char*)); + for (int i = 0; i < MAX_WORDS; i++) { + dict[i] = (char*) malloc(MAX_WORD_SIZE * sizeof(char)); + } + + // Lê as palavras do arquivo de entrada e insere no dicionário + while (fscanf(input_file, "%s", word) != EOF) { + to_lowercase(word); + if (strcmp(word, ".") == 0) { + break; + } + if (binary_search(dict, 0, dict_size-1, word) == -1) { + insert_word(dict, &dict_size, word); + } + } + + // Fecha o arquivo de entrada + fclose(input_file); + + // Abre o arquivo de saída + output_file = fopen("dicionario.txt", "w"); + if (output_file == NULL) { + printf("Erro ao abrir arquivo de saída\n"); + exit(1); + } + + // Escreve as palavras do dicionário no arquivo de saída + for (int i = 0; i < dict_size; i++) { + fprintf(output_file, "%s\n", dict[i]); + } + fprintf(output_file, "\nTotal de palavras diferentes no dicionario: %d", dict_size); + + // Fecha o arquivo de saída + fclose(output_file); + + // Libera a memória alocada para o dicionário de palavras + for (int i = 0; i < MAX_WORDS; i++) { + free(dict[i]); + } + free(dict); + + return 0; +} diff --git a/texto.txt b/texto.txt new file mode 100644 index 0000000..98440cb --- /dev/null +++ b/texto.txt @@ -0,0 +1,6 @@ +texT +Adventures in Disneyland +Two blondes were going to Disneyland when they came to a fork in the +road The sign read disneyland LEFT +So they went home +. \ No newline at end of file