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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

7回答

2279閲覧

最高値の人の情報だけ表示させたい

papapa

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2021/11/17 16:41

編集2021/11/19 05:17

前提・実現したいこと

氏名、年齢を変数として持つ構造体を宣言し、大きさ10の構造体配列を定義。その配列に対して、10人分の氏名と年齢を入力し、年齢が最も高い人の氏名と年齢を表示させたいです。

###追記(2021/11/19 14:12)
みなさんアドバイス等ありがとうございます。
私の能力が産毛が生えるかどうかしかないのと、自己中心的な考えが、みなさんを苛出せているのだろうなと思ってます。
私的には何時間も考えて分からなくなって聞いてるので、100%投げ出してるつもりはないのですが、きっと適当にしてるように見えてしまうのでしょうね。
正直、みなさんからいただいたコードがそんなに理解できてないので、またそれぞれの使い方を学んでから質問等させていただきたいです。的外れな質問をしてしまうかも知れませんが、よろしくお願いします。(下記のコードは変えてません)

該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3 4typedef struct 5{ 6 char name[256]; 7 int age; 8} Students; 9 10void InputStudents(Students *data); 11void ShowStudents(Students data); 12 13int main(void) 14{ 15 Students data[10]; 16 int i; 17 int max; 18 int age_max; 19 max=0; 20 age_max=0; 21 for(i=0;i<10;i++){InputStudents(&data[i]);} 22 ShowStudents(data[i]); 23 max=0; 24 if (max <= data[i].age) { max = data[i].age; age_max = i; } 25 26 return 0;} 27 28void InputStudents(Students *data) 29{ 30 printf("氏名(空白なしで入力):"); 31 scanf("%s",data->name); 32 printf("年齢:"); 33 scanf("%d",&data->age); 34 printf("\n"); 35} 36 37void ShowStudents(Students data) 38{ 39 printf("最高年齢の生徒:%s,年齢:%d", data[age_max].name,data[age_max].age); 40 41}

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

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

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

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

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

jimbe

2021/11/17 16:56

> 頭がこんがらがってきました では、それを解してからまた考えるか、全て初めからやり直しては如何でしょうか。 頭の中でまとめられないのなら、紙に書くなりパソコンやスマホを使うなり、やり方はそれぞれあるのではないでしょうか。
episteme

2021/11/17 17:57

> tabを使わない派なので見にくいかも知れませんが、ご了承ください。 なら空白を使ってインデントつけてください。
kaina

2021/11/18 00:13

あなたの主義主張はどうでも良いですが、人に対して質問しているのに読みづらいPGを敢えて提示するほどの優先されることなのですか?
papapa

2021/11/18 00:19

やり直しまくった結果ですので、これ以上考えられないのです。 読みにくいかどうかは人様々だと考えています。 私のように使わない人もいるでしょうからこのままでいいかと思っております。
kaina

2021/11/18 00:29

その主張が通るのは学生の間だけですよ。 悪いことは言わないので今のうちからインデントする癖を付けておいたほうが良いです。 プログラム言語(Python)によってはインデントしないと思った動作しない言語もあります。 会社に入ってもしPhtyonを使用した案件を与えられた場合、私はインデントしない主義なのでその案件は出来ませんと言えますか?
papapa

2021/11/18 00:33

だめなんですかね、、、 pythonにおいてインデントが大事なのは分かっております。 ですが、c言語はインデントが重要ではないじゃないですか、、、
episteme

2021/11/18 00:34

> やり直しまくった結果ですので、これ以上考えられないのです。 ...わからんなー、「これまでに見つかった最高値 より もっと大きい要素を見つけたら 最高値を更新する」 を要素数だけ繰り返すだけなんだが。
papapa

2021/11/18 00:38

単純なこともできないから悩んでいるのです。
episteme

2021/11/18 00:52

「最高値はいくつですか」は解けるのに 「最高値は何番目の要素ですか」は解けない、と?
kaina

2021/11/18 01:00

確かにC言語においては必須ではありませんが、可読性の低いPGを書けばその分だけ{}の数の不一致等の単純ミスをしやすくなります。 自分でインデントを整えるのが苦手という話しであればショートカットキー一つで自動整形してくれる機能を持っているVScode等を利用すると良いかと。 参考ページ https://reactnative-st.com/2020/08/04/3835/
BeatStar

2021/11/18 01:10

> だめなんですかね、、、 それはどうなんでしょうかえでもわたしはすうがくがにがてなのでくわしいことわわかりませんにやぷろぐらみんぐはいがいとすきでふね …とかみたいな文章で説明されてもいいのでしょうか。 私なら『読みづらい』としか思わないし。 でももしかしたら『漢字が苦手で使いたくない。それに句読点もバ○らしくて使いたくない。あと、カタカナもイライラするから使いたくない』っていう主義かもしれませんね。 そうなるとその文章を読ませられる人はどう思うでしょうか。 『漢字のど忘れはわからないでもないが、せめて読み手に配慮しろよ…それがマナーだろ…』的な感覚になりますよね。 プログラミングってのは『決まったものを書けばいい』というのではありません。ロジックを書くのです。 小説やツイートを独自の言語で書くようなものです。 なので、半角スペースでいいのでインデントはいれましょう。適宜に。
fana

2021/11/18 01:14

> 読みにくいかどうかは人様々だと考えています。 > 私のように使わない人もいるでしょうからこのままでいいかと思っております。 手元に何か殴り書きしたメモがあるとして, 他者と問題を共有する際にそのぐちゃぐちゃのメモ書きをそのままコピーして他者に資料として配って話するのか? っていうのと似てるかな. ふつーは他者が見やすい/他者に説明しやすい ような資料なりをこしらえるんじゃない? ご自身だけが見る手元のコードであれば「俺はインデントしない!」とかいくらでも好き勝手に書けばいいよ. Cの文法的には問題無いし. でも,他者と話をする際にそれをそのまま持ち込むという姿勢というか思想と言うか,その辺にとっても違和感がある.
WoodenHamlet

2021/11/18 02:06

IOCCCというCのソースコードの読みにくさ(と美しさ)を競う大会があるのだが、調べてみるといい むろん彼らは読みにくくする主義というわけではないが、Cというものがどれだけ「文法的に許される範囲で」読みにくくなるかがわかるだろう。だから、「c言語はインデントが重要ではないじゃないですか、、、」とか言ってないで読みやすくする姿勢を見せてほしい。人に読ませたいならね
Zuishin

2021/11/19 06:03

> 私的には何時間も考えて分からなくなって聞いてるので、100%投げ出してるつもりはないのですが、きっと適当にしてるように見えてしまうのでしょうね。 何時間考えたかは関係ない。 聞かれたことを無視したり口答えしたり、まるで自分が命令を下す上司であるかのように振舞っている。 回答者は作業者ではない。 作業者は自分。 この当然なことを言われて上から目線だと感じるようなら、知らず知らずのうちに回答者を上から見ていることになる。 まず二つの関数を作りなさい。 一つ目はポインタを受け取り、ユーザーからの入力を構造体にして渡されたポインタに入れる関数。 二つ目はポインタを受け取り、そこに格納されている構造体を出力する関数。 それができたら、引数を配列の先頭ポインタとしてその二つを呼び出し、入力されたものが間違いなく出力されることを確かめなさい。 まずはここまで。 それができたら次のステップに進む。 質問が大きすぎて何がわからないのか、どこでつまずいているのかがわからない。 このように順を追って作り、つまずいたところを聞くようにしなさい。
dodox86

2021/11/19 06:12

質問文への追記(2021/11/19 14:12)を読んで: 苛立たせるかどうかはこの際どうでもよくて、未完成とはいえ一応これだけコードができていて、たくさんの回答を得ていてなぜ分からないか、閲覧者、回答者ともに不思議に思ってしまっているのではないでしょうか。質問文中のコードは、ご自身で考えて書いたのですよね。ググってそれっぽいのをコピペしただけなのでしょうか。いや、コピペしたとしても理解して消化できているならいいですが、自分でコードの1行1行を説明できますか?
guest

回答7

0

自己解決

皆さんの考えを参照し、答えを導けました!
誰だけの考えを参照したというわけではないので、自己解決として処理させていただきます。
自分勝手で申し訳ありません。

c

1#include <stdio.h> 2 3typedef struct{ 4 char name[64]; 5 int age; 6} student; 7 8 9int main(void) { 10 student data[10]; 11 int i; 12 int max= -1; 13 int x; 14 for (i = 0; i < 10; i++) { 15 printf("%d人目の氏名(空白なしで入力):", i + 1); 16 scanf("%s", data[i].name); 17 printf("年齢(数字のみ):"); 18 scanf("%d", &data[i].age); 19 if (data[i].age > max) { 20 max = data[i].age; x = i; 21 } 22 } 23 for (i = 0; i < 10; i++) { 24 if (data[i].age >= max) 25 printf("\n最高年齢の生徒の氏名:%s 年齢:%d",data[i].name,data[i].age); 26 } 27}

投稿2021/11/22 06:19

papapa

総合スコア11

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

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

fana

2021/11/22 06:32

> int x; これは不要ですね. > x = i; として代入はされていますが,誰もこの x の値を用いてはいないので.
jimbe

2021/11/22 06:39

ほぼ完全だと思います。 ほんの僅かに修正するとすれば、変数 x は代入しているだけで仕様していませんので、宣言及び代入は削除して良いでしょう。 また、最後から二番目の "}" に妙なインデントが付いています。 これは teratail の所為かもしれませんが、折角のインデントですので、なるべく正確に付けたほうが良いかと思います。 (スペースとタブが混在してインデントをつけていると teratail ではずれますので、どちらかに統一されると良いです。)
guest

0

今だけoneliner派なので、見にくいかもしれませんがご承知ください。

C

1main(){Students d[10],m;int i;for(i=0;i<10;i++)InputStudents(&d[i]);for(i=0,m.age=-1;i<10;i++)if(m.age<d[i].age)m=d[i];ShowStudents(m);}

投稿2021/11/18 02:10

matukeso

総合スコア1681

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

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

papapa

2021/11/18 03:01

わざわざ一つにしていただきありがとうございます。 m.age=-1なのはなぜですか?
matukeso

2021/11/18 03:08

mの初期値は不定のため、最初の比較がtrueになるように-1をいれてます。m=d[0]にしてforを1からはじめるなどの手も有りますが。
guest

0

他者の回答の中に

『現実世界のシミュレーション』

という言葉があるので,現実世界の話で考えてみました.

10人の中で一番の者を決める にはどうするだろうか…?

【トーナメント戦で決めたら良いのではないだろうか】と.


…というわけで,10人で争うためのトーナメント表をてきとーに定めました.

イメージ説明

絵には 0~18 の数値が書かれていますが,これは,

  • 1の場所の人と2の場所の人とが戦い,勝った方が10の場所に進む

みたいな,トーナメント表での場所を示すindex値で,この値はそのまま下記コードでの配列 P[] のindexに対応しています.

で,「戦いは年齢が上の側が勝つ」ということにして,ひたすら試合を消化していく→最後に P[18] の場所に到達した者こそが年長者であるということになります.

C

1//aとb年齢を比較し,年齢が大きい側を返す(同年齢の場合はa側を返す) 2const Students *Older( const Students *a, const Students *b ) 3{ return ( (a->age >= b->age) ? a : b ); } 4 5int main(void) 6{ 7 //※入力部は省略 8 const Students data[10] = { 9 {"A",5}, {"B",38}, {"C",8}, {"D",6}, {"E",1}, 10 {"F",16}, {"G",4}, {"H",7}, {"I",0}, {"J",3} 11 }; 12 13 //初期状態:0~9の場所に10人を配置する 14 const Students *P[19] = { 0 }; 15 for( int i=0; i<10; ++i ){ P[i] = data+i; } 16 17 //1回戦 18 P[10] = Older( P[1], P[2] ); //1の場所の人と2の場所の人とが戦い,勝った方が10の場所に進む 19 P[11] = Older( P[3], P[4] ); 20 P[12] = Older( P[6], P[7] ); 21 P[13] = Older( P[8], P[9] ); 22 //2回戦 23 P[14] = Older( P[10], P[11] ); 24 P[15] = Older( P[12], P[13] ); 25 //3回戦 26 P[16] = Older( P[0], P[14] ); 27 P[17] = Older( P[5], P[15] ); 28 //決勝戦(4回戦) 29 P[18] = Older( P[16], P[17] ); 30 31 //結果表示 32 printf( "%s : %d\n", P[18]->name, P[18]->age ); 33 return 0; 34}

[追記]
あるいは,こんなのでも良いかもしれない.

  • 各々が,自身よりも若い者のいずれか1人を指し示す(対象がいない場合は何もしない)
  • 最も指し示された人は退場する(全員の指し示された数が0回だろうが,とにかく誰かを退場させる)

というのを,最後の1人になるまで繰り返す.

C

1int main(void) 2{ 3 //※入力部は省略 4 const Students data[10] = { 5 {"A",5}, {"B",38}, {"C",8}, {"D",6}, {"E",1}, 6 {"F",16}, {"G",4}, {"H",7}, {"I",0}, {"J",3} 7 }; 8 9 //初期状態:最初は10人全員 10 int nSurvivors = 10; 11 const Students *Survivors[10] = { 0 }; 12 for( int i=0; i<10; ++i ){ Survivors[i] = data+i; } 13 14 //残り1人になるまで追放審議会を繰り返す. 15 while( nSurvivors > 1 ) 16 { 17 //各々が追放したい1人に投票する(ただし,自身より若い奴にしか投票しない) 18 int VotingSpace[10] = { 0 }; 19 for( int i=0; i<nSurvivors; ++i ) 20 { 21 //てきとーに自分りも若い奴を1人見つけて,そいつに投票する 22 for( int j=0; j<nSurvivors; ++j ) 23 { 24 if( Survivors[i]->age > Survivors[j]->age ) 25 { 26 VotingSpace[j]++; 27 break; 28 } 29 } 30 } 31 //最も票が多かった人は追放です 32 int iMaxVote = 0; 33 int MaxVote = VotingSpace[0]; 34 for( int i=1; i<nSurvivors; ++i ) 35 { 36 if( MaxVote < VotingSpace[i] ) 37 { 38 iMaxVote = i; 39 MaxVote = VotingSpace[i]; 40 } 41 } 42 Survivors[ iMaxVote ] = Survivors[ nSurvivors-1 ]; 43 --nSurvivors; 44 } 45 46 //結果表示 47 printf( "%s : %d\n", Survivors[0]->name, Survivors[0]->age ); 48 return 0; 49}

[さらに追記]
老人が若い奴を蹴落としていくやり方をするなら,
「平均年齢より低い人はお帰り下さい」みたいなルールで一度にごっそりと脱落者を出していく方が話が早いな.
↑のwhile以降の部分を以下のように変えればいいかな.

C

1 while( 1 ) 2 { 3 int Sum = 0; 4 for( int i=0; i<nSurvivors; ++i ){ Sum += Survivors[i]->age; } 5 6 int n = nSurvivors; 7 for( int i=0; i<n; /*NOP*/ ) 8 { 9 if( nSurvivors * Survivors[i]->age < Sum ) 10 { 11 Survivors[ i ] = Survivors[ n-1 ]; 12 --n; 13 } 14 else 15 { ++i; } 16 } 17 if( n == nSurvivors )break; 18 nSurvivors = n; 19 } 20 21 //結果表示 22 for( int i=0; i<nSurvivors; ++i ) 23 { printf( "%s : %d\n", Survivors[i]->name, Survivors[i]->age ); }

投稿2021/11/19 06:54

編集2021/11/19 09:49
fana

総合スコア11996

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

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

fana

2021/11/19 09:24

「あなたよりも年上の人を紹介して」ってのを,てきとーな人から始めて 紹介された人にまた同じことを繰り返す → 紹介されなくなったら完了 とかでもいいかも.
guest

0

まず、前提そのものが間違っています。(特にマインドセットが)

一つ目。『マインドセットを整えよ』。

プログラミングと言うのは「こう書けばいい」というものではありません。簡単に言えば『現実世界のシミュレーション』です。

いろいろ調べ、その都度考えてはいるのですが、頭がこんがらがってきました。

もしかして、『C言語 最大値 取得』とかみたいな検索して、それでヒットしたコードを切り貼りしているのではないですか?
もしそうならそういうやり方を今すぐやめましょう。

小説を書くときに、意味を考えずに単に既存の文を切り貼りしているだけの状態です。

そもそも、プログラミングというのは『こう書けばいい』ではなく、『現実世界のシミュレーション』です。よって、『現実世界でならどうするか』を考えてみてください。

二つ目。『"現実世界でならどうするか"を考えよ』。

必ずこの方法でないとダメということではありませんが、少なくとも矢鱈目ったらに書くよりは効率的です。
プログラミングは「現実世界のシミュレーション」です。なので、現実世界で考えてみましょう。

[依頼] 私が{氏名,年齢}を一つにしたもの10人分(= 10件)を言うので、貴女/貴方はその中から 最も年齢が高い人の氏名と年齢を言ってくれ。

的な依頼かなんかだとして、上司か友人か誰かが貴方/貴女に言ったとします。
どのように対処しますか?

私なら、{氏名,年齢}を一つのデータとして見なす。それをノートかなんかに記録していく。そして、そのノートを見て、『年齢』の部分を基準(キー)にして年齢が高い方を選択する。すると、{氏名,年齢}で一つなので、年齢さえわかれば名前もわかる…という風にできます。

この場合、

方法1: (年齢をキーとして)昇順にソートして、末尾を最高値と仮定し、その位置にある氏名と年齢を出力する 方法2: (年齢をキーとして)降順にソートして、先端を最高値と仮定し、その位置にある氏名と年齢を出力する 方法3: 最大値を計算するアルゴリズムを利用して行う

が思いつきますね。軽く考えて。

方法1,2は基準が昇順なのか降順なのかが違うだけで発想自体は一緒ですね。

この場合は、

1. ソートする 2. 先端(または末尾)のデータを取得する

的なロジックで行けますね。

まあ、今回は方法3でやってみましょうか。

えーっと、たとえば

太郎: 21 次郎: 20 かめ: 64 つる: 72 三郎: 19 花子: 27

のような名簿リストになっているとしたら、どういう風にやりますか?

私なら、まず単に最大値を求めます。太郎は21歳なので、これを暫定一位とします。そしてノートかどこかに暫定一位: 21のような感じで記録します。でもこのままだと最後までやると『どこのデータか』がわからなくなりますね。なので『どこにあったものか』も記録しておく必要があります。よって、暫定一位: 21歳, 場所: 1人目 のように記録しておく。横並びでも縦並びでもいいですが。

で、2人目の次郎。20歳ですね。で、現在の暫定一位は21歳。21と20はどちらが年上でしょうか。
普通に考えれば21歳ですよね。つまり暫定一位が大きい。なので何もせずに次の人へ。

三人目はかめ。64歳ですね。21歳と64歳はどちらが年上でしょうか。そう、64歳ですね。つまり暫定一位よりもかめの方が年上。よって、暫定一位を21から64に書き換えます。ついでに場所も1人目から3人目に書き換えましょう。よって、暫定一位: 64歳, 場所: 3人目のようになるはずです。

これを最後まで繰り返すと、暫定一位: 72歳, 場所: 4人目 となるはずです。

で、年齢はすでに分かっていますが、氏名がわからない。でも考えてみると、『場所』が分かっているのだから、その場所にある人名、つまり「つる」が最年長ということになりますね。

これを実装するだけです。

一応、今回は場所も記録していますが、今回の場合は「場所」ではなく、『暫定一位のデータ丸ごと』を持ってもいいです。つまり、{人名,年齢}を構成している構造体で保持してもいいです。

で、暫定一位だの場所だののような記録は変数とかでやればいいですね。{人名,年齢}で一つのデータと見なすのは構造体で出来そうですね。この構造体の配列を使えば名簿リスト的なものにできますね。

1人目からN人目(最後尾)までを見るにはfor文でできそうですね。最高齢か……みたいなのはif文で「暫定一位の年齢」と比較すれば出来そう。暫定一位の更新もif文の処理のやつで出来そう。

で、暫定一位についてですが、最初は強制的に1人目を暫定一位と認定していますが、暫定一位の初期値を0とか-1とかみたいにあり得ないほど小さい値にしておけばできるはずです。

最高齢を計算した後に人名とかを出力するときには、構造体の配列を persons[pos].name とかみたいにアクセスすればよさそうですね。

後は実装するだけです。

投稿2021/11/18 05:05

編集2021/11/18 05:42
BeatStar

総合スコア4962

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

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

0

C

1 Students data[10]; 2 int i; 3 int max; 4 int max_inx; // 追加 5 ... 6 max=0; max_inx = 0; 7 for ( i = 0; i < 10; ++i ) { 8 if ( max < data[i].age) { 9 max = data[i].age; 10 max_inx = i; 11 } 12 } 13 // ここに到達したとき、data[max_inx] が最高値を持つ。

投稿2021/11/17 17:57

episteme

総合スコア16612

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

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

papapa

2021/11/18 00:37

最高年齢の人を表示するprintfの時にエラーがでます。 printf("最高年齢の生徒:%s,年齢:%d", data[age_max].name, data[age_max].age); としているのですが、どう変えればいいですかね?
episteme

2021/11/18 00:45 編集

どんなコードでどんなエラー? コンパイル時? それとも実行時?
fana

2021/11/18 01:17

最高年齢の人が複数人いたときにどうの…とか言ってみるテスト. (それで問題が複雑になるわけでもないが)
episteme

2021/11/18 02:02

↑そんときゃ一旦最大値求めたのち、loopくるくる回して最大値と等しい要素を列挙するだけやしね。
papapa

2021/11/18 02:43

main1.c: In function 'ShowStudents': main1.c:37:44: error: 'age_max' undeclared (first use in this function) printf("%s,%d", data[age_max].name, data[age_max].age); ^~~~~~~ main1.c:37:44: note: each undeclared identifier is reported only once for each function it appears in とでてます
papapa

2021/11/18 02:44

コンパイル時です
WoodenHamlet

2021/11/18 02:52

その英語を訳してみるとどんな文になりますか?
papapa

2021/11/18 03:04

このファンクションは最初に使われている、と書いてあると思うのですが、それを持ってくるんじゃないんですか?
episteme

2021/11/18 03:24

> このファンクションは最初に使われている、と書いてあると思うのですが 違うね。 「main.c(の37行目で最初)に現れるage_maxは宣言されていない」と云うてます。 age_maxを宣言/定義しましたか? コード見せて。
papapa

2021/11/18 03:28

#include <stdio.h> #include <string.h> typedef struct { char name[256]; int age; } Students; void InputStudents(Students *data); void ShowStudents(Students data); int main(void) { Students data[10]; int i; int max; int age_max; max = 0; age_max = 0; for(i=0;i<10;i++){InputStudents(&data[i]);} ShowStudents(data[i]); if (max <= data[i].age) { max = data[i].age; age_max = i; } return 0;} void InputStudents(Students *data) { printf("氏名(空白なしで入力):"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("\n");} void ShowStudents(Students data) { printf("最高年齢の生徒:%s,年齢:%d", data[age_max].name, data[age_max].age); }
papapa

2021/11/18 03:29

上記のようにかいてます。tabいれててもコピーすると消えるんですね
episteme

2021/11/18 03:45

> void ShowStudents(Students data) > { > printf("最高年齢の生徒:%s,年齢:%d", data[age_max].name, data[age_max].age); > } 関数ShowStudents内にはage_maxが宣言/定義されていません。エラーになるのはアタリマエ。
papapa

2021/11/18 03:48

int age_max;をいれればいいですか?
episteme

2021/11/18 03:50 編集

わざわざ訊くまでもない、やってみたらいいじゃん。 age_max を"最大値を持つ要素の番号"にできるならね。
papapa

2021/11/18 04:06

同じ{}のなかに無いとだめなのかなと思って、 int i; int max; int age_max; max = 0; age_max = 0; for (i = 0; i < 10; i++) { if (max <= data[i].age) { max = data[i].age; age_max = i; } } を void ShowStudents(Students data)のなかにいれたんですけど、ヒントくださいヒントください
episteme

2021/11/18 06:02

> ヒントくださいヒントください ヒントならこの回答で示しています。
guest

0

C

1#include <stdio.h> 2 3typedef struct{ 4 int age; 5 char name[252]; 6} Student; 7 8void InputStudent(Student*); 9void ShowStudent(const Student*); 10 11int main(void){ 12 Student oldest = {-1}, newface; 13 int i; 14 for(i=0; i<10; i++){ 15 InputStudent(&newface); 16 if(oldest.age <= newface.age){ 17 oldest = newface; 18 } 19 } 20 ShowStudent(&oldest); 21 return 0; 22} 23 24void InputStudent(Student *data){ 25 printf("氏名(空白なしで入力):"); 26 scanf("%251s", data->name); 27 printf("年齢:"); 28 scanf("%d", &data->age); 29 printf("\n"); 30} 31 32void ShowStudent(const Student* data){ 33 printf("最高年齢の生徒:%s,年齢:%d", data->name, data->age); 34} 35

多分これが一番短いと思います(当社比)。

投稿2021/11/18 07:27

majiponi

総合スコア1722

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

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

fana

2021/11/18 08:14

> 大きさ10の構造体配列を定義。その配列に対して、10人分の氏名と年齢を入力し… という話なので,とりあえず配列を用意してそこに入力することは must なのではないでしょうか.
majiponi

2021/11/18 12:50

せやかて、ウチにも「できるだけ配列は使わない」っちゅーこだわりがあるんやで? 入力に対応する出力はするから、ヨシ!! まあ、そういうことです。質問者さんがコードじゃなくて根性直したらひねくれてない回答にしますね。
guest

0

「最年長は誰か?」ということを考えるのが難しいのであれば,
たかだか 10人 のデータを相手にする話なのですから,

  • 1人目は最年長か? → 最年長なら表示する
  • 2人目は最年長か? → 最年長なら表示する
  • ...
  • 10人目は最年長か? → 最年長なら表示する

とかでも,まぁ良いんじゃないでしょうか.
そしたら,シンプルな話になりますよね.
最年長が複数人いたとしても全く問題ない手続きになりますし.

C

1//data[ith]が最年長かどうか.最年長なら1を,そうでないなら0を返す. 2int IsOldest( Students data[10], int ith ) //※引数の[10]は雰囲気 3{ 4 for( int iCmp=0; iCmp<10; ++iCmp ) 5 { 6 if( data[iCmp].age > data[ith].age )return 0; 7 } 8 return 1; 9} 10 11int main(void) 12{ 13 //※入力部は省略 14 Students data[10] = { 15 {"A",5}, {"B",0}, {"C",8}, {"D",6}, {"E",6}, 16 {"F",8}, {"G",4}, {"H",7}, {"I",5}, {"J",8} 17 }; 18 19 //10人について1人ずつ「こいつを表示すべきか否か?」の判定を行う 20 for( int i=0; i<10; ++i ) 21 { 22 //こいつが最年長なら表示する 23 if( IsOldest( data, i ) == 1 ) 24 { printf( "%s, %d\n", data[i].name, data[i].age ); } 25 } 26 27 return 0; 28}

投稿2021/11/18 05:41

fana

総合スコア11996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問