程序从文本文件中输入一个字符串,如:
2 1.0 2.0 3.0 4.0
其中第一个数字是方形矩阵的维数,其他数字是矩阵的元素(以列主要形式存储)。 每个数字都由其他人用“空格”字符分隔 该程序在一列上添加所有数字,并将每种结果相乘。 I.E.使用此字符串,结果将是:21.0 问题是:使用此输入,程序的输出将是:
输入字符串是2 1.0 2.0 3.0 4.0
从字符串中提取char类型标记1.0
从字符串中提取char类型标记2.0
从字符串中提取char类型标记3.0
从字符串中提取char类型标记4.0
将char类型标记1.0转换为float类型
将char类型令牌2.0转换为float类型
将char类型令牌2.0转换为float类型
将char类型标记3.0转换为浮点类型
浮动类型的打印矩阵:
1.000000
2.000000
2.000000
3.000000
最终结果是15.000000
相反它应该是: 输入字符串是2 1.0 2.0 3.0 4.0
从字符串中提取char类型标记1.0
从字符串中提取char类型标记2.0
从字符串中提取char类型标记3.0
从字符串中提取char类型标记4.0
将char类型标记1.0转换为float类型将转换后的char类型标记2.0转换为
float类型将char类型标记2.0转换为float类型转换
char type token 3.0 into float type
浮动类型的打印矩阵:
1.000000
2.000000
3.000000
4.000000
最终结果为24.000000
这里是代码
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
/* void calculus(char string[], int matrixDimension)
* Executes the following procedure:
* 1) it extracts from the string, various char type tokens
* 2) converts these char type tokens into float types and stores it into "squareMatrix" bidimensional vector
* 3) does the calculus
*/
void calculus(char string[]);
int main()
{
FILE* fileToReadFd;
int nRead;
char string[500] = {0};
const char pathNameRead[] = "/home/caterpillar/canc/matrice2.txt";
if((fileToReadFd = fopen(pathNameRead, "r")) == NULL)
{
printf("Ho provato ad aprire %s\n", pathNameRead);
printf("errore nell'aprire il file\n" "%s\n", strerror(errno));
}
nRead=fread(&string[0],sizeof(char),100,fileToReadFd);
printf("Input string is %s\n", &string[0]);
calculus(string);
fclose(fileToReadFd);
return 0;
}
void calculus(char string[])
{
int matrixDimension = atoi(&string[0]);
float finalResult = 1;
// float type square matrix to be filled
float squareMatrix[matrixDimension][matrixDimension];
// stores the result of every column addition
float columnAddition[matrixDimension];
/*
* stores tokens from the string
* I.E.:
* token[0] contains "1.0"
* token[1] contains "2.0"
* token[2] contains "3.0"
* token[3] contains "4.0"
*/
char tokens[matrixDimension * matrixDimension][8];
/*
* zero initialize columnAddition vector
*/
for(int i = 0; i < matrixDimension; i++)
{
columnAddition[i] = 0;
}
/*
* First strtok is necessary to be left alone since it takes away
* the first token that is not usefull ( it is the matrix dimension)
*/
strtok(&string[0], " ");
for(int i = 0; i < (matrixDimension * matrixDimension); i++)
{
strcpy(&tokens[i][0], strtok(NULL, " "));
printf("Extracted char type token %s from the string\n", &tokens[i][0]);
}
for(int i = 0; i < matrixDimension; i++)
{
for(int j = 0; j < matrixDimension; j++)
{
squareMatrix[i][j] = atof(&tokens[i+j][0]);
printf("Converted char type token %s into float type\n", &tokens[i+j][0]);
}
}
printf("\nPrinting matrix of float types:\n");
for(int i = 0; i < matrixDimension; i++)
{
for(int j = 0; j < matrixDimension; j++)
{
printf("%f\n", squareMatrix[i][j]);
}
}
// does calculus
for(int j = 0; j < matrixDimension; j++)
{
for(int i = 0; i < matrixDimension; i++)
{
columnAddition[j] = columnAddition[j] + squareMatrix[i][j];
}
}
for(int i = 0; i < matrixDimension; i++)
{
finalResult = finalResult * columnAddition[i];
}
printf("Final result is %f\n", finalResult);
}
答案 0 :(得分:3)
我认为这是问题:
squareMatrix[i][j] = atof(&tokens[i+j][0]);
printf("Converted char type token %s into float type\n", &tokens[i+j][0]);
因为这将为(i = 0,j = 1)和(i = 1,j = 0)引用相同的标记,因为1 + 0 = 1和0 + 1 = 1
应该是
squareMatrix[i][j] = atof(&tokens[i*matrixDimension+j][0]);
printf("Converted char type token %s into float type\n", &tokens[i*matrixDimension+j][0]);