0

プログラムは、次のようなテキストファイルから文字列を入力します。

2 1.0 2.0 3.0 4.0

ここで、最初の数値は正方行列の次元であり、他の数値は行列の要素です(列の主要な形式で格納されます)。すべての数値は「スペース」文字で他の数値で区切られます。プログラムは単一の列にすべての数値を加算し、この種のすべての結果を乗算します。この文字列を使用したIEの結果は次のようになります。21.0問題は次のとおりです。この入力を使用すると、プログラムの出力は次のようになります。

入力文字列は21.02.0 3.0 4.0

文字列からchar型トークン1.0を抽出しました

文字列からchar型トークン2.0を抽出しました

文字列から文字タイプトークン3.0を抽出しました

文字列から文字タイプトークン4.0を抽出しました

char型トークン1.0をfloat型に変換しました

char型トークン2.0をfloat型に変換

char型トークン2.0をfloat型に変換

char型トークン3.0をfloat型に変換

フロートタイプの印刷マトリックス:

1.000000

2.000000

2.000000

3.000000

最終結果は15.000000です

代わりに次のようになります。入力文字列は21.02.0 3.0 4.0

文字列からchar型トークン1.0を抽出しました

文字列からchar型トークン2.0を抽出しました

文字列から文字タイプトークン3.0を抽出しました

文字列から文字タイプトークン4.0を抽出しました

char型トークン1.0をfloat型に変換文字型token2.0をfloat型に変換

float型char型トークン2.0をfloat型に変換しました。

char型トークン3.0をfloat型に

フロートタイプの印刷マトリックス:

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);
}
4

1 に答える 1

3

これが問題だと思います:

squareMatrix[i][j] = atof(&tokens[i+j][0]);
printf("Converted char type token %s into float type\n", &tokens[i+j][0]);

1+0 = 1 と 0+1 = 1 の両方であるため、これは (i=0, j=1) と (i=1, j=0) の両方で同じトークンを参照します。

そのはず

squareMatrix[i][j] = atof(&tokens[i*matrixDimension+j][0]);
printf("Converted char type token %s into float type\n", &tokens[i*matrixDimension+j][0]);
于 2012-07-14T14:22:29.650 に答える