Vamos criar uma agenda de contatos

De ccppbrasil.org

Tabela de conteúdo

Objetivo

Olá, meu objetivo aqui é introduzir novatos à programação C/C++ no mundo real: o enfoque é em um aplicativo real, mas simples, e talvez o uso de um toolkit gráfico e um banco de dados. Dessa forma, novatos podem aprender efetivamente a interfacear com bibliotecas de verdade e não ficar só no quick sort, pilhas, filas, compiladores ou outros recursos teóricos...

Gostaria de manter um enfoque em simplicidade: otimizações antes do tempo são a raiz de todo o mal. Estou pensando em seguir o modelo MVC refletido nos headers e na organização dos diretórios. Então teremos o modelo ( tipos de dados abstratos e possível SQL ) do nosso aplicativo em prjContato/modelo, a visão com a(s) tela(s) em prjContato/visao e a lógica da aplicação em si em prjContato/controle.

Espero que seja um esforço colaborativo: vamos completando as lacunas na medida do possível e só lançar aqui modificações que compilem. Vou dar o chute inicial, se divirtam... :)

O código abaixo é em C, mas preparado para o C++. Existe um artigo para a versão C++ do mesmo código em Agenda de contatos em C++.

Código

Modelo.h

/***
 *
 * Header prjContato/modelo.h
 *
 * Define um contato e uma lista de contatos.
 *
 */

#ifndef __MODELO_H_
#define __MODELO_H_
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define NULO ((void *)0)

typedef struct _Contato
{
    int  id;
    char nome[ 40 ];
    char telefone[ 10 ];
    char celular[ 10 ];
    char email[ 40 ];
    char obs[ 255 ];  /* observações opcionais */
} Contato;

/* cria um novo contato, com id == 0 */
Contato *contato_novo();


typedef struct _Contatos
{
    Contato *c;
    struct _Contatos *proximo, *anterior;
} Contatos;

/* adiciona um novo contato à lista:  
   retorna 0 se mal-sucedido, ou id (novo) do contato adicionado */
int contatos_add( Contatos *lista, Contato *c );
/* Remove o contato com id id e o retorna ou NULO, se não existe */
Contato *contatos_rem( Contatos *lista, int id );


#ifdef __cplusplus
}
#endif


Mãos à obra

Estou meio sem tempo agora, mas gostaria que iniciantes também tentassem...

Acho que um bom começo é implementar os headers e criar ou melhorar interfaces. Criem programas testes para testar a interface e depois vemos telas e coisa e tal... :)


Agenda de contatos em C++

Ferramentas pessoais