Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
onabi

Agenda Telefonica em C

Recommended Posts

onabi

Boa tarde,

To com um problema em desenvolver um programa em linguagem C de uma agenda telefonica e gostaria de saber se alguem pode dedicar um tempo em me ajudar!

  Entrada:

O arquivo de entrada contém o número de contatos (inteiro), o nome completo (nome e um sobrenome, separados por espaço) e o telefone de cada contato. Após ler os contatos e carregar no vetor, seu programa deve ler do teclado uma das duas opções disponíveis: se digitar 1, o programa ordena pelo campo de telefone; se digitar 2, o programa ordena pelo campo nome; e qualquer outro valor o programa imprime na tela a mensagem "Opcao invalida." e termina.

Saida:

O programa deve ter um procedimento mostracontatos que mostra a agenda completa na saída padrão, sendo que deve imprimir a palava "Nome: " seguido pelo nome de cada contato e na linha seguinte a palavra "Telefone: " seguido pelo telefone de cada contato.

Esqueleto do programa:

**FIZ ALGUMAS MODIFICAÇÕES NO CODIGO:

estou quase conseguindo, falta a função gravacontatos e melhorar a mostracontatos, se alguem puder ajudar!

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

#define MAX_STR 200

//definição do tipo de registro
typedef struct contato{
char nome[MAX_STR];
int telefone;
} Contato;

//procedimento que le os contatos do arquivo arq e grava no vetor agn
// n e o parametro que informa o numero de contatos
void lecontatos(Contato agn[], int n, FILE *arq){
  int i;
  
    arq = fopen ("arquivo.txt", "r"); //abertura do arquivo - somente leitura

  if (arq == NULL) { //erro na abertura do arquivo
    perror("teste2.txt");
  }
  else{
  for(i=0;i<n;i++){
                   fscanf(arq,"%s", agn[i].nome);
                   fscanf(arq,"%d", &agn[i].telefone);
                   fclose(arq);
                   }
}
}
//procedimento de ordenação dos contatos pelo campo telefone
// n e o parametro que informa o numero de contatos
void ordenatelefone(Contato agn[], int n){ //procedimento para organizar agenda
      int i,j; //usados nas trocas de ordem
      Contato aux;
            for(i=0;i<n-1;i++) { //primeiro for da troca
              for(j=0;j<n-1;j++)    	//for interno para a organização de todos os numeros
                     if (agn[j].telefone > agn[j+1].telefone) { 
                 	aux=agn[j];
                  	agn[j]=agn[j+1];
                   	agn[j+1]=aux;
      }
  }  
}
//procedimento de ordenação dos contatos pelo campo nome
// n e o parametro que informa o numero de contatos
void ordenanomes(Contato agn[], int n){ //procedimento para organizar agenda
     int i,j; //usados nas trocas de ordem
      Contato aux;
            for(i=0;i<n-1;i++) { //primeiro for da troca
              for(j=0;j<n-1;j++)    	//for interno para a organização de todos os numeros
                     if (agn[j].nome > agn[j+1].nome) { 
                 	aux=agn[j];
                  	agn[j]=agn[j+1];
                   	agn[j+1]=aux;
      }
  } 
}


//procedimento que grava o vetor de contatos no arquivo de nome indicado pela string caminho
// n e o parametro que informa o numero de contatos
void gravacontatos(Contato agn[], int n, char* caminho){
  FILE *fr, *fw;
  char c;
  
  if (agn < n) { //se nao informou o numero minimo de argumentos
    printf("Uso: %s <arq_origem> <arq_destino>\n", caminho); 
     }

  fr = fopen (arquivo, "r"); 
  fw = fopen (caminho, "w");

  //leitura e copia elemento a elemento
  while (fscanf(fr, "%c", &c) != EOF)
    fprintf(fw,"%c", c);

  fclose(fr);  
  fclose(fw);
}
//procedimento que imprime o vetor de contatos na tela
// n e o parametro que informa o numero de contatos
void mostracontatos(Contato agn[], int n, int numero){
int i;
int numero;
if(numero == 1){
for(i=0;i<n;i++){
  printf("%s", agn[i].nome);
  printf("%d", agn[i].telefone);
}
}
if(numero == 2){
    for(i=0;i<n;i++){
    printf("%d", agn[i].telefone);
    printf("%s", agn[i].nome);
}
}
}

int main(int argc, char* argv[]){
int n, i, caminho;
int numero, v1[100];
Contato agn[200];
scanf("%d", &n);

void gravacontatos(agn,n);
void lecontatos(agn,n);

  scanf("%d", &numero);

void mostracontatos(agn,n,numero);


//INSERIR SEU CÓDIGO AQUI
system("PAUSE");
return 0;
}

//IMPLEMENTAR OS CÓDIGOS DAS FUNÇÕES AQUI

Se alguem puder me dar dicas.

Agradeço desde já!

Share this post


Link to post
Share on other sites
pmg

Nao experimentei o teu codigo, nem estive a olhar para ele com atencao, mas dou-te uma sugestao:

Eu fiz uma parte do programa, mas nao sei se tá correto!

O problema maior é na parte de gravação e de mostrar..

//procedimento que le os contatos do arquivo arq e grava no vetor agn
// n e o parametro que informa o numero de contatos
void lecontatos(Contato agn[], int n, FILE *arq){

Nesta funcao lecontatos o parametro n "nao sai da funcao".

Eu faria a funcao retornar um int (esse n) e nao o passava como parametro

int lecontatos(Contato agn[], FILE *arq) { /* ... */ return 42; }

Outra hipotese seria passar um ponteiro em vez dum valor e actualizar o objecto apontado dentro da funcao

void lecontatos(Contato agn[], int *n, FILE *arq) { /* ... */ *n = 42; }


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.