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

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