Princ´ıpios de Desenvolvimento de Algoritmos 1 Objetivo 2
Transcrição
Princ´ıpios de Desenvolvimento de Algoritmos 1 Objetivo 2
Princı́pios de Desenvolvimento de Algoritmos Primeiro Exercı́cio Programa – Data de entrega: 10/9/2005 1 Objetivo O objetivo desse exercı́cio programa é calcular o produto de duas matrizes (armazenadas em dois arquivos diferentes) e armazenar o resultado em um arquivo formatado. 2 Programa em C O programa executável deve se chamar, obrigatoriamente, matMult e deve ser chamado com a seguinte linha de comando: matMult -A <arquivoA> -B <arquivoB> -o <arquivoResultado> As strings -A, -B e -o são os delimitadores para o nome dos arquivos da primeira e segunda matriz a serem multiplicadas, e para o nome do arquivo de saı́da. A existência deles facilita a chamada do programa, uma vez que o usuário não precisa obedecer a ordem de parâmetros, isto é, as três chamadas abaixo são equivalentes: matMult -A matrizA -B matrizB -o Resultado matMult -o Resultado -A matrizA -B matrizB matMult -B matrizB -A matrizA -o Resultado Para usar esses parâmetros, a função main deve ter a seguinte assinatura: int main(int argc, char* argv[]) ; O inteiro arqc armazena o número de palavras da linha de comando, no nosso exemplo, sete. A variável argv é um vetor de strings, isto é, cada posição do vetor é um apontador para uma string. 2.1 Exemplo de chamada da rotina O exemplo abaixo ilustra o funcionamento dessa função1 : #include <stdio.h> #include <stdlib.h> #include <string.h> #define DEBUG 1 Veja bem, fiz isto meio às pressas e não tive tempo de revisar. Use com cuidado! 1 int main(int argc, char* argv[]) { int i, opcoesOK = 1 ; char stringEntrada[60] ; char stringSaida[60] ; if (argc != 5) { /* Verificacao simples, a chamada deve ter 5 argumentos */ printf("Use o programa como no exemplo abaixo:\n") ; printf("exemplo -A imagem1.pgm -B imagem2.pgm\n") ; exit(1) ; } #ifdef DEBUG for (i=0; i<5; i++) { printf("%s\n",argv[i]) ; } #endif /* Trata os parametros */ for (i=0; i<5; i++) { if(argv[i][0] == ’-’) { switch(argv[i][1]) { case ’A’: strcpy(stringEntrada,argv[i+1]) ; break ; case ’B’: strcpy(stringSaida,argv[i+1]) ; break ; default : printf("Opç~ ao inválida.\n"); printf("Use o programa como no exemplo abaixo:\n") ; printf("exemplo -A imagem1.pgm -B imagem2.pgm\n") ; opcoesOK = 0 ; } } } if(opcoesOK) { #ifdef DEBUG printf("stringEntrada = %s\n",stringEntrada) ; printf("stringSaida = %s\n",stringSaida) ; #endif } 2 return(0); } 3 A tarefa 3.1 A função matmult Escreva uma função que multiplica duas matrizes do tipo double Am×p e Bp×n . A constante MAXMAT é definida no começo do programa (como 100). Suponha que as matrizes A, B e C foram definidas no programa principal com tamanho [MAXMAT][MAXMAT]. A função deve usar, obrigatoriamente, a assinatura abaixo: void matmult( /* Faz a multiplicaç~ ao de duas matrizes e guarda o resultado em C. */ double A[][MAXMAT], /* Primeira matriz de entrada */ double B[][MAXMAT], /* Segunda matriz de entrada */ double C[][MAXMAT], /* Matriz resultante */ int m, /* Número de linhas da matriz A */ int p, /* Número de colunas (linhas) da matriz A (B)*/ int n /* Número de colunas da matriz B */ ) ; /* N~ ao retorna nada */ 3.2 A função leMatriz Escreva uma função que lê uma matriz do tipo double Am×p . A função deve usar, obrigatoriamente, a assinatura abaixo: void leMatriz(/* Faz a leitura de uma matriz guarda o resultado em M. double M[][MAXMAT], /* Matriz de entrada int *pm, /* Ponteiro para o número de linhas de M int *pn, /* Ponteiro para o número de colunas de M char *nomeArq /* Nome do arquivo da matriz ) ; /* N~ ao retorna nada 3.3 */ */ */ */ */ */ A função escreveMatriz Escreva uma função que escreve uma matrizes do tipo double Am×p com o mesmo formato da matriz de entrada. A função deve usar, obrigatoriamente, a assinatura abaixo: void escreveMatriz(/* Faz a escrita de uma matriz double M[][MAXMAT], /* Matriz de entrada 3 */ */ int m, /* O número de linhas de M */ int n, /* O número de colunas de M */ char *nomeArq /* Nome do arquivo da matriz */ ) ; /* N~ ao retorna nada */ 3.4 A função main Escreva uma função principal que trata os argumentos de entrada, chama a função que lê as duas matrizes que serão multiplicadas, verifica se as matrizes podem ser multiplicadas, chama a função que multiplica as matrizes e, finalmente, chama a função que escreve a matriz resultante. 4 Formato dos arquivos O formato do arquivo que armazena as matrizes é muito simples. Na primeira linha ficam as dimensões da matriz (número de linhas e de colunas, respectivamente) e, a partir da segunda linha, os valores dos elementos da matriz (Aij ) dispostos linha por linha. A tabela abaixo mostra o formato de um arquivo do tipo “.mat” de M linhas por N colunas. M N A11 A12 ... A1N A21 A21 ... A2N ... AM 1 AM 1 ... AM N Para tratar arquivos, olhe o material que deixei no moodle sobre manipulação de arquivos. 5 Observações Finais 1. O programa obrigatoriamente tem que ser compilado com as opções -Wall -ansi -pedantic. Certifique-se que o programa compila com o gcc caso queira ter certeza que não haverá problemas na correção. 2. Faça um arquivo README (arquivo texto sem formatação) contendo: o seu nome completo e seu número USP. Uma informação por linha, linhas de, no máximo, 60 colunas, por favor. Além disso, coloque um parágrafo comentando suas dificuldades ao fazer o EP. 3. O programa (apenas os fontes) e o README devem ser entregues em arquivo zip único. O arquivo do programa deve ter as funções com a mesma assinatura da descrição do projeto e as funções devem vir antes do programa principal, tudo devidamente documentado. 4. A indentação correta das funções e do programa será considerada. 5. O exercı́cio é individual. Exercı́cios que indiquem o contrário serão tratados como quebra do código de ética discente da USP (leginf.uspnet.usp.br/resol/r4871m.htm#t5) e receberão nota 0 (zero). 4
Documentos relacionados
Lista03 Extra
elementos da string (vetor de caracteres passado por parâmetro). Faça uma função trocaChar que receba uma string por parâmetro e dois inteiros que indicam as posições dos caracteres que deve...
Leia mais