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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

2回答

3036閲覧

追加機能の実装(C言語)

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2015/11/12 17:28

課題1で作成したプログラムに学生の追加機能を実装してください。
引数にMeiboの配列を指定することができる関数addを定義し、ユーザが入力した情報を学生の一覧に追加する機能を実装してください。
呼び出し:add(students)
定義: void add(Meibo students[])
学生数は最大100名まで追加できるようにしておくこと。

という課題がありましたが、エラーが何回も出て実行できません。どうすれば実行できますか?ちなみに成功すれば画像のように実行します。

C

1// 2// 名簿プログラム 3// アルゴリズム応用 第6回課題 4// 5 6#include <stdio.h> 7 8/* 学生の構造体 */ 9 10 11typedef struct Meibo { 12 int number; 13 char name[10]; 14 int credits; 15} Meibo; 16 17/* 追加する */ 18void add(Meibo students[]){ 19 int i; 20 add(students); 21 22 printf("------------------------------------------\n"); 23 for (i = 0; i < 4; i++) { 24 printf("%s\t",students[i].name); 25 printf("%d\n",students[i].credits); 26 printf("------------------------------------------\n"); 27 } 28} 29 30int main(void) 31{ 32 33 // 4名分の学生の情報を登録 34 Meibo students[]={ 35 { 1, "John", 30 }, 36 { 2, "Paul" ,28 }, 37 { 3, "George", 20 }, 38 { 4, "Ringo", 40 } 39 }; 40 41 //メニューの表示と実行 42 char cmd; 43 printf("a:追加 d:一覧表示 q:終了\n"); 44 while((cmd = getchar()) != 'q'){ 45 switch(cmd){ 46 case 'a': 47 //追加(課題2) 48 students = input(); 49 if ( students.name[0] != '\0' ){ 50 if ( add(students)) 51 printf("\n\n登録しました\n"); 52 else 53 printf("\n\nすでに登録されています\n"); 54 } 55 else 56 printf("\n\n入力を中止しました\n"); 57 break; 58 case 'd': 59 add(students); 60 break; 61 case '\n':case ' ': 62 break; 63 default: 64 printf("不正なコマンドです。\n"); 65 break; 66 } 67 } 68 69 printf("名簿プログラムを終了します。\n"); 70 return 0; 71}

イメージ説明

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

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

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

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

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

guest

回答2

0

まず,どのようなエラーが出るのかを書きましょう.エラーを明記することで,何に対して悩んでいるのか明確になり,適切な回答が得られやすいです.
そして私たちは,課題1について知らないので,課題1についても書きましょう.

あなたのコードの問題点
0. add関数の中身が適切でない(再帰呼び出しを行っている,目的の動作をしていない)
0. 最大100名の追加ができない(配列の大きさが4である)
0. input関数がない
0. add関数をifの判定式に用いている
0. 配列の添え字がおかしい場所がある

あなたのコードの改善案
0. add関数の中身を適切に変更する(配列studentsに要素を書き込む)
0. 最初に大きさ100の配列を確保する
0. input関数を適切に追加する
0. add関数をifの判定式に入れない(add関数の返り値を付けるのも一案ですが,問題に反しますね)
0. 配列の添え字を適切に修正する

C

1/* Meibo型の配列を引数に取る関数 */ 2/* 学校の問題なので言っても仕方ないですが */ 3/* C言語では一般に,配列を渡すときに配列の大きさも渡します */ 4/* 受け取る関数内では配列ではなく,ポインタとして受け取るため*/ 5/* sizeofを利用しても配列の大きさを知ることができません */ 6/* void add(Meibo students[], int number) の方が良いコードです*/ 7void add(Meibo students[]){ 8 /* for文用 */ 9 int i; 10 /* この関数は自分自身を呼び出しています */ 11 /* 自分自身を呼び出すことを"再帰呼び出し"と言いますが */ 12 /* これによってメモリが足りなくなり落ちていると思われます */ 13 // add(students); 14 /* 適切な配列操作を自分で定義する問題だと思われるので,それを書きましょう. */ 15 16 /* 配列中の0-3人目を表示 */ 17 /* 配列中の要素に応じて,繰り返し回数を変更した方が適切でしょう */ 18 printf("------------------------------------------\n"); 19 for (i = 0; i < 4; i++) { 20 printf("%s\t",students[i].name); 21 printf("%d\n",students[i].credits); 22 printf("------------------------------------------\n"); 23 } 24} 25 26int main(void) 27{ 28 /* 配列の大きさが4で初期化されます */ 29 /* 問題で最大100と言われているということは */ 30 /* 大きさ100の配列を用意すべきなのでしょう */ 31 /* (配列以外にmemory allocationを利用する方法もありますが */ 32 /* そのレベルの課題ではないでしょう) */ 33 Meibo students[]={ 34 { 1, "John", 30 }, 35 { 2, "Paul" ,28 }, 36 { 3, "George", 20 }, 37 { 4, "Ringo", 40 } 38 }; 39 40 char cmd; 41 printf("a:追加 d:一覧表示 q:終了\n"); 42 while((cmd = getchar()) != 'q'){ 43 switch(cmd){ 44 case 'a': 45 //追加(課題2) 46 /* input関数が見当たりません */ 47 /* そしてinput関数の返り値をstudentsに代入するのはどうなのでしょう */ 48 /* input関数の返り値次第ですが,きっとMeibo student; を定義しておいて */ 49 /* student = input(); の形になるでしょう */ 50 // students = input(); 51 /* scanf("%d %s %d", &student.number, student.name, student.credits); など */ 52 53 /* 添え字がおかしいです */ 54 // if ( students.name[0] != '\0' ){ 55 if ( students[0].name != '\0' ){ 56 /* あなたの定義した(問題で定義されている)add関数は */ 57 /* 返り値がありません(void)でしたね */ 58 /* ifの判別式として使うことはできません */ 59 if ( add(students)) 60 printf("\n\n登録しました\n"); 61 else 62 printf("\n\nすでに登録されています\n"); 63 } 64 else 65 printf("\n\n入力を中止しました\n"); 66 break; 67 case 'd': 68 /* 一覧表示のはずですが,add関数を呼び出しています */ 69 /* 一覧表示は前の課題で適切なものを作ったのでは? */ 70 // add(students); 71 /* show(students, number); などの関数を作って呼び出しましょう */ 72 break; 73 case '\n': 74 case ' ': 75 break; 76 default: 77 printf("不正なコマンドです。\n"); 78 break; 79 } 80 } 81 82 printf("名簿プログラムを終了します。\n"); 83 return 0; 84}

投稿2015/11/12 18:15

編集2015/11/12 22:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

授業では、メモリー管理についてはどこまで説明を受けていますか?
生徒情報の管理方法の方針を決める必要があります。

  1. 特にまだ説明はない。
    ==> 100 のサイズの配列を用意する。
    配列中へのデータ追加、削除の機能をつくる。

  2. malloc() の説明があった。

==> 配列のサイズは、生徒の数分になるようにする。
生徒の追加、削除に応じて、配列サイズは適宜変化させる。

  1. リンクリストの説明があった。
    ==> リンクリストで生徒を管理する。

  2. 授業内調とは関係なく良い物を作りたい
    ==> データベースをつかって生徒情報を管理する,
    リンクリスト、ハッシュマップなどの為のライブラリーを使って生徒情報を管理する,
    Excel や google doc と連携して、生徒情報を管理する,
    等々 様々な選択肢があります。

後、ぜひ、テストプログラムも書くと良いとおもいます。
作成したプログラムが動作するkどうかを、コードの変更の度に手作業で確認していは、大変です。
(bat ファイルや、shellscript での自動実行スクリプトを用意するだけでも最初は十分です。
生徒数が0,100 の状態にできることや、そのときに追加、削除をした時に正しく動作することなどの
確認は欠かません)

投稿2015/11/12 22:20

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問