ショッピングモール  ポータブルCD  ヘッドホンステレオ  ICレコーダー  アクティブスピーカー


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3328

ソフトの動作不良?
投稿者---練習生(2005/01/24 21:50:33)


こんばんは。練習生です。

今回は、ソフトのVisual C++ Toolkit 2003 Command Promptについて質問。

使用OS WinXP

いつもは、下記にあるソースで001.datファイルが作成される。
printfのコマンド使用で画面に表示されましたが、今回は、ファイル作成ができなくなったり、画面に表示されなくなりました。

ソースに問題あるのでしょうか?それともソフトになんらか原因があるか、知りたいのでお願いします。

このソースは、正常に動作しました。とか、このソースに問題がある。など指摘お願いします。

ソース(ファイルを読み込み、最大、最小、平均値を取り出して、成績をつけるそれをもう1つのファイルに書き込みをするプログラム)

#include<stdio.h>
#include <stdlib.h>
int main(void){
  int N, i, data1[50], data2[50], data3[50], max, min;
  double sum, sum1;
  char fname01[30]="sugaku.dat";
  char hyou1[50];
  FILE *fp, *fp1;
  
      if((fp1=fopen(fname01,"r"))==NULL){
        printf("error!fileopen! 0");
        exit(1);
      }
      N=0;
      while(fscanf(fp1,"%d",&data1[N])!=-1){
            N++;
      }
      fclose(fp1);

   max=data1[0];
   min=data1[0];
   for(i=0; i<N; i++){
      if(max<data1[i]){
        max=data1[i];
      }
      if(min>data1[i]){
        min=data1[i];
      }
   }
    i = 0;
    sum = 0;
    while (i < N) { 
        sum += data1[i];
        i++;
    }
    sum1=sum/N;
    printf("数学(max=%2d min=%2d sum1=%2.1lf)\n",max,min,sum1);

   
if(data1[i]>=(sum1 + 1.0 *(max - sum1)/3.0)){
hyou1[i]='A';
}else if(data1[i]>=(sum1 - 1.0 *(sum1 - min)/3.0)){
hyou1[i]='B';
}else if(data1[i]>=(sum1 + 2.0 *(sum1 - min)/3.0)){
hyou1[i]='C';
}else{ 
hyou1[i]='D';
}
      
  if((fp=fopen("001.dat","w"))==NULL){
      printf("error!fileopen! 3");
      exit(1);
  }
  
  i=0; 
  for(i=0; i<N; i++){  
      fprintf(fp,"%2d %d:%c\n", i+1, data1[i], hyou1[i]);
  }
  fclose(fp);
   
  return 0;
}




動作できるとしたら、やはり再ダウンロードしたほうがよいのですかなぁ・・・?



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ソフトの動作不良? 3329 RiSK 2005/01/24 22:14:06


No.3329

Re:ソフトの動作不良?
投稿者---RiSK(2005/01/24 22:14:06)


sugaku.dat の内容はどうなっているでしょうか?
私も Windows XP Pro + VCTK2003 ですが,それがないと何とも…。


この投稿にコメントする

削除パスワード

No.3330

Re:ソフトの動作不良?
投稿者---練習生(2005/01/24 22:31:57)


>sugaku.dat の内容はどうなっているでしょうか?
>私も Windows XP Pro + VCTK2003 ですが,それがないと何とも…。

失礼しました。。

前回でやったソースプログラム データ入力です。
これで適当な数字を入力して、sugaku.datを作ることができます。
例でテストの点数を入力して、それを読み込み、成績をつけるんです。

printf("students?>>");
   scanf("%d",&N);
この部分は、人数を決めておくところです。

#include <stdio.h>
#include <stdlib.h>
void sample(char fname[], int N); int main(void){ int N; char fname01[20]="sugaku.dat"; printf("students?>>"); scanf("%d",&N); printf("sugaku\n"); sample(fname01,N); return 0; } void sample(char fname[], int N){ int i, data; FILE *fp; if((fp=fopen(fname,"w"))== NULL){ printf("error! file open\n"); exit(1); } for(i=0; i<N; i++){ printf(">>"); scanf("%d",&data); fprintf(fp,"%d\n",data); } fclose(fp); }


よろしくお願いします。


この投稿にコメントする

削除パスワード

No.3331

Re:ソフトの動作不良?
投稿者---練習生(2005/01/24 22:44:51)


治りました。
原因わかりませんが、、

sugaku.datのファイルを消して、もう一回作り直してみたら、正常に動作されました。

よくわかりませんが、、


この投稿にコメントする

削除パスワード

No.3332

Re:ソフトの動作不良?
投稿者---RiSK(2005/01/24 22:58:07)


001.dat を開いて確認しました?

評価が正しく書き込まれていますか?
あわてないで!!


この投稿にコメントする

削除パスワード

No.3333

Re:ソフトの動作不良?
投稿者---RiSK(2005/01/24 22:59:36)


>001.dat を開いて確認しました?
>
>評価が正しく書き込まれていますか?
>あわてないで!!

レス位置間違えました。3331へのレスでした。prz


この投稿にコメントする

削除パスワード

No.3334

Re:ソフトの動作不良?
投稿者---練習生(2005/01/24 23:14:42)


評価は、文字化けですが。
どうやったら、評価が見れるかは、わかりませんが(汗

メモ帳から開いてみて、こんな風にでてました。
---------------------
| 1 50:ィ 50:  50:8 
| 2 60: 60: 60:9 
| 3 70:7 70:  70:: 
| 4 80:  80: 80:; 
| 5 90:x 90:  90:< 



一応 001.datのファイルは、無事作成されました。


この投稿にコメントする

削除パスワード

No.3335

Re:ソフトの動作不良?
投稿者---RiSK(2005/01/24 23:38:19)


>一応 001.datのファイルは、無事作成されました。

えーーっ!! それで「無事」なの?
明らかにプログラムのバグじゃないですか!!
  for(i=0; i<N; i++){  
      fprintf(fp,"%2d %d:%c\n", i+1, data1[i], hyou1[i]);
  }
このループの中で評価を出さなければなりません。
hyou1[i] は何も代入されていないのでゴミです。
ゴミを書き込んでいるから化けるのでしょう。

そもそも,その場で計算するなら配列は不要ですよっ。


ついでに,最初の
> ソースに問題あるのでしょうか?
に答えます。

・data2, data3 は一度も使われないです。

・> char fname01[30]="sugaku.dat";
この場合 30 は省略できますよ。コンパイラが配列の長さを数えてくれます。
今回であれば fname01[11] になります。
意図的に 30 にしたいなら話は別です。

・> while(fscanf(fp1,"%d",&data1[N])!=-1){
fscanf が -1 を返すなんて決まりはありません。
たまたま EOF == -1 で,動いているように見えるだけです。

もっと言うと == 1 にした方がいいです。
fscanf は 0 を返すこともありますから。

他にも無駄なループなどもありました。


私が書くとこんな感じ。main 一本でダラダラですが:
#include <stdio.h>

#define IN_FILE_NAME "sugaku.dat"
#define OUT_FILE_NAME "001.dat"
#define MAX_MARK_NUM 50

#define IS_GRADE_A(mark, avg, max) \
    ((mark) >= ((avg) + 1.0 * ((max) - (avg)) / 3.0))
#define IS_GRADE_B(mark, avg, min) \
    ((mark) >= ((avg) - 1.0 * ((avg) - (min)) / 3.0))
#define IS_GRADE_C(mark, avg, min) \
    ((mark) >= ((avg) + 2.0 * ((avg) - (min)) / 3.0))

#define ErrorMsg(msg) fprintf(stderr, "%s [File:\"%s\" Line:%d]\n", msg, __FILE__, __LINE__)

int main(void)
{
    FILE * in_f, * out_f;
    int mark[MAX_MARK_NUM];
    int n, max, min, sum = 0, i;
    double avg;
    char grade;
    
    if ((in_f = fopen(IN_FILE_NAME, "r")) == NULL) {
        ErrorMsg("File open error");
        return 1;
    }
    if (fscanf(in_f, "%d", &mark[0]) != 1) {
        ErrorMsg("Valid data not found");
        fclose(in_f);
        return 1;
    }
    max = min = mark[0];
    for (n = 1; n < MAX_MARK_NUM && fscanf(in_f, "%d", &mark[n]) == 1; ++n) {
        if (mark[n] > max) {
            max = mark[n];
        }
        if (mark[n] < min) {
            min = mark[n];
        }
        sum += mark[n];
    }
    avg = sum / n;
    printf("数学(max=%3d min=%3d avg=%3.1lf)\n", max, min, avg);
    fclose(in_f);
    
    if ((out_f = fopen(OUT_FILE_NAME, "w")) == NULL) {
        ErrorMsg("File open error!");
        return 1;
    }
    for (i = 0; i < n; ++i) {
        if (IS_GRADE_A(mark[i], avg, max)){
            grade = 'A';
        } else if (IS_GRADE_B(mark[i], avg, min)) {
            grade = 'B';
        } else if(IS_GRADE_C(mark[i], avg, min)) {
            grade = 'C';
        } else {
            grade = 'D';
        }
        fprintf(out_f, "%2d %3d:%c\n", i+1, mark[i], grade);
    }
    fclose(out_f);
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.3336

Re:ソフトの動作不良?
投稿者---RiSK(2005/01/24 23:46:28)


あら,バグがあった…
1件目のデータが sum に加えられていませんでした。

> max = min = mark[0];
max = min = sum = mark[0];

sum の初期化も不要ですね。


この投稿にコメントする

削除パスワード

No.3345

関数化で間接指定とは?
投稿者---練習生(2005/01/25 20:06:53)


ありがとうございます。

そのソースを見本に試して、自分でやってみました。
わからないことがありましたので、指導お願いします。

ソース
#include<stdio.h>
#include <stdlib.h>
int sample(int N, int data[50], int max, int min, double avg);
int main(void){
  int N, i, data1[50], data2[50], data3[50], max1, max2, max3, min1,min2,min3;
  double sum,sum2,sum3, sum1, sum4, sum5;
  char fname01[30]="sugaku.dat";
  char fname02[30]="eigo.dat";
  char fname03[30]="kokugo.dat";
  char hyou1[50], hyou2[50], hyou3[50];
  FILE *fp, *fp1, *fp2, *fp3;
  
      if((fp1=fopen(fname01,"r"))==NULL){
        printf("File open error! 0");
        exit(1);
      }
      N=0;
      while(fscanf(fp1,"%d",&data1[N])!=-1){
            N++;
      }
      fclose(fp1);

  
   max1=data1[0];
   min1=data1[0];
   for(i=0; i<N; i++){
      if(max1<data1[i]){
        max1=data1[i];
      }
      if(min1>data1[i]){
        min1=data1[i];
      }
   }
    i = 0;
    sum = 0;
    while (i < N) { 
        sum += data1[i];
        i++;
    }
    sum1=sum/N;
    printf("数学(max=%2d min=%2d sum1=%2.1lf)\n",max1,min1,sum1);

   
      if((fp2=fopen(fname02,"r"))==NULL){
        printf("File open error! 1");
        exit(1);
      }
      N=0;
      while(fscanf(fp2,"%d",&data2[N])!=-1){
            N++;
      }
      fclose(fp2);


   max2=data2[0];
   min2=data2[0];
   for(i=0; i<N; i++){
      if(max2<data2[i]){
        max2=data2[i];
      }
      if(min2>data2[i]){
        min2=data2[i];
      }
   }
    i = 0;
    sum2 = 0;
    while (i < N) { 
        sum2 += data2[i];
        i++;
    }
    sum4=sum2/N;
    printf("英語(max=%2d min=%2d sum1=%2.1lf)\n",max2,min2,sum4);


      if((fp3=fopen(fname03,"r"))==NULL){
        printf("File open error! 2");
        exit(1);
      }
      N=0;
      while(fscanf(fp3,"%d",&data3[N])!=-1){
            N++;
      }
      fclose(fp3);
  

   max3=data3[0];
   min3=data3[0];
   for(i=0; i<N; i++){
      if(max3<data3[i]){
        max3=data3[i];
      }
      if(min3>data3[i]){
        min3=data3[i];
      }
   }
    i = 0;
    sum3 = 0;
    while (i < N) { 
        sum3 += data3[i];
        i++;
    }
    sum5=sum3/N;
    printf("国語(max=%2d min=%2d sum1=%2.1lf)\n",max3,min3,sum5);


  if((fp=fopen("111.dat","w"))==NULL){
      printf("File open error! 3");
      exit(1);
  }
  
  i=0; 
  for(i=0; i<N; i++){  

 hyou1[i]=sample(N, data1[N], max1, min1, sum1);
 hyou2[i]=sample(N, data2[N], max2, min2, sum4);
 hyou3[i]=sample(N, data3[N], max3, min3, sum5);

 fprintf(fp,"%2d %d:%c %d:%c %d:%c \n", i+1, data1[i], hyou1[i], data2[i], hyou2[i], data3[i], hyou3[i]);
  }
  fclose(fp);
  
  return 0;
}

int sample(int N, int data[50], int max, int min, double avg){
int i;
char hyou[50];

i=0;
 for(i=0; i<N; i++){  
if(data[i]>=(avg + 1.0 *(max - avg)/3.0)){
hyou[i]='A';
}else if(data[i]>=(avg - 1.0 *(avg - min)/3.0)){
hyou[i]='B';
}else if(data[i]>=(avg + 2.0 *(avg - min)/3.0)){
hyou[i]='C';
}else{ 
hyou[i]='D';
}
}
return hyou[50];
}




エラーで
hyou1[i]=sample(N, data1[N], max1, min1, sum1);
hyou2[i]=sample(N, data2[N], max2, min2, sum4);
hyou3[i]=sample(N, data3[N], max3, min3, sum5);

の3つが
'int*'は'int'と間接指定のレベルにおいて異なります。
とでていますが、これは、どういう意味なんですか?




この投稿にコメントする

削除パスワード

No.3347

Re:関数化で間接指定とは?
投稿者---REE(2005/01/25 20:30:19)


> hyou1[i]=sample(N, data1[N], max1, min1, sum1);
> hyou2[i]=sample(N, data2[N], max2, min2, sum4);
> hyou3[i]=sample(N, data3[N], max3, min3, sum5);
>
>の3つが
>'int*'は'int'と間接指定のレベルにおいて異なります。
>とでていますが、これは、どういう意味なんですか?
>

data1[N]はint型です。それに対して、sampleの第二引数はint*型です。
そのため、不一致でエラーが出ています。
以下のようにすれば、このエラーは取れるでしょう。

hyou1[i]=sample(N, data1, max1, min1, sum1);



この投稿にコメントする

削除パスワード

No.3348

Re:関数化で間接指定とは?
投稿者---練習生(2005/01/25 20:57:20)


ありがとうございます。エラー発生しなくなりましたが、疑問があります。

内容が変わったので新規投稿します。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity