質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

831閲覧

数字(文字)が何も書かれていない、を表現するのにNULLであってるのか

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/11/12 03:03

###前提・実現したいこと
C言語を使って,「input.txtに1個以上の実数が1行に1つずつ改行を挟んで書かれているとき,
記載されている実数をすべて読み込み,数値の合計,数値の個数,平均値,標準分散を求めて表示
するプログラム」を作りたいです.

###発生している問題・エラーメッセージ
do-while文を使って個数を数えたくて,「数値が書かれなくなったとき」を表現するために
,何も書かれていないという意味でwhile(count==NULL)と書きました.(この書き方でerror
が出たのでおそらく間違ってるんですが正しいやり方が分かりません...)

エラーメッセージ warning:comparison between pointer and integer

###該当のソースコード
#include<stdio.h>
int main(){
FILE *FP;
double ave, data, sum1=0.0, sum2=0.0, stdbun;//stdbunは標準偏差
int count=0;//何個の実数が書かれているかを数える変数

FP=fopen("input.txt", "r");
do{
fscanf(FP, "%f", &data);
sum1=sum1+data;
sum2=sum2+datadata;
count++;
}while(count==NULL);
fclose(FP);
ave=sum1/(double)count-1;
stdbun=ave
ave-2avesum1/(double)(count-1)+sum2/(double)(count-1);
printf("sum:%.2f", sum1);
printf("times:%d", count-1);//書かれていた実数の個数
printf("ave:%.2f", ave);
printf("stdbun:%.2f", stdbun);
return 0;
}

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/12 03:22

C# のタグが付いていますが、それは間違いで、C もしくは C++ の話ですよね。であれば訂正願います。
guest

回答2

0

おそらく、
#define NULL (void*)0
のように定義されていると思います。この定義だとNULLはポインタですので、そのままでは数値と比較することはできません。

実現したいのはcountが0かどうかを判定することですので、単純に 0 と記述すればよいと思います。

あくまで NULL は NULLポインタ と思っていてよいでしょう。

ちなみにコンピュータ内部で「何も書かれていない」ことは有り得ません。
自分で何かを書いた覚えがないのなら「ゴミ」が書かれています。

投稿2017/11/12 06:22

nob.

総合スコア711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。
※回答の前に
0. ソースコードを貼るときはmarkdownを使って整形しましょう。

  1. タグが「C#」になっています。正しくは「C」かと。

続けて回答ですが、

warning:comparison between pointer and integer

エラーメッセージと言うか警告としては「ポインターとintegerを比較しているのでおかしくね?」ですね。ファイルからfscanfを利用して行データを読み込んでいるのですから、fscanfの返り値が使えます。
scanf

返り値がEOFならファイル終端なので、これでループを抜けます。do ~ whileは少々不適切です。でないと、今の質問者様のコードでは、空の無効なデータを参照していることになります。

fscanfで正しく1項目読めたら1が返るので、そのときに count++します。
尚、fscanfでの読み込むデータはdouble なので、書式指定は"%f"ではなく、"%lf"かと。

ファイルのfopen時のチェックなどを含めて修正してみた例が以下、です。

C

1#include<stdio.h> 2 3int main(){ 4 FILE *FP; 5 double ave, data, sum1=0.0, sum2=0.0, stdbun;//stdbunは標準偏差 6 int count=0;//何個の実数が書かれているかを数える変数 7 8 FP=fopen("./input.txt", "r"); 9 if (FP == NULL) { 10 return 1; 11 } 12 13 int ret; 14 for (;;) { 15 /* double なので%lfを使う 16 fscanf(FP, "%f", &data); 17 */ 18 ret = fscanf(FP, "%lf", &data); 19 if (ret == EOF) { 20 printf("End of file.\n"); 21 break; 22 } else if (ret == 1) { 23 sum1=sum1+data; 24 sum2=sum2+data*data; 25 count++; 26 } 27 } 28 fclose(FP); 29 printf("count=%d\n", count); 30 31 ave=sum1/(double)count-1; 32 stdbun=ave*ave-2*ave*sum1/(double)(count-1)+sum2/(double)(count-1); 33 printf("sum:%.2f", sum1); 34 printf("times:%d", count-1);//書かれていた実数の個数 35 printf("ave:%.2f", ave); 36 printf("stdbun:%.2f", stdbun); 37 return 0; 38}

投稿2017/11/12 04:21

編集2017/11/12 04:27
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/16 11:13

返信遅くなりまして申し訳ありません. 無事解決しました,ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問