初級プログラミング演習1の第6回の備忘録です!
第6回
6共通、6-1選択は取っておきたいですね。次に、6-3選択かな。
6-2選択も落ち着いて、頭の中で何度もイメージして確認していけば、大丈夫だと思います。
この4問は、1発100点いけるひと結構いそうですね。
6共通 1位の人
これは、標準入力から”FirstName” “FamilyName” “ゴルフのスコア”が複数行取得できるので
その中で一番成績の良い人を表示するプログラムですね。
1 2 3 4 5 |
【標準入力】 Jim Nutter 100 Don Ware 110 Steve Smith 123 Steve Jr. 100 |
だったら、一番成績の良い(ゴルフは数値が少ないほうが成績が良い)人の数値と名前を表示します。
1 2 3 4 |
【標準出力】 100 Jim Nutter Steve Jr. |
みたいな感じ。複数該当したら、名前を複数人表示
※名前等は、自分で今作ったので実際の課題とは異なります。
作戦
1 2 3 4 5 6 |
Tips:構造体 typedef struct{ char firstName[32]; char familyName[32]; int numScore; }DATA; |
みたいにする人が多かったですね。
※私は構造体を使用しないでループ1回でゴリゴリ文字列結合したので、見ずらいソースコードに…
DATAという型みたいなものを自分で作ってます。
使い方は自分で調べてね~だけでは辛いので、とりあえず以下を実行してみてイメージ掴んでください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <stdio.h> /* 構造体*/ typedef struct{ char firstName[32]; char familyName[32]; int numScore; }DATA; int main(void) { int count = 0; /* 構造体*/ DATA a[100]; while (EOF != scanf("%s %s %d\n", a[i].firstName, a[i].familyName, &a[i].numScore)) { //debug printf("debug[%s][%s][%d]\n", a[i].firstName, a[i].familyName, a[i].numScore); } //★ここまでくれば、最高スコア(一番小さい数字わかるよね) printf("最高得点\n"); //★人名表示すれば終わりー return 0; } |
人名表示は、もう一度全データみないとかな…?
1 2 3 4 5 6 7 8 9 10 11 12 |
int i = 0; for(i = 0; i < count; i++) { if(a.[i] == 最高得点) { printf("最高得点の人名\n"); } else { printf("最高得点ではない\n"); } } |
6-1選択 1位の人名
6共通の発展ですね!
1 2 3 4 5 |
【標準入力】 Jim Nutter 20 20 20 20 Don Ware 30 30 20 20 Steve Smith 22 22 55 44 Steve Jr. 30 30 22 44 |
みたいな感じになります。
あと、スペースがタブになってるところに注意ですね。
当たり前ですが、スコアは、4つの数字を足してあげれば良いでしょう。
タブは、\tですね。問題文の通り
1 2 3 4 5 6 |
while (EOF != scanf("%s\t%s\t%d\t%d\t%d\t%d\n", a[i].firstName, a[i].familyName, &a[i].num1, &a[i].num2, &a[i].num3, &a[i].num4)) { a[i].num = a[i].num1 + a[i].num2 + a[i].num3 + a[i].num4; //debug printf("[%s][%s][%d][%d][%d][%d] -> [%d]\n", a[i].firstName, a[i].familyName, a[i].num1, a[i].num2, a[i].num3, a[i].num4, a[i].num); } |
こんな感じ…見ずらいかな?
6-2選択 すごろくと駒
問題文というか解説の意味が理解できないと辛いですね。
1 2 3 4 5 |
[標準入力] 3 2 3 6 2 1 3 |
これは、2つに分けて考えないとですね!
1:最初の2行は、現在の駒の位置
1 2 |
3 …次に3つ数字が来ますよ(すごろく上にコマが3つあるよ) 2 3 6 …3つのコマの位置は、それぞれ2,3,6マス目にありますよ |
2:次の2行は、何番目の駒を動かすか
1 2 |
2 …次に2つ数字が来ますよ 1 3 …1つ目の駒、3つ目の駒を1つ動かします |
【結果】
★1つ目を動かそう!
…1つ目駒(2マス目)にあるものを3マス目へ(3マス目には2つ目の駒があるので動かせない!)
…位置:2 3 6
★3つ目を動かそう!
…3つ目駒(6マス目)にあるものを7マス目へ(7マス目にはなにもないので動かせる)
…位置:2 3 7
みたいな感じ。
6-3選択 マルバツスタンプ
oxoxox
の並びで、「ox」か「xo」が何個使われているか?を調べます。
1つ前の記号と異なれば、oxもしくはxoということになりますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//今の文字 char ch_1 = '-'; //前回の文字 char ch_2 = '-'; //1行目は個数、2行目からxoです scanf("%d\n", &num); scanf("%c", &ch_1); for(i = 1; i < num; i++) { //前回値(ch_2)に入れる ch_2 = ch_1; //1文字読む scanf("%c", &ch_1); //確認用 printf("%d個目[%c] 1つ前[%c]\n", i, ch_1, ch_2); if(ch_1 != ch_2) { //前回と違うスタンプ(文字)が来たということにする } } |
ただ、これだけだと100点取れません。
単純に1つ前の文字と比較するだけだと、oxoの並びを[ox]と[xo]で2回分と数えてしまうので。
※oxかxoの判定に入ったら、数を数えるのを次の文字では飛ばすとかしないとですね!
6-4選択 みなとハルカス
まぁ、これはGoogle等で調べたら良いのではないですかね。
C言語のソースコードとは限らないですが…
まとめ
- 6共通、6-1選択は類似の問題のため取り組むこと!
- 6-3選択も稼いでおきたいですね!
- 6-2選択は、時間があれば挑戦で良いと思います!