Day: July 17, 2019

C, exercício de análise

assunto: vetor dinâmico de estruturas, ficheiro de texto, ficheiro binário

pergunta: Um banco armazena num ficheiro binário informação sobre os seus clientes. Os dados de cada cliente são guardados em estruturas do tipo pessoa. Além disso, um ficheiro de texto tem armazenados vários valores inteiros relativos a alguns números de conta (um inteiro em cada linha). Escreva uma função que crie um vetor dinâmico de estruturas do tipo pessoa, para onde devem ser copiadas todas as estruturas do ficheiro que não têm um número de conta que surja no ficheiro de texto. A função tem o seguinte protótipo:
pessoa* criaVetor(char* nomeB, char* nomeF, int *total);
Recebe como parâmetros os nomes dos ficheiros e o endereço de uma variável inteira onde deve colocar o tamanho do vetor criado. Devolve o endereço inicial do vetor dinâmico. Se ocorrer algum erro, deve devolver NULL.
Ao responder a esta questão, não deve assumir que a ordem pela qual a informação surge nos 2 ficheiros é igual. Além disso, podem surgir números de conta no ficheiro de texto que não se encontram nas estruturas do ficheiro binário.

typedef struct cliente pessoa;
struct cliente{
    char nome[200];      // Nome do cliente
    char morada[200];    // Morada do cliente
    int nConta;         // Número de conta
    int montante;       // Saldo da conta
};

resposta:

pessoa* criaVetor(char* nomeB, char* nomeF, int *total) {
    FILE *f, *g;
    int n = 0, i, flag;
    int tab[n], *auxT;
    pessoa clt[*total], *auxC, *lista;
    *total = 0;
    lista = &clt[*total];
    f = fopen(nomeB, "rb");
    if(f == NULL) {
        printf("Erro a abrir para leitura o ficheiro binario [%s]\n", nomeB);
        return NULL;
    }
    g = fopen(nomeF, "rt");
    if(g == NULL) {
        printf("Erro a abrir para leitura o ficheiro de texto [%s]\n", nomeF);
        fclose(f);
        return NULL;
    }
    auxT = malloc(sizeof(int));
    if(auxT == NULL) {
        printf("Erro na alocacao de memoria\n");
        return NULL;
    }
    while(fscanf(g, "%d", auxT) == 1) {
        tab[n] = *auxT;
        n++;
        auxT = malloc(sizeof(int));
        if(auxT == NULL) {
            printf("Erro na alocacao de memoria\n");
            return NULL;
        }
        tab[n] = *auxT;     
    }
    auxC = malloc(sizeof(pessoa));
    if(auxC = NULL) {
        printf("Erro na alocacao de memoria\n");
        return NULL;
    }
    while(fread(auxC, sizeof(pessoa), 1, f) == 1) {
        flag = 1;
        for(i = 0; i < n; i++)
            if(auxC->nConta == tab[i]) {
                flag = 0;
                break;
            }
        if(flag == 1) {
            clt[*total] = *auxC;
            (*total)++;
            auxC = malloc(sizeof(pessoa));
                if(auxC = NULL) {
                    printf("Erro na alocacao de memoria\n");
                    return NULL;
                }
        }
    }
    return lista;
}

Tags : , ,

C, exercício de análise

assunto: um vetor dinâmico de estruturas
pergunta: lidar com um vetor (vector) dinâmico de estruturas, e ficheiro binário

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

typedef struct cliente pessoa;

struct cliente {
    char nome[200]; // Nome do cliente
    char morada[200]; // Morada do cliente
    int nConta; // Número de conta
    int montante; // Saldo da conta
};

void guarda_dados_binario(pessoa * exame, int totalC) {
    FILE *f;

    f = fopen("bancoBinario.bin", "wb");
    if (f == NULL) {
        printf("\n erro no acesso ao ficheiro \n");
        return;
    } else {
        fwrite(&totalC, sizeof (int), 1, f);
        fwrite(exame, sizeof (pessoa), totalC, f);
        fclose(f);
    }
}

pessoa * ler_dados_binario(int totalC) {
    FILE *f;
    pessoa * auxc;

    f = fopen("bancoBinario.bin", "rb");
    if (f == NULL) {
        printf("\n erro no acesso ao ficheiro \n");
        return 0;
    } else {
        fread(&totalC, sizeof (int), 1, f);
        auxc = malloc(sizeof (pessoa) * totalC);
        fread(auxc, sizeof (pessoa), totalC, f);
    }
    fclose(f);
    return auxc;
}

void mostra_todos(pessoa * exame, int totalC) {
    if (totalC == 0) {
        printf("nao existem clientes\n");
    } else {
        printf("\ntotal: %d", totalC);
        for (int i = 0; i < totalC; i++) {
            printf("\n%s", exame[i].nome);
        }
    }
}

pessoa * adiciona_pessoa(int * auxtotalC) {
    int auxTotal = 0, totalC = 0;

    pessoa * auxc;

    printf("\nquantas pessoas quer adicionar?");
    scanf("%d", &totalC);
    * auxtotalC = totalC;

    auxc = malloc(sizeof (pessoa) * totalC);
    do {
        printf("Qual o nome?");
        scanf(" %99[^\n]", auxc[auxTotal].nome);
        printf("Qual a morada?");
        scanf(" %99[^\n]", auxc[auxTotal].morada);
        printf("Qual o numero da conta?");
        scanf("%d", &(auxc[auxTotal].nConta));
        printf("Qual o montante?");
        scanf("%d", &(auxc[auxTotal].montante));
        auxTotal++;
    } while (auxTotal < totalC);
    return auxc;
}
int main(int argc, char** argv) {
    pessoa * listaPessoas = NULL; // um vetor dinâmico de estruturas 
    pessoa * listaPessoas2 = NULL; // um vetor dinâmico de estruturas, para testes
    int total = 0;

    listaPessoas = adiciona_pessoa(&total);
    mostra_todos(listaPessoas, total);
    guarda_dados_binario(listaPessoas, total);

    //auxliar/verificar/para testes
    listaPessoas2 = ler_dados_binario(total);
    mostra_todos(listaPessoas2, total);

    return (EXIT_SUCCESS);
}
Tags : , ,

C, exercício de análise

assunto: lista ligada simples
pergunta: Escreva a função pdados troca(pdados p); Esta função recebe o endereço do primeiro elemento de uma lista ligada simples, constituída por nós do tipo dados. Se a lista tiver menos de três elementos, ou se o nome armazenado no primeiro nó começar por Z, a função não faz nenhuma alteração. Caso contrário, troca o primeiro com o último elemento: o primeiro passa a ser o último e o último passa a ser o primeiro. Devolve o endereço do primeiro elemento da lista depois da alteração

typedef struct t dados, *pdados;
struct t{
   char nome[100];
   int id;
   pdados prox; 
};

resposta:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct t dados, *pdados;

struct t {
    char nome[100];
    int id;
    pdados prox;
};
int totalElementos(pdados exame) {
    int conta = 0;
    if (exame == NULL) {
        printf("\n[erro] lista vazia");
        return conta;
    } else {
        while (exame != NULL) {
            conta++;
            exame = exame->prox;
        }
    }
    printf("\nexistem %d pessoas da lista", conta);
    return conta;
}

int letraZ(pdados exame) {
    if (exame->nome[0] == 'Z' || exame->nome[0] == 'z') {
        printf("\nsim existe um Z na primeira letra do primeiro nome da lista");
        return 1;
    }
    return 0;
}

pdados troca(pdados t) {
    pdados copiaPrimeiraPosicao;
    pdados copiaUltimaPosicao;
    pdados aux;
    aux = t;


    pdados ajudaUltimaPosicao;

    pdados ajudaPrimeiraPosicao;
    copiaPrimeiraPosicao = NULL;
    copiaUltimaPosicao = NULL;
    ajudaUltimaPosicao = NULL;
    ajudaPrimeiraPosicao = NULL;

    if (totalElementos(t) > 3 || letraZ(t) == 1) {
        printf("\nvou trocar");
        //estou na primeira posição
        if (t->prox == NULL) {
            //mas é o unico elemento, não existe troca
            return t;
        } else {
            //vou para a ultima posicao
            while (aux->prox != NULL) {
                aux = aux->prox;
            }

            //fazer uma copia da primeira posicao
            copiaPrimeiraPosicao = malloc(sizeof (dados));
            copiaPrimeiraPosicao->id = t->id;
            strcpy(copiaPrimeiraPosicao->nome, t->nome);
            copiaPrimeiraPosicao->prox = NULL;

            //fazer uma copia da ultima posicao
            copiaUltimaPosicao = malloc(sizeof (dados));
            copiaUltimaPosicao->id = aux->id;
            strcpy(copiaUltimaPosicao->nome, aux->nome);


            //organizar
            t->id = copiaUltimaPosicao->id;
            strcpy(t->nome, copiaUltimaPosicao->nome);
            t->prox = t->prox;

            aux->id = copiaPrimeiraPosicao->id;
            strcpy(aux->nome, copiaPrimeiraPosicao->nome);
            aux->prox = copiaPrimeiraPosicao->prox;
        }
    } else {
        printf("\nnao troquei nada\n");
        return t;
    }
    return t;
}

void listar(pdados exame) {
    if (exame == NULL) {
        printf("\n[erro] lista vazia");
        return;
    } else {
        printf("\n--listagem dos elementos--\n");
        while (exame != NULL) {
            printf("\n%d\t%s", exame->id, exame->nome);
            exame = exame->prox;
        }
    }
}

pdados adicionarLista(pdados exame) {
    pdados novo = NULL;
    pdados aux = NULL;

    novo = malloc(sizeof (dados));
    if (novo == NULL) {
        printf("\nerro: alocacao de memoria");
        free(novo);
        return NULL;
    } else {
        printf("\nqual o id\n");
        scanf(" %d", &novo->id);

        printf("\nqual o nome\n");
        scanf("%s", novo->nome);
        novo->prox = NULL;

        if (exame == NULL) {
            exame = novo;
        } else {
            aux = exame;
            while (aux->prox != NULL) {
                aux = aux->prox;
            }
            aux->prox = novo;
        }
    }
    return exame;
}

int main(int argc, char** argv) {
    pdados exame = NULL;
    int continuar = 0;
    do {
        exame = adicionarLista(exame);
        listar(exame);
        printf("\nmais algum? 1-nao/0-sim\n");
        scanf("%d", &continuar);

    } while (continuar == 0);


    exame = troca(exame);
    listar(exame);


    return (EXIT_SUCCESS);
}
Tags : , ,