「まず覚えるCの文法」 (校正中) Ex5-1: 解答例 //------------------------------------- member *addr(int i){ member *p=&igo; int k; for(k=0; k<10; k++){ if(p[k].id==i || p[k].id==0){break;} } if(k<10){return p+k;} else{return NULL;} } void show(int i){ member *p=addr(i); if(p->id==i){ printf("%d, %s, %s\n", p->id, p->name, p->mail); }else{printf("?\n");} } void add(int i, char *n, char *m){ member *p=addr(i); if(p!=NULL && p->id==0){ p->id=i; strcpy(p->name, n); strcpy(p->mail, m); }else{printf("-\n");} } void del(int i){ member *p=addr(i), *q; if(p!=NULL && p->id==i){ q=addr(0); q--; if(q!=p && q->id!=0){ p->id=q->id; strcpy(p->name, q->name); strcpy(p->mail, q->mail); }else{q=p;} q->id=0; q->name[0]=q->mail[0]='\0'; }else{printf("?\n");} } //------------------------------------- Ex5-2: 解答例 //------------------------------------- member *addr(group *g, int i){ member *p=g->top; int k; for(k=0; k<g->max; k++){ if(p[k].id==i || p[k].id==0){break;} } if(k<g->max){return p+k;} else{return NULL;} } //------------------------------------- |
問5-1. P53A のプログラムに次の void 型関数を追加せよ. (1) 引数 i の値に等しい id のメンバの id, name, mail を表示する関数 show(int i). a) 存在しない id のときは "?\n" を表示する. (2) 引数 i, *n, *m の値を id, name, mail とする新しい メンバを追加する関数 add(int i, char *n, char *m). a) i は正の整数とする.(id==0 の行は空) b) id が 0 でない行は連続しているとする. c) id が既存のとき,登録メンバ数が 10 のときは "-\n" を表示する. (3) 引数 i の値に等しい id のメンバの行を削除する関数 del(int i). a) 削除した行には id>0 である末尾のデータを移動する. b) 存在しない id のときは "?\n" を表示する. ・文字列のコピーにシステム関数の strcpy() を使いました. void strcpy(char *to, char *from){ while(*to++=*from++); } ・各関数には引数 i に等しい id のメンバが登録されている か否かを調べ,登録されていれば igo[k]==i である k の 値あるいは igo[k] のアドレスを求めるという共通の処理 があります.Ex5-1 の解答例では関数 addr() でこの処理 を行っています. ・main() を int main(void){ member *p=igo; add(5, "Tanaka", "foo@zzz.ac.jp"); del(2); while(p->id!=0){show(p->id); p++;} return 0; } に変更して実行すると, 1, Aoki, aoki@xxx.ne.jp 5, Tanaka, foo@zzz.ac.jp と表示されることを確認してください. 問5-2. Ex5-1 の関数を igo[10] 以外の member 型変数の配列 にも使えるように,構造体 group を typedef struct{ member *top; int max; } group; で定義し,「group g_igo={&igo, 10};」で宣言された g_igo に 対して show(&g_igo, i) add(&g_igo, i, *n, *m) del(&g_igo, i) を Ex5-1 の show(i), add(i, *n, *m), del(i) の代わりに使う ように変更したい.このための addr() の変更案を示せ. ・show(), add(), del() は addr() の呼び出し部分以外は変わり ません. |
最新の画像[もっと見る]
- g++による演習 (5) 11年前
- g++による演習(4) 11年前
- g++による演習 (3) 11年前
- g++による演習 (2) 11年前
- g++による演習 (1) 11年前
- 構造化チャート 11年前
- gccによる演習 (7) 11年前
- 離散コサイン変換 (5) 11年前
- L8プログラミング (0) 11年前
- 離散コサイン変換 (4) 11年前
※コメント投稿者のブログIDはブログ作成者のみに通知されます