Planilha ASCII

Este projeto consiste em construir uma planilha eletrônica em modo texto, usando a biblioteca NCurses para a gestão do terminal. A interface da planilha deve ser similar à figura abaixo:

  • ler e escrever arquivos em formato CSV (deve ser capaz de ler/escrever arquivos simples compatíveis com o LibreOffice Calc ou Microsoft Excel);
  • suportar matrizes de até 100 linhas × 26 colunas (a tela deve “deslizar” na horizontal e vertical para mostrar parte visível da planilha);
  • cada coluna da planilha ocupa 8 caracteres na tela;
  • implementar corte/cópia/cola de grupos de células contíguas;
  • ser capaz de calcular fórmulas simples;
  • se adaptar às dimensões do terminal ao iniciar.

O formato CSV - Comma Separated Values (Valores Separados por Vírgula) é um formato popular para a representação de tabelas de dados. Existem diversas variantes desse formato, então neste projeto assumimos a seguinte especificação:

  • campos delimitados por vírgula
  • linhas delimitadas por enter (\n)
  • campos representados por valores textuais (não em binário)
  • qualquer valor/campo pode ser envolto por aspas duplas (“)
  • campos contendo vírgulas devem ser envoltos por aspas duplas (”“)
  • números reais usam ponto ”.“ para a parte fracionária
  • cada campo pode ter até 255 caracteres (mostrar até 8 na tela)
  • ignorar campos contendo “\n” ou aspas como parte do valor

Exemplo de um arquivo CSV:

exemplo.csv
Data,Descrição,Valor
05/04/2016,"Despesas apto (luz, água)",50
07/04/2016,Material de limpeza,20.30
11/04/2016,Matrícula inglês,110
13/04/2016,"Papelaria (cadernos, canetas)",25
15/04/2016,Supermercado,60
19/04/2016,Credito ônibus,50
20/04/2016,Almoço (pizza),20
26/04/2016,Camiseta,35
30/04/2016,Aluguel,"500"
  • números inteiros e reais, positivos e negativos
  • strings em UTF8
  • fórmulas simples: strings no formato = A op B, onde A e B são números ou referências de células e op é uma operação algébrica simples (+, -, *, /).

Células podem ser referenciadas usando suas coordenadas: por exemplo, a string A5 referencia o valor da célula na coluna A e linha 5.

  • Setas (←↑↓→): mover cursor (para selecionar a célula ativa)
  • Enter: editar a célula corrente (selecionada)
  • Arquivos:
    • ^S : salvar arquivo corrente
    • ^R: ler arquivo
  • Cortar/Copiar/colar:
    • ^space : fixar âncora (define um retângulo junto com o cursor)
    • ^C: copiar retângulo para o clipboard
    • ^X: cortar retângulo para o clipboard
    • ^V: colar conteúdo do clipboard a partir da posição do cursor
  • ^Q: encerrar o programa (quit)

As operações de ler novo arquivo ou encerrar o programa devem perguntar se o usuário deseja salvar o conteúdo atual antes!

  • texcel : abre uma planilha em branco (sem nome)
  • texcel arq1.csv: abre o arquivo arq1.csv
  • Ser escrito em C padrão C99
    • não gerar warnings ao usar flags -Wall
    • o executável deve se chamar texcel (de Text Excel)
  • ser estruturado em vários arquivos. Por exemplo:
    • texcel.c (programa principal)
    • csvfile.c, csvfile.h (lê/escreve arquivos CSV)
    • formula.c, formula.h (funções para analisar e calcular fórmulas)
  • Ter um Makefile:
    • alvos all, clean e purge
    • compilação e ligação devem ser separadas
  • Ler e calcular estes arquivos de teste:

Ncurses:

Instalação da biblioteca NCurses no Linux (Ubuntu, Debian, Mint):

sudo apt-get install libncurses-dev

O código de inicialização da biblioteca NCurses, com as configurações necessárias para este projeto, é o seguinte:

  initscr () ;		// inicializa a biblioteca ncurses
  raw () ;		// permite tratar teclas de controle (^C, ^Z, etc)
  keypad (stdscr, TRUE) ; // habilita leitura de teclas de setas, Fn, etc
  noecho () ;		// não escreve as teclas lidas na tela
  curs_set (0) ;	// esconde o cursor do terminal

Projetos similares a este: