Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de PDF
Download "Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009"
Vera Santos Vilanova
1 Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009 Ao desenvolver os seguintes programas tenha em atenção o bom uso dos comentários, o uso da indentação e o correcto nome das variáveis!!!!! Bom trabalho! 1. Desenvolva e implemente um programa que lê a informação contida num ficheiro de dados do projecto (por exemplo flock_77.data). O programa deverá ler do teclado o nome de uma população (uma única palavra) e um inteiro e, com base no nome da população e no inteiro lido, abrir o ficheiro de dados correspondente: NOME_VALOR.data em que NOME deverá ser substituído pela palavra lida e VALOR substituído pelo inteiro. Por exemplo, se o utilizador escrever flock e 54 o ficheiro a ser lido chamar-se-á flock_45.data. Cada linha do ficheiro conterá as coordenadas de um elemento da população, devendo o programa imprimir no ecrã os valores lidos ou a indicação de erro (valores em falta ou caracteres estranhos). Os ficheiros com dados deverão existir na directoria onde é criado o executável. Para um projecto chamado lab5 os ficheiros de dados deverão estar na directoria lab5/debug/src. Para realizar este exercício leia com atenção o anexo Função sprintf. 2. Altere o programa realizado anteriormente de modo a mostrar numa janela gráfica a localização dos diversos membros da população lida. Cada coordenada lida correctamente do ficheiro deverá ser assinalada numa janela com as dimensões 1024x768 (1024 linhas por 768 colunas). Antes de iniciar a leitura deverá criar uma janela usando a biblioteca G2 (ver funções mais à frente). Se o ficheiro não existir a janela não deverá ser criada. À medida que os valores (x e y) vão sendo lidos, deverá ser desenhado na janela um ponto, ou caracter (por exemplo o), na posição correspondente às coordenadas lidas. Para este exercício necessitará de usar funções da biblioteca G2, que estão descritas nas próximas páginas. 3. Altere o exercício 1 da semana 4, dividindo-o em funções. Implemente as funções que calculam o factorial e verificam se o número é primo e invoqueas a partir do programa principal. 1 / 6
2 Função sprintf Para a realização deste exercício e do projecto é necessário ler ficheiros cujo nome é composto por partes fixas (a extensão) e partes variáveis (o nome da população e o instante). Por esta razão o nome do ficheiro que se irá abrir não pode ser constante, devendo ser construído durante a execução da aplicação a partir de dados pré existentes. As funções printf e fprintf fazem parte do que se pretende: constroem uma string a partir do valor de uma constante e de várias variáveis e escrevem-na no ecrã (ou num ficheiro). Por exemplo o seguinte código x = 0.5; n = 14; printf("valor1 %f valor2 %d", x, n); escreverá no écran valor valor2 14. Mas não faz o que desejamos, visto, por exemplo, querermos usar a string produzida no fopen. Existe, no entanto, uma terceira função com funcionamento parecido ao do printf e fprintf: o sprintf. Esta função, em vez de escrever para o écran (ou para um ficheiro), escreve a sequência de caracteres construída para uma variável do tipo string. Por exemplo: i = 200; sprintf(nome_imagem, "movie_%d.png", i); O primeiro argumento é o nome da variável onde será armazenada a string construída com base nos argumentos seguintes. Os argumentos seguintes (neste exemplo "movie_%08d.png" e i) têm o mesmo formato e utilidade que num printf. Neste exemplo será armazenado na variável chamada nome_imagem a string correspondente a movie_%08d.png com o %08d substituído pelo valor de i (neste exemplo movie_200.png). Tal como no printf, pode-se também usar %s, %c e %f. 2 / 6
3 Biblioteca G2. O seguinte programa lê o nome de um ficheiro do teclado, cria uma imagem com esse nome (tipo png) e dimensões Este programa desenha então várias linhas a partir do canto inferior esquerdo e do canto superior direito. Cada linha será desenhada com uma cor diferente (entre 0 e 26). #include <stdio.h> #include <stdlib.h> #include <g2.h> #include <g2_gd.h> int main(int argc, char *argv[]){ char nome_file[100]; int i; int id_imag; int cor; printf("nome do ficheiro: "); fgets(nome_file, 100, stdin); id_imag = g2_open_gd(nome_file, 640, 480, g2_gd_png); i = 0; while(i < 480){ g2_line(id_imag, 0, 0, 640, i); g2_line(id_imag, 640, 480, 0, i); Nos ficheiros g2.h e g2_gd.h encontram-se as declarações das funções necessárias à criação de imagens. A variável id_imag conterá o identificador do ficheiro de imagem criado. É a variável equivalente à retornada no fopen. Para abrir a imagem usamos a função do G2 chamada g2_open_gd. Esta função recebe o nome do ficheiro, a dimensão (640 colunas e 480 linhas) e o tipo de imagem (g2_gd_png). A função g2_line recebe o ficheiro anteriormente aberto e as coordenadas dos extremos da linha: Ficheiro (aberto pelo g2_open_gd), X1, Y1, X2 e Y2 cor = (cor +1) %27; g2_pen(id_imag, cor); i = i+1; A função g2_pen muda a cor usada para desenhar, o primeiro parâmetro corresponde ao ficheiro, o segundo corresponde à cor. Os valores associados a cada cor são apresentados de seguida. g2_close(id_imag); return EXIT_SUCCESS; A função g2_close fecha o ficheiro e escreve-o no disco O segundo programa desenha o mesmo padrão, mas numa janela: #include <stdlib.h> #include <g2.h> #include <g2_x11.h> Nos ficheiros g2.h e g2_x11.h encontram-se as declarações das funções necessárias à abertura da janela e criação de imagens. int main(int argc, char *argv[]){ int i; int id_imag; int cor; id_imag = g2_open_x11(640, 480); i = 0; while(i < 480){ g2_line(id_imag, 0, 0, 640, i); g2_line(id_imag, 640, 480, 0, i); cor = (cor +1) %27; A variável id_imag conterá o identificador da janela criada. É a variável equivalente à retornada pelo fopen. Para abrir a janela usamos a função do G2 chamada g2_open_x11. Esta função só recebe o nome a dimensão (640 colunas e 480 linhas) da janela. A função g2_line recebe o identificador da janela e as coordenadas dos extremos da linha. 3 / 6
4 g2_pen(id_imag, cor); i = i+1; getchar(); g2_close(id_imag); return EXIT_SUCCESS; A função g2_pen muda a cor usada para desenhar, o primeiro parâmetro corresponde ao dispositivo (janela), o segundo corresponde à cor. A função g2_close fecha a janela. Para usar as funções da biblioteca G2 é necessário efectuar uma configuração semelhante àquela que se faz para usar a funções matemáticas: é necessário dizer ao compilador quais as bibliotecas que vão ser adicionadas ao programa. Siga os passos descritos no documento Guia para uso de bibliotecas no KDevelop e, para além da adição da opção lm, adicione o seguinte: -lg2 (menos lê guê dois) -lgd (menos lê guê dê) -lx11 (menos lê xis maiúsculo um um) Em caso não conseguir compilar estes exemplos, verifique se instalou todos os pacotes de software listados na página da cadeira na secção Software. Funções da biblioteca G2 int g2_open_gd (const char * filename, int width, int height, enum g2_gd_type gd_type) Cria um dispositivo (imagem bitmap) filename nome do ficheiro width largura height altura gd_type tipo de ficheiro (g2_gd_jpeg para jpeg g2_gd_png para png g2_gd_gif para gif) Retorno: Identificador do dispositivo int g2_open_x11(int width, int height) Cria um dispositivo (janela) width largura height altura Retorno: Identificador do dispositivo void g2_close (int dev) Fecha um dispositivo (janela ou ficheiro) 4 / 6
5 void g2_pen (int dev, int color) Muda a cor que será usada para desenhar as figuras. color cor a usar: um dos seguintes valores void g2_line (int dev, double x1, double y1, double x2, double y2) Desenha uma linha entre (x1, y1) e (x2, y2). x1 coordenada x do 1º extremo y1 coordenada y do 1º extremo x2 coordenada x do 2º extremo y2 coordenada y do 2º extremo void g2_plot(int dev, double x, double y) Desenha um ponto x coordenada x y coordenada y void g2_rectangle (int dev, double x1, double y1, double x2, double y2) Desenha um rectângulo (não preenchido) especificado por dois cantos opostos. x1 coordenada x do 1º canto y1 coordenada y do 1º canto x2 coordenada x do 2º canto y2 coordenada y do 2º canto void g2_string (int dev, double x, double y, const char * text) Escreve uma string numa determinada posição x coordenada x do início do texto y coordenada x do início do texto text string com o texto a escrever void g2_set_font_size (int dev, double size) altera o tamanho do texto a ser escrito size novo tamanho das letras Mais informações acerca da biblioteca G2 podem ser encontradas em 5 / 6
6 Para o projecto poderão ser usadas outras funções da biblioteca G2 (g2_poly_line) que só poderão ser bem percebidas após se aprenderem os vectores. void g2_poly_line (int dev, int N_pt, double * points) Desenha uma polilinha (segmentos de recta entre os vários pontos. N_pt numero de pontos (Nota: não é o comprimento do vector!!) points vector de coordenadas: x1, y1, x2, y2,... 6 / 6
Programação de Microprocessadores 2011/12 Sem. Par Aluno: 34086 Relatório Trabalho Final Reservas de Viagens de Avião Este relatório tem por base o trabalho realizado nesta disciplina sobre Reservas de
Cap Escrever uma função que aceite como parâmetro um número inteiro e retorne o número que corresponde a trocar os dígitos do parâmetro (por exe
Cap 1 - Escreva um programa que leia um número real e escreva, separadamente, a sua parte inteira e a sua parte fraccionária. - Escreva um programa que leia um número real e positivo e o converta para
Licenciatura em Eng.ª Informática Sistemas Operativos - 2º Ano - 1º Semestre. Trabalho Nº 1 - Linux e C
Trabalho Nº 1 - Linux e C 1. Introdução O sistema Linux e a linguagem C são as ferramentas essenciais de aprendizagem na cadeira de Sistemas Operativos. O sistema Linux é hoje em dia utilizado por milhões