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 : C, Learn C, linguagem C
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 : C, Learn C, linguagem C
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 : C, Learn C, linguagem C