投票受付中のQ&A
ベストアンサーにふさわしい回答に投票してください。
- 投票すると
5枚プラスされます。
- ベストアンサーに選ばれた回答に、最初に投票していれば
10枚プラスされます。
-
- 残り時間:
- 7日間
-
- 投票数:
- 0票
C言語について質問です
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
分かる方ご回答お願いします
-
- 質問日時:
- 2012/11/24 14:02:41
-
- 残り時間:
- 7日間
-
- 投票開始:
- 2012/12/2 04:23:50
-
- 投票数:
- 0
-
- 回答数:
- 3
-
- お礼:
- 知恵コイン
- 25枚
-
- 閲覧数:
- 128
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
回答
(3件中1〜3件)
- 並べ替え:回答日時の
- 新しい順
- |
- 古い順
/* リダイレクト、パイプを使った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
*/
- 違反報告
- 回答日時:2012/11/25 20:19:16
かなり汚いプログラムですが・・・。(特に問題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