====== 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:
{{ planilha.png?nolink |}}
===== Funcionalidades =====
* 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.
===== Formato CSV =====
O formato CSV - //[[https://en.wikipedia.org/wiki/Comma-separated_values|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:
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"
===== Valores nas células =====
* 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.
===== Controles =====
* 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!
===== Forma de chamada =====
* ''texcel'' : abre uma planilha em branco (sem nome)
* ''texcel arq1.csv'': abre o arquivo ''arq1.csv''
===== Requisitos do código-fonte =====
* Ser escrito em C padrão (C99 ou similar)
* 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:
* {{gastos_pessoais.csv|}}
* {{substancias.csv|}}
* {{notas-algebra.csv|}}
* {{filtros_de_agua.csv|}}
===== Material de apoio =====
Ncurses:
* [[http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/|Ncurses Programming Howto]] (leia **com atenção** a seção sobre inicialização)
* [[http://invisible-island.net/ncurses/ncurses-intro.html|Writing Programs with Ncurses]]
* [[http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html|Ncurses Programming Guide]]
* Exemplos do ncurses no Linux, em ''/usr/lib/ncurses/examples/'' (pacote ''ncurses-examples'')
* [[http://invisible-island.net/ncurses/ncurses-examples.html|Código-fonte]] do pacote ''ncurses-examples'' disponível no Debian e derivados (Ubuntu, Mint, etc).
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:
* [[http://www.linuxjournal.com/article/10699|Linux SC]]
* [[https://www.syntax-k.de/projekte/teapot|Teapot table editor]]
* ... (existem outros)