ここから本文です

投票受付中のQ&A

お知らせベストアンサーにふさわしい回答に投票してください。
投票すると知恵コイン5枚プラスされます。
ベストアンサーに選ばれた回答に、最初に投票していれば知恵コイン10枚プラスされます。
  • 残り時間:
    7日間
  • 投票数:
    0票

C言語について質問です

tag1111111さん

C言語について質問です

問題1

次のような名前と点数をメンバーに持つ構造体studentを定義する。


Define the struct student with name and score as members.


char name[20]; //名前
int score; //点数

studentの大きさ5の配列を作り、キーボードから5人分のデータを入力し、その配列に格納する。点数の平均を求め、平均点以上の名前と点数を表示する。





問題2

問題1で、キーボード入力を"data1.txt"なるファイルからの入力に、平均点以上の名前と点数の出力を"data2.txt"なるファイルへの出力に変えたプログラムを作れ。平均点の表示は問題1と同様に行う。
但し、配列の大きさは100とし、100個までのデータを格納できるようにしておく。ファイルのデータ入力はEOF検出までとする。実行前に、"data1.txt"ファイルにはデータを格納しておくこと。

実行例


$cat data1.txt
yamada 86
ito 75
ando 82
ueda 69
tanaka 92

$./mondai2
Average: 80

$cat data2.txt
yamada 86
ando 82
tanaka 92

分かる方ご回答お願いします

違反報告

回答

(3件中1〜3件)

並べ替え:回答日時の
新しい順
古い順

 

hiroshi09spiさん

/* リダイレクト、パイプを使ったUNIX的回答例です。
http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%E...
*/


#include <stdio.h>
#define SIZE 5 //これは問1用です。問2はここだけを 100 に設定のこと。

struct student{
char name[20]; //名前
int score; //点数
};

int main(void){
struct student member[SIZE];
int n=0, sum=0, i;
double mean;

while(n<SIZE && (fprintf(stderr, "%d: ", n + 1), fscanf(stdin, "%s %d", &member[n].name, &member[n].score) != EOF)){
sum += member[n++].score;
}

fprintf(stdout, "Average: %g\n", mean = (double)sum / n);

for(i=0; i<n; i++){
if((double)member[i].score >= mean) fprintf(stdout, " %s %d\n", member[i].name, member[i].score);
}

return 0;
}


/* 実行例1: $ ./a.out [Enter]
1: yamada 86[Enter]
2: ito 75[Enter]
3: ando 82[Enter]
4: ueda 69[Enter]
5: tanaka 92[Enter]
Average: 80.8
yamada 86
ando 82
tanaka 92


実行例2: $ ./a.out<data1.txt 2>/dev/null | tee data2.txt[Enter]
Average: 80.8
yamada 86
ando 82
tanaka 92

$ cat data2.txt[Enter]
Average: 80.8
yamada 86
ando 82
tanaka 92

*/

この回答に投票する

hidenari_1さん

かなり汚いプログラムですが・・・。(特に問題2)

問題1
#include <stdio.h>
struct student
{
char name[20];
int score;
};
int main (void)
{
int i, ave;
struct student data[5];
for(i = 0; i < 5; i ++)
{
printf("name>>");
scanf("%20s", data[i].name);
printf("score>>");
scanf("%d", &data[i].score);
ave += data[i].score;
}
printf("Average=%d\n", ave / 5);
for(i = 0; i < 5; i ++)
{
if(data[i].score >= ave / 5)
{
printf("%s %d\n", data[i].name, data[i].score);
}
}
return 0;
}

問題2
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buf[256];
char buf1[10];
char name[100][256] = {{'\0'}, {'\0'}};
int ten[100] = {0}, j = 0, count = 0, i = 0, ave = 0;
FILE *fp;
if((fp = fopen("data1.txt", "r")) == NULL)
{
printf("file not found\n");
return 0;
}
while(fgets(buf, 256, fp) != NULL)
{
while(1)
{
if(buf[j] == 32)
{
j ++;
break;
}
name[count][j] = buf[j];
j ++;
}
while(1)
{
if(buf[j] == '\n' || buf[j] == '\0')
{
i ++;
break;
}
buf1[i] = buf[j];
i ++; j ++;
}
buf1[i] = '\0';
ten[count] = atoi(buf1);
i = j = 0;
count ++;
}
fclose(fp);
for(i = 0; i < 100; i ++)
{
if(ten[i] == 0)break;
ave += ten[i];
}
ave = ave / i;
printf("Average=%d\n", ave);
if((fp = fopen("data2.txt", "w")) == NULL)
{
printf("file cannot open\n");
return 0;
}
for(i = 0; i < 100; i ++)
{
if(ten[i] == 0)break;
if(ten[i] >= ave)
{
fprintf(fp, "%s%d\n", name[i], ten[i]);
}
}
fclose(fp);
return 0;
}

解説
問題1は、構造体を理解していれば、簡単な問題です。
問題2は、data1.txtから、data2.txtに、ただ単にコピーするプログラムを作ってみると、わかりやすいかもしれないです。

<<補足>>
すいません、これ、問題2も構造体でやったほうが簡単でした(汗
しかも、入力も簡単に、scanf()で実装すべきでしたね。

問題2、修正版
#include <stdio.h>

struct student
{
char name[256];
int ten;
};

int main (void)
{
int i, ave = 0, swp;
struct student data[100];
FILE *fp;
if((fp = fopen("data1.txt", "r")) == NULL)
{
printf("file not found\n");
return 0;
}
for(i = 0; fscanf(fp, "%s %d", data[i].name, &data[i].ten) != EOF; i ++)ave += data[i].ten;
ave = ave / i; swp = i;
printf("average=%d\n", ave);
fclose(fp);
if((fp = fopen("data2.txt", "w")) == NULL)
{
printf("file cannot open\n");
return 0;
}
for(i = 0; i <= swp; i ++)
{
if(data[i].ten >= ave)fprintf(fp, "%s %d\n", data[i].name, data[i].ten);
}
fclose(fp);
return 0;
}

こっちのほうが、簡単で、理解しやすいかと。

この回答に投票する

  • 違反報告
  • 編集日時:2012/11/26 22:17:44
  • 回答日時:2012/11/24 19:10:22

wakaba1990さん

なにも臆することはありません。そのまま言われたとおりにすればいいことです。

何処で躓いているのか分からないので助言しようがありません。

この回答に投票する

どの回答もふさわしくない

PR

carview愛車無料査定
PR
Yahoo!知恵袋のQ&Aアプリが登場! さくさく検索、かんたんに質問や回答ができる! Yahoo!知恵袋アプリ

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。


お得情報

太陽のマテ茶プレゼント中
香ばしく、スッキリした後味
すき焼き食べたらマテ!

その他のキャンペーン

知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する