Ir ao conteúdo

Posts recomendados

Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

typedef struct registro {
    int siape;
    char nome[1024];
    char sexo[20];
    char formacao[1024];
    char tipoJornadaTrabalho[1024];
    char vinculo[1024];
    char categoria[1024];
    char classeFuncional[1024];
    int idUnidadeLotacao;
    char lotacao[1024];
    char admissao[1024];
} ;

struct registro csv[2500];

int main() {

    setlocale(LC_ALL, "Portuguese");
    int tam = sizeof(csv);
    FILE *arquivo = fopen("docentes.csv", "r");

    if (!arquivo) {
        printf("Não é possível abrir o arquivo\n");
        return 0;
    }

    char buf[1024];
    int cont_linhas = 0;
    int contador = 0, it = 0, linha =0;
    char trans_arq[1024];

    while (fgets(buf, 1024, arquivo)) {
        contador = 0;
        cont_linhas++;

        if (cont_linhas == 1) {
            continue;
        }

        char *campo = strtok(buf, ",");
        while (campo) {

            if (contador == 0) {//int
                strcpy(trans_arq, campo);
                csv[linha].siape = atoi(trans_arq);
            }

            if (contador == 1) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].nome, trans_arq);
            }

            if (contador == 2) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].sexo, trans_arq);
            }

            if (contador == 3) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].formacao, trans_arq);
            }

            if (contador == 4) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].vinculo, trans_arq);
            }
            if (contador == 5) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].categoria, trans_arq);
            }
            if (contador == 6) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].classeFuncional, trans_arq);
            }
            if (contador == 7) {//int
                strcpy(trans_arq, campo);
                csv[linha].idUnidadeLotacao = atoi(trans_arq);
            }
            if (contador == 8) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].lotacao, trans_arq);
            }
            if (contador == 9) {//char
                strcpy(trans_arq, campo);
                strcpy(csv[linha].admissao, trans_arq);
            }

            campo = strtok(NULL, ",");//separa o texto a cada virgula
            contador++;

        }
        linha++;
    }

    imprimir(csv, tam);

    fclose(arquivo);

    return 1;
}

void insertionSort(struct registro lista[], int n) {
    int i, k, y;

    for (k = 1; k < n; k++) {
        y = lista[k].siape;
        for (i = k-1; i >= 0 && y < lista[i].siape; i--) {
            lista[i+1].siape = lista[i].siape;
            lista[i+1].siape = y;
        }
    }
}

void imprimir(struct registro lista[], int n){
    int i;
    for (i = 0; i < n; i++){

        printf("Siape: %d \n", lista[i].siape);
        printf("Nome: %s \n", lista[i].nome);
        printf("Sexo: %s \n", lista[i].sexo);
        printf("Formação: %s \n", lista[i].formacao);
        printf("Tipo de Jornada de Trabalho: %s \n", lista[i].tipoJornadaTrabalho);
        printf("Vínculo: %s \n", lista[i].vinculo);
        printf("Categoria: %s \n", lista[i].categoria);
        printf("Classe Funcional: %s \n", lista[i].classeFuncional);
        printf("Id Unidade de Lotação: %d \n", lista[i].idUnidadeLotacao);
        printf("Lotação: %s \n", lista[i].lotacao);
        printf("Admissão: %s \n", lista[i].admissao);

        printf("\n");
    }
    printf("\n");
}

Olá a todos, não estou conseguindo ordernar pela primeira coluna usando o InsertionSort. Poderiam dar-me uma luz?

Segue o enunciado

2. Desenvolver um programa em linguagem C que leia esse dataset (CSV) e ordene-o com base na primeira coluna.

 

dados em anexo

Mapa.zip

Postado

Acho que esse é o 4.o tópico sobre esse exercício que vejo nesse forum nos últimos dias. 

 

Postei um programa que é praticamente a solução pra esse problema e tem uma discussão lá sobre isso. Acho que devia ler.
 

 

E teve um outro tópico sobre o mesmo problema mas não sei agora o link. Pode achar pesquisando o conteúdo que eu postei na semana passada ou na anterior, direto aqui no link do perfil dos usuários.

 

De volta ao seu programa

 

E se fossem 30 campos? Ia testar uma a um em um if?

Porque está se preocupando com os campos se sabe que vai classificar pelo primeiro? Apenas leia as linhas e carregue pra memória numa lista numerada, um vetor. Coo faria numa folha de papel.

 

E sobre o insertion sort vou dizer o mesmo que eu disse para seus dois colegas que postaram aqui sobre o mesmo problema:

 

Se vai usar insertion sort e está lendo um a um no arquivo. para que vai esperar acabar o arquivo e ter o vetor inteiro na memória pra depois classificar por inserção? Não é esperto. Use insertion sort direto da entrada e faça o simples: insira na ordem já. Isso afinal é insertion sort. 

Para que perder esse tempo todo colocando os caras primeiro fora de ordem para depois ordenar?

 

De todo modo postei uma função e uma estrutura de dados que faz dos dois modos. Dê uma olhada lá. 

 

Esse é o outro tópico sobre o mesmo problema...
 

No tópico #14 eu postei uma solução

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!