Month: September 2018

parte 6 – várias funções em C para manipulação de ficheiros e estruturas dinâmicas

Assunto deste post: várias funções em C para manipulação de ficheiros (de texto para binários e de binários para texto e estruturas dinâmicas (lista ligada e vector dinâmico de estruturas)

//ficheiro parte1.c
#include "parte1Comum.h"

int menu(){
    int i;
    puts("1 - adiciona grupo");
    puts("2 - remove grupo");
    puts("3 - lista grupo");
    puts("4 - pesquisa grupo");
    puts("5 - ");
    puts("6 - ");
    puts("7 - carregar grupo de um ficheiro binario");
    puts("8 - terminar");
    puts("Escolha uma opcao: ");
    
    do{
        scanf(" %d", &i);
    }while(i <0 || i >8);
    
    return i;
}


void main() {
    int escolha;
    pGrupo listaGrupo=NULL;
    pMesa listaMesa[TAM]={NULL};
    int totalMesas=0;
    int h, m, pessoas;
    char mesa[20];
   
     do{
         printf("\ntotal de mesas: %d\n\n", totalMesas);
        escolha = menu();
        switch(escolha){
            case 1: 
                    printf("\nA que horas e minutos vem a reserva? (formato h m)\n");
                    scanf(" %d", &h);
                    scanf(" %d", &m);
                    printf("\nQuantas pessoas?\n");
                    scanf(" %d", &pessoas);
                    printf("\nQual a mesa?\n");
                    scanf(" %99[^\n]", mesa);
                    adicionaGrupo(listaMesa[TAM], &totalMesas, &listaGrupo, h, m, pessoas, mesa);
                    break;
            case 2: break;
            case 3: 
                    listagemGrupo(listaGrupo);
                    break;
            case 4: break;
            case 5: break;
            case 6: break;
            case 7: break;
        }
    }while(escolha != 8);
    
}


//ficheiro parte1Comum.h
#ifndef PARTE1COMUM_H
#define PARTE1COMUM_H

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

#define TAM 20

typedef struct tipoA mesa, *pMesa;
typedef struct tipoB grupo, *pGrupo;

struct tipoA{
    char id[20];
    int conta, valorTot;
};

struct tipoB{
    struct hora{int h, m;} in, out;
    int num, valor;
    pMesa ptr;
    pGrupo prox;
};

pGrupo adicionaGrupo(pMesa v, int *tot, pGrupo *lista, int h, int m, int pessoas, char *idM);
void adicionaGrupoAux();
pGrupo listagemGrupo(pGrupo lista);

#endif /* PARTE1COMUM_H */


//ficheiro parte1Comum.c
#include "parte1Comum.h"
//funções

//receber um grupo: dados do grupo e preenhcer os dados da mesa

pGrupo adicionaGrupo(pMesa v, int *tot, pGrupo *lista, int h, int m, int pessoas, char *idM){

    printf("\nvamos la ver se apanho os dados\n");
    printf("%d\t%d\t%d\t%d\t%s\t", *tot, h ,m ,pessoas, idM);
    pGrupo novo;
    novo = malloc(sizeof(grupo));
     if(novo==NULL){
         printf("\nerro: nao foi possivel reservar memoria");
         return NULL;
     }else{
     if(*tot==0){
         //primeira reserva mesa
        novo->in.h = h;
        novo->in.m = m;
        novo->num = pessoas;
        novo->prox = NULL;
        (*tot)++;
        //v[0].id = idM;
        //strcpy(v[0].id, idM);
        printf("\n\n%s",v[0].id);
        
        return novo;
    }
    
    
    }
    return novo;
    free(novo);
}

pGrupo listagemGrupo(pGrupo lista){

    printf("entrei");
    
    return NULL;
}
Tags : , ,

parte 5 – gestão dinâmica de memória (listas ligadas a listas ligadas)

O caso de uma lista de disciplinas que tem alunos inscritos.. :) as disciplinas é uma lista ligada e os alunos inscritos também o são.. vamos ver como corre

//listas de listas (listas ligadas)
#include <stdio.h>
#include <stdlib.h>

#define TAM 3
#define TAMNOME 10

typedef struct pessoa aluno, *paluno; 
typedef struct disciplina aUC, *pUC; 

struct pessoa{s
    int nif;
    char nome[TAMNOME];
    paluno pseguinte;
};


struct disciplina{
    int numeroUC;
    char nomeUC[TAMNOME];
    pUC pUCseguinte;
    paluno lista;
};

int lista_vazia(paluno p, pUC puc);
int menu();
pUC adicionaUC(int *auxTUC, pUC p);
void listaUCs(pUC p, int totalUC);
pUC removerUC(int *auxTUC, pUC p);
paluno adicionaAluno(paluno pA, pUC pU);



int lista_vazia(paluno p, pUC puc){
    if(p==NULL && puc == NULL){
        return 1;
    }else{
        return 0;
    }
}

int menu(){
    int i;
    //printf("total UCs: %d", totalUCs)
    puts("1 - adiciona UC");
    puts("2 - remove UC"); //last
    puts("3 - lista UCs");
    puts("4 - adiciona aluno a UC");
    puts("5 - remove aluno a UC"); //last
    puts("6 - lista UC de aluno");
    puts("7 - ");
    puts("8 - terminar");
    puts("Escolha uma opcao: ");
    
    do{
        scanf(" %d", &i);
    }while(i <0 || i >8);
    
    return i;
}

pUC removerUC(int *auxTUC, pUC p){
    int retirarUC;
    pUC atual, anterior=NULL;
    
    atual = p;
    
    if(p==NULL){
        printf("\nerro: nao existe nada para remover");
        return p;
    }else{
        printf("\nqual o nif da UC a remover?\n");
        scanf("%d", &retirarUC);
        
        while(atual != NULL && atual->numeroUC != retirarUC){
            anterior = atual;
            atual= atual->pUCseguinte;
        }
        if(anterior == NULL){
            p = atual->pUCseguinte;
            (*auxTUC)--;
        }else{
            anterior->pUCseguinte = atual->pUCseguinte;
            (*auxTUC)--;
        }
        }
    free(atual);
    return p;
}

paluno adicionaAluno(paluno pA, pUC pU){
    
    
    
    

    return pA;
}


pUC adicionaUC(int *auxTUC, pUC p){
    int auxiliar;
    pUC novo, cursor;
    
    novo = malloc(sizeof(aUC));
    if(novo == NULL){
        printf("erro: nao e possivel alocar memoria para a UC");
        return p;
    }else{
    
    if(*auxTUC >= TAM){
        printf("erro: nao e possivel adicionar mais UC\n");
        free(novo);
        return p;
    }else{
        printf("Qual o numero da nova UC?\n");
        scanf("%d", &novo->numeroUC);
        printf("Qual o nome da nova UC?\n");
        scanf(" %99[^\n]", novo->nomeUC);
        novo->pUCseguinte = NULL;
        novo->lista = NULL;
        
        if(p==NULL){    
            p=novo;
            (*auxTUC)++;
            return p;
        }else{
            cursor=p;
            while(cursor->pUCseguinte != NULL){
                cursor=cursor->pUCseguinte;
                }
                cursor->pUCseguinte = novo;
                (*auxTUC)++;
                return p;
        }
    }
    }
    free(novo);
}

void listaUCs(pUC p, int totalUC){

    if(p==NULL){
        printf("\nerro: nao tem nada para listar de UCs");
    }else{
        printf("\nlistagem das %d UCs:\n", totalUC);
        while(p!=NULL){
            printf("%d\t%s\n", p->numeroUC, p->nomeUC);
            p=p->pUCseguinte;
        }
    }
}



int main() {
    int escolha, totalUC=0;
    paluno listaA=NULL;
    pUC listaUC=NULL;
    
    if(lista_vazia(listaA, listaUC)==1){
    do{
        escolha = menu();
        switch(escolha){
            case 1: listaUC=adicionaUC(&totalUC, listaUC); break;
            case 2: listaUC=removerUC(&totalUC, listaUC); break;
            case 3: listaUCs(listaUC, totalUC);
            case 4: listaA=adicionaAluno( listaA, listaUC);break;
            case 5: break;
            case 6: break;
            case 7: break;
            case 8: break;
        }
    }while(escolha != 8);
    }else{
        printf("nao foi possivel inicializar!");
    }
    
    
    return 0;
}


e ficou incompleto..

ajudas:
LINK1

Tags : , ,

parte 5 – gestão dinâmica de memória (lista duplamente ligada)

As listas duplamente ligadas pressupõem sempre que cada nó tem sempre dois ponteiros: um para o próximo nó e outro para o nó anterior

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

#define TAM 100

typedef struct elemento pessoa, *pelemento;

struct elemento{
    char nome[TAM];
    int idade;
    pelemento prox;
    pelemento antes;
};

int lista_vazia(pelemento p);
void mostra_elemento(pelemento p);
pelemento adiciona_elemento(pelemento p);
pelemento elimina_elemento(pelemento p);
void pesquisa_elemento(pelemento p);
void guarda_lista(pelemento p);
pelemento ler_lista(pelemento p);

int menu(){
    int i;
    puts("1 - adiciona elemento");
    puts("2 - elimina elemento");
    puts("3 - mostra a lista elementos");
    puts("4 - pesquisar na lista");
    puts("5 - esvaziar a lista");
    puts("6 - obter lista de um ficheiro");
    puts("7 - guardar lista de um ficheiro");
    puts("8 - terminar");
    puts("Escolha uma opcao: ");
    
    do{
        scanf(" %d", &i);
    }while(i <0 || i >8);
    
    return i;
}

int lista_vazia(pelemento p){
    if(p==NULL){
        return 1;
    }else{
        return 0;
    }
}

pelemento elimina_elemento(pelemento p){
    pelemento aux=NULL;
    char apagar[TAM];

    if(p == NULL){
        printf("erro: nao existem elementos para elimninar");
        return p;
    }else{
    aux=p;
    printf("qual o nome que quer apagar?\n");
    scanf(" %99[^\n]", apagar);
    printf("vou procurar: %s\n", apagar);
    
    while(aux != NULL && strcmp(aux->nome, apagar) != 0){
        aux=aux->prox;
    }
    //nao encontrou
    if(aux == NULL){
        return p;
    }else{ 
       
    //primeiro elemento
    if(aux == p){
        printf("encontrei: vou apagar1\n");
        p=aux->prox;
        if(p != NULL){
            p->antes = NULL;
        }
    }else{
        printf("nao e o primeiro - encontrei: vou apagar2\n");
        aux->antes->prox = aux->prox;
        if(aux->prox != NULL){
            aux->prox->antes = aux->antes;
        }
    }
    }
    }
    free(aux);
    return p;
}


pelemento adiciona_elemento(pelemento p){
    pelemento novo, aux;
    novo = malloc(sizeof(pessoa));
   
    if(novo == NULL){
        printf("erro: na alocacao de memoria\n");
        return p;
    }
        
    if(p==NULL){ //se a lista estiver vazia
    //a lista está vazia
        printf("Qual o nome? ");
        scanf(" %99[^\n]", novo->nome);
        printf("Qual a idade? ");
        scanf("%d", &novo->idade);
        novo->prox=NULL;
        p=novo;
        
        return p;
    }else{
    //se a lista nao estiver vazia
        printf("Qual o nome?2 ");
        scanf(" %99[^\n]", novo->nome);
        printf("Qual a idade?2 ");
        scanf("%d", &novo->idade);
        //mas for o segundo elemento
        if(p->prox==NULL){
            p->prox=novo;
            novo->antes=p;
            novo->prox=NULL;
            return p;
        }else{
            aux = p;
            //se nao for o primeiro elemento
            while(aux->prox != NULL){
                aux=aux->prox;
            }
            novo->prox = aux->prox; //aponta para null ?? nao percebi
            novo->antes = aux;
            aux->prox = novo; 
            return p;
        }
    }
    free(novo);
    return p;
}

void mostra_elemento(pelemento p){

    if(p==NULL){
        printf("\nerro: lista esta vazia\n");
    }else{
        printf("\nLista de elementos:\n");
        while(p != NULL){       
            printf("%s\t%d\t\n", p->nome, p->idade);
            p = p->prox;
        }
    }
}

void pesquisa_elemento(pelemento p){
    pelemento aux;
    char apagar[TAM]; 
    
    if(p==NULL){
        printf("lista vazia\n");
    }else{
        aux=p;
        printf("Qual o nome do elemento que quer procurar?\n");
        scanf(" %99[^\n]", apagar);
        
        while(aux != NULL){
            if(strcmp(aux->nome, apagar)==0){
                printf(".........................encontrei\n");
                printf("%s\t%s", aux->nome, apagar);
            }
            aux=aux->prox;
        }
    }
}

void guarda_lista(pelemento p){
    FILE *f;
    pelemento aux;
    
    f = fopen("gd2.bin","wb");
    if(f == NULL){
        printf("nao foi possivel executar a operacao");
    }else{
        aux=p;
        while(aux != NULL){
            fwrite(aux,sizeof(pessoa),1,f);
            aux=aux->prox;
        }
    }
    printf("\nLista guardada\n");
    fclose(f);
}

pelemento ler_lista(pelemento p){
    FILE *f;
    pelemento novo=NULL;
    
   f = fopen("gd2.bin","rb");
   if(f == NULL){
        printf("nao foi possivel executar a operacao");
        return p;
    }else{
            while(feof(f) == 0){
                novo=malloc(sizeof(pessoa));
                fread(novo,sizeof(pessoa),1,f);
                novo->prox = p;
                p = novo;    
            }
        }
   
   free(novo);
   fclose(f);
   return p;
}
int main() {
    int escolha;
    pelemento lista = NULL; //1) criar a lista
    
    if(lista_vazia(lista)==1){
    do{
        escolha = menu();
        switch(escolha){
            case 1: lista = adiciona_elemento(lista); break;
            case 2: lista = elimina_elemento(lista);break;
            case 3: mostra_elemento(lista); break;
            case 4: pesquisa_elemento(lista); break;
            case 5: break;
            case 6: lista = ler_lista(lista); break;
            case 7: guarda_lista(lista); break;
            case 8: break;
        }
    
    }while(escolha != 8);
    }else{
        printf("nao foi possivel inicializar!");
    }
    return 0;
}


Tags : , ,