gpt4 book ai didi

c - 矩阵乘法控制

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:17 25 4
gpt4 key购买 nike

我在 aula0602.c 文件的 strtoul 函数上做错了,我无法打印这三个矩阵。显然文件 aula0601.h 和 aula0601.c 没问题,但是当我执行二进制文件时,没有在命令行打印。

我在 Linux 上的 bash 中编写了以下命令:

gcc -c -Wall aula0601.c

gcc -c -Wall aula0602.c

gcc -o aula0602 aula0601.o aula0602.o

./aula0602 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

编辑:

我执行了以下命令,但没有打印任何内容(我尝试了评论空间中的说明)。

--> gcc -c -Wall aula0601.c

--> gcc -c -Wall aula0602.c

--> gcc -o aula0602 aula0601.o aula0602.o

--> ./aula0602 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

-->

/* aula0601.h */  

#ifndef _AULA0601_
#define _AULA0601_ "@(#)aula0601.h $Revision$"

#define LINHAS_1 5
#define COLUNAS_1 3
#define LINHAS_2 3
#define COLUNAS_2 4

void
MultiplicarMatrizes (float [LINHAS_1][COLUNAS_1],
float [LINHAS_2][COLUNAS_2],
float [LINHAS_1][COLUNAS_2]);

#endif




/* aula0601.c */

#include "aula0601.h"

void
MultiplicarMatrizes (float matriz1 [LINHAS_1][COLUNAS_1],
float matriz2 [LINHAS_2][COLUNAS_2],
float matrizResultado [LINHAS_1][COLUNAS_2])
{

unsigned contador1, contador2, contador3;

for (contador1 = 0; contador1 < LINHAS_1; contador1++)
{
for (contador2 = 0; contador2 < COLUNAS_2; contador2++)
{
matrizResultado[contador1][contador2] = 0;
for (contador3 = 0; contador3 < COLUNAS_1; contador3++)
{
matrizResultado[contador1][contador2] =
matrizResultado[contador1][contador2] +
matriz1[contador1][contador3] * matriz2 [contador3][contador2];
}
}
}

}



/* aula0602.c */

#include <stdio.h>
#include <stdlib.h>
#include "aula0601.h"


#define NUMERO_DE_ARGUMENTOS LINHAS_1 * COLUNAS_1 + LINHAS_2 * COLUNAS_2 + 1
#define OK 0
#define NUMERO_DE_ARGUMENTOS_INVALIDO 1
#define ARGUMENTO_INVALIDO 2
#define EOS '\0'


void
MostrarMatriz1 (float [LINHAS_1][COLUNAS_1]);

void
MostrarMatriz2 (float [LINHAS_2][COLUNAS_2]);

void
MostrarMatrizResultado (float [LINHAS_1][COLUNAS_2]);


void
MostrarMatriz1 (float matriz1 [LINHAS_1][COLUNAS_1])
{

unsigned linhas1, colunas1;

printf("\n");

for (linhas1 = 0; linhas1 < LINHAS_1; linhas1++)
{
for (colunas1 = 0; colunas1 < COLUNAS_1; colunas1++)
printf("%03f\t", matriz1 [linhas1][colunas1]);
printf("\n");
}

printf("\n");

}

void
MostrarMatriz2 (float matriz2 [LINHAS_2][COLUNAS_2])
{

unsigned linhas2, colunas2;

printf("\n");

for (linhas2 = 0; linhas2 < LINHAS_2; linhas2++)
{
for (colunas2 = 0; colunas2 < COLUNAS_2; colunas2++)
printf("%03f\t", matriz2 [linhas2][colunas2]);
printf("\n");
}

printf("\n");

}

void
MostrarMatrizResultado (float matriz1 [LINHAS_1][COLUNAS_2])
{

unsigned linhas1, colunas2;

printf("\n");

for (linhas1 = 0; linhas1 < LINHAS_1; linhas1++)
{
for (colunas2 = 0; colunas2 < COLUNAS_2; colunas2++)
printf("%03f\t", matriz1 [linhas1][colunas2]);
printf("\n");
}

printf("\n");

}


int
main (int argc, char *argv[])
{

unsigned char linhas1, colunas1, linhas2, colunas2;
float matriz1 [LINHAS_1][COLUNAS_1];
float matriz2 [LINHAS_2][COLUNAS_2];
float matrizResultado [LINHAS_1][COLUNAS_2];
char *validacao;

if (argc != NUMERO_DE_ARGUMENTOS)
{
printf("Número de argumentos invalido.\n");
printf("Uso: <a11> <a12> ... <a52> <a53> <b11> <b12> ... <b33> <b34>\n");
exit (NUMERO_DE_ARGUMENTOS_INVALIDO);
}

for (linhas1 = 0; linhas1 < LINHAS_1; linhas1++)
{
for (colunas1 = 0; colunas1 < COLUNAS_1; colunas1++)
{
matriz1 [linhas1][colunas1] =
(float) strtoul (argv [(linhas1 * COLUNAS_1) + colunas1 + 1], &validacao, 10);
if (*validacao != EOS)
{
printf("Caractere invalido: \"%c\"\n", *validacao);
exit(ARGUMENTO_INVALIDO);
}
}
}

for (linhas2 = 0; linhas2 < LINHAS_2; linhas2++)
{
for (colunas2 = 0; colunas2 < COLUNAS_2; colunas2++)
{
matriz2 [linhas2][colunas2] =
(float) strtoul (argv [(linhas2 * COLUNAS_2) + colunas2 + 1], &validacao, 10);
if (*validacao != EOS)
{
printf("Caractere invalido: \"%c\"\n", *validacao);
exit(ARGUMENTO_INVALIDO);
}
}
}

#ifdef _MY_DEBUG_
MostrarMatriz1 (matriz1);
MostrarMatriz2 (matriz2);
#endif

MultiplicarMatrizes (matriz1, matriz2, matrizResultado);

#ifdef _MY_DEBUG_
MostrarMatrizResultado (matrizResultado);
#endif

return OK;
}

最佳答案

这些文件用 gcc -Wall -D _MY_DEBUG_ aula0601.c aula0602.c -o aula0602 定义、编译和链接似乎工作。
考虑使用 index 调用 strtol 来简化索引 argv
这也适用于一个打印函数 MostrarMatriz

aula0601.h

#define LINHAS_1                            5
#define COLUNAS_1 3
#define LINHAS_2 3
#define COLUNAS_2 4
#define NUMERO_DE_ARGUMENTOS_INVALIDO 1
#define ARGUMENTO_INVALIDO 2
#define NUMERO_DE_ARGUMENTOS LINHAS_1 * COLUNAS_1 + LINHAS_2 * COLUNAS_2 + 1
#define EOS '\0'

void
MultiplicarMatrizes (float matriz1 [LINHAS_1][COLUNAS_1],
float matriz2 [LINHAS_2][COLUNAS_2],
float matrizResultado [LINHAS_1][COLUNAS_2]);

aula0601.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "aula0601.h"

void
MultiplicarMatrizes (float matriz1 [LINHAS_1][COLUNAS_1],
float matriz2 [LINHAS_2][COLUNAS_2],
float matrizResultado [LINHAS_1][COLUNAS_2])
{

unsigned contador1, contador2, contador3;

for (contador1 = 0; contador1 < LINHAS_1; contador1++)
{
for (contador2 = 0; contador2 < COLUNAS_2; contador2++)
{
matrizResultado[contador1][contador2] = 0;
for (contador3 = 0; contador3 < COLUNAS_1; contador3++)
{
matrizResultado[contador1][contador2] =
matrizResultado[contador1][contador2] +
matriz1[contador1][contador3] * matriz2 [contador3][contador2];
}
}
}
}

aula0602.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "aula0601.h"

void
MostrarMatriz (int linhas, int colunas, float matriz [linhas][colunas])
{
int linhas1;
int colunas1;

printf("\n");
for (linhas1 = 0; linhas1 < linhas; linhas1++)
{
for (colunas1 = 0; colunas1 < colunas; colunas1++)
printf("%12.2f", matriz [linhas1][colunas1]);

printf("\n");
}
printf("\n");
}

int main( int argc, char *argv[])
{
unsigned char linhas1, colunas1, linhas2, colunas2;
float matriz1 [LINHAS_1][COLUNAS_1];
float matriz2 [LINHAS_2][COLUNAS_2];
float matrizResultado [LINHAS_1][COLUNAS_2];
char *validacao;
int index = 1;

if (argc != NUMERO_DE_ARGUMENTOS)
{
printf("Número de argumentos invalido.\n");
printf("Uso: <a11> <a12> ... <a52> <a53> <b11> <b12> ... <b33> <b34>\n");
exit (NUMERO_DE_ARGUMENTOS_INVALIDO);
}

index = 1;
for (linhas1 = 0; linhas1 < LINHAS_1; linhas1++)
{
for (colunas1 = 0; colunas1 < COLUNAS_1; colunas1++)
{
matriz1 [linhas1][colunas1]
= (float) strtoul (argv [index++], &validacao, 10);
if (*validacao != EOS)
{
printf("Caractere invalido: \"%c\"\n", *validacao);
exit(ARGUMENTO_INVALIDO);
}
}
}

index = ( LINHAS_1 * COLUNAS_1) + 1;
for (linhas2 = 0; linhas2 < LINHAS_2; linhas2++)
{
for (colunas2 = 0; colunas2 < COLUNAS_2; colunas2++)
{
matriz2 [linhas2][colunas2]
= (float) strtoul (argv [index++], &validacao, 10);
if (*validacao != EOS)
{
printf("Caractere invalido: \"%c\"\n", *validacao);
exit(ARGUMENTO_INVALIDO);
}
}
}

#ifdef _MY_DEBUG_
MostrarMatriz ( LINHAS_1, COLUNAS_1, matriz1);
MostrarMatriz ( LINHAS_2, COLUNAS_2, matriz2);
#endif

MultiplicarMatrizes ( matriz1, matriz2, matrizResultado);

#ifdef _MY_DEBUG_
MostrarMatriz ( LINHAS_1, COLUNAS_2, matrizResultado);
#endif

exit ( 0);
}

关于c - 矩阵乘法控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com