====== 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)