0

ダブルを使用すると、これが私のコードを台無しにする理由を本当に知りたいです。私の理解では、double は単により正確な浮動小数点数です。しかし、次のコードでは、float を double に置き換えると、奇妙な出力が得られます。これは、すべてのコードが入力を受け取り、それを吐き出すことだけを行っているにもかかわらずです。

#include <stdio.h>

int y;
int z;
int i;
int n;
int r;
int c;
float e;
float d;

void main() {
    puts("Enter Row Number:");
    scanf("%i", &r);
    puts("Enter Column Number:");
    scanf("%i", &c);
    float x[r][c];
    int j = r;

    for(y = 1; y <= r; y++) {
        for(z = 1; z <= c; z++) {
            scanf("%f", &x[y][z]);
        }
    }
    for (y = 1; y <= r; y++) {
        for(z = 1; z <= c; z++) {
            printf("%g\t", x[y][z]);
        }
        puts("\n");
    }
}

float を使用する場合、行に 2、列に 3 を入力した後、1 ~ 6 の数字を入力すると、予想どおり 1 ~ 6 の出力が得られます。しかし、代わりに double を使用し、入力を以前と同じに保つと、{1.36224e-312,1.78905e-307, 1.81506e-307, 3.15957e+263, 5.3568e-315, 3.44886e-313 の出力が得られます。 }。明らかに、それは正しいとは言えません。また、ここで複素数を扱っているわけでもありません... 1 ~ 6 の整数だけです。何を与える?

4

2 に答える 2

0

あなたのループは間違っています:

for(y = 1; y <= r; y++) {
    for(z = 1; z <= c; z++) {

配列を定義するとき

float x[r][c];

配列のインデックスは、ゼロからサイズから 1 を引いた値になります。したがって、配列のy制限はx

x[0]  /* first sub-array */
x[r - 1]  /* last sub-array */

ループを次のように変更します

for(y = 0; y < r; y++) {
    for(z = 0; z < c; z++) {

現在はゼロから始まり、代わりに小なり比較演算子を使用していることに注意してください。

于 2012-11-28T07:06:39.487 に答える
0

scanf %fのアドレスが必要floatです。scanfローカルではない変数に対して直接データを読み取るのは危険です。実際にfloat. この方法でコードを変更して、より堅牢にします。

float temp;
scanf("%f", &temp);
x[y][x] = temp;
于 2012-11-28T02:54:03.033 に答える