c言語 住所プログラムについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tasukete

c言語 住所プログラムについて

#1

投稿記事 by tasukete » 2年前

めっちゃ長いです。
教えてくれる方いませんでしょうか?
よろしくお願いします。

以下の問題を解決するプログラムを作成せよ。
以下のようなメニューを持ったメインプログラムを考える。
MENU
1: 住所録読込
2: 住所録上書
3: ソート
4: 追加
5: 削除
6: 結果書込(result ファイルへ書込)
0: 終了
メニューの番号入力をキーボードから行うようにする。入力を促す為に
番号入力 >
等を画面に表示させると良い。
キーボードからの 1 ∼ 6 又は 0 の入力に従い、それぞれ以下の動作をする。それぞれの動作部分は、それ
ぞれ関数にする。
1 が入力されたら、ファイル address からデータを読み込み、構造体
typedef struct address {
int number ;
char name [30];
char name_furikana [60];
char zip_code [10];
char address [100];
char address_furikana [200];
} ADDRESS ;
の配列に格納して行く。配列の大きさは 200 程度で良い。
ファイル address は、各行に上記構造体に対応する数字もしくは文字列があり、全部で 100 件格納されて
いる。
2 が入力されたら、現在の配列の内容をファイル address に上書きする。但し、ソート、追加、削除のど
の操作も行われていない場合は配列の内容に変化はないので上書きしないようにする。なお、ファイルへ
の書き込みは 6 と共通に出来るので、ファイルのオープンとクローズのみを行い、実際のファイル書き込み
は 6 と共通に使用する関数を呼び出すようにすること。
1
3 が入力されたら、現在の配列の内容をソートする。ソートは、
ソートするキーを入力:
1: 名前
2: 名前のフリカナ
3: 郵便番号
4: 住所
5: 住所のフリカナ
の様に、どの項目でソートするかを選択させるできるようにする。入力を促す為に
番号入力 >
等を画面に表示させると良い。
その後は、選択された項目に従いソーティングを行う。
(ソートのアルゴリズムは何を用いても良い。)
ソート後は、number が順番通りになっていないので、順番を付け直す。順番を付け直す関数(これは 5
でも使用する)を別途作成し、呼び出すようにすること。
4 が入力されたら、現在の配列の最後に、新たな住所録を追加する。
追加する内容は、キーボードから入力する。
(勿論、number については自動採番とする。なお、scanf 関数は空白を含む文字列が入力できないので、
空白を含まないようにすること。)
5 が入力されたら、削除したい number をキーボードから入力出来るようにして、指定された番号の配列
を削除する。
(実際には、その番号以降の配列を一つずつ前にずらす。)
削除後は、number が順番通りになっていないので、順番を付け直す。順番を付け直す関数(これは 3 で
も使用する)を別途作成し、呼び出すようにすること。
6 が入力されたら、現在の配列の内容をファイル result に書き込む。なお、ファイルへの書き込みは 2 と
共通に出来るので、ファイルのオープンとクローズのみを行い、実際のファイル書き込みは 2 と共通に使用
する関数を呼び出すようにすること。
このメニューは無限ループとするが、0 が入力されたら、この無限ループから break し、プログラムを終
了する。
ソースファイルの構成は、以下のようにする。プロトタイプ宣言を含むヘッダーファイルの例を示す。
address.h
typedef struct address {
int number ;
char name [30];
char name_furikana [60];
char zip_code [10];
char address [100];
char address_furikana [200];
} ADDRESS ;
2
extern int readAddress ( ADDRESS address []); /* 住 所 録 読 込 */
extern void writeAddress ( int count , ADDRESS address []); /* 住 所 録 上 書 */
extern void sort ( int count , ADDRESS address []); /* ソ ー ト */
extern int add ( int count , ADDRESS address []); /* 追 加 */
extern int delete ( int count , ADDRESS address []); /* 削 除 */
extern void writeResult ( int count , ADDRESS address []); /* 結 果 書 込 */
extern void write ( FILE * out , int count , ADDRESS address []);
/* 書 込 共 通 関 数 ( writeAddress , w r i t e R e s u l t の 両 方 で 使 用 す る ) */
extern void renumbering ( int count , ADDRESS address []);
/* n u m b e r付替関数(s o r t , d e l e t e の 両 方 で 使 用 す る ) */
提出物は、
ˆ ソースプログラム
ˆ ヘッダーファイル
のみで良い。(関数仕様書は提出しなくて良い。)
ヒント:
main 関数のプログラム例
# define _CRT_SECURE_NO_WARNINGS
# define MAX 200
# include < stdio .h >
# include < string .h >
# include " address . h "
int main ( void ) {
ADDRESS address [ MAX ]; /* 住 所 録 デ ー タ */
int count = 0; /* 住 所 録 の 個 数 */
int flag = 0; /* 0: ソ ー ト 、 追 加 、 削 除 未 実 施 , 1: 実 施 済 */
int command = 0;
char string_command [10] = " y ";
while ( 1 ) {
printf (" MENU \ n ");
printf ("1: 住 所 録 読 込\ n ");
printf ("2: 住 所 録 上 書\ n ");
printf ("3: ソ ー ト\ n ");
printf ("4: 追 加\ n ");
printf ("5: 削 除\ n ");
printf ("6: 結 果 書 込 ( r e s u l t フ ァ イ ル へ 書 込 ) \ n ");
printf ("0: 終 了\ n ");
printf (" 番 号 入 力 > ");
scanf ("% d " , & command );
if ( command == 1 ) {
3
count = readAddress ( address );
flag = 0;
} else if ( command == 2 ) {
if ( flag == 0 ) {
printf (" ソ ー ト 、 追 加 、 削 除 未 実 施 で す 。 上 書 は 行 い ま せ ん 。\ n ");
} else { /* flag == 1 */
printf (" 住 所 録 を 上 書 き し ま す 。 宜 し い で す か ? (y / n )");
scanf ("% s " , string_command );
if ( strcmp ( string_command , " y ") == 0 ) {
writeAddress ( count , address );
flag = 0;
}
}
} else if ( command == 3 ) {
sort ( count , address );
flag = 1;
} else if ( command == 4 ) {
if ( count >= MAX ) {
printf (" 住 所 録 の 上 限 で す 。 こ れ 以 上 追 加 で き ま せ ん 。\ n ");
} else {
count = add ( count , address );
flag = 1;
}
} else if ( command == 5 ) {
count = delete ( count , address );
flag = 1;
} else if ( command == 6 ) {
writeResult ( count , address );
} else {
break ; /* 無 限 ル ー プ か ら 脱 出 */
}
}
return 0;
}
sort 関数のプログラム例
# define _CRT_SECURE_NO_WARNINGS
# include < stdio .h >
# include < string .h >
# include " address . h "
void sort ( int count , ADDRESS address []) {
int command ;
ADDRESS temporary ;
int i , j ;
4
printf (" ソ ー ト す る キ ー を 入 力 :\ n ");
printf ("1: 名 前\ n ");
printf ("2: 名 前 の フ リ カ ナ\ n ");
printf ("3: 郵 便 番 号\ n ");
printf ("4: 住 所\ n ");
printf ("5: 住 所 の フ リ カ ナ\ n ");
printf (" 番 号 入 力 > ");
scanf ("% d " , & command );
if ( command == 1 ) {
for ( i = 0; i < count -1; i ++ ) {
for ( j = count -2; j >= i ; j - - ) {
if ( strcmp ( address [ j ]. name , address [ j +1]. name ) > 0 ) {
temporary = address [ j ];
address [ j ] = address [ j +1];
address [ j +1] = temporary ;
}
}
}
renumbering ( count , address );
} else if ( command == 2 ) {
for ( i = 0; i < count -1; i ++ ) {
for ( j = count -2; j >= i ; j - - ) {
if ( strcmp ( address [ j ]. name_furikana ,
address [ j +1]. name_furikana ) > 0 ) {
temporary = address [ j ];
address [ j ] = address [ j +1];
address [ j +1] = temporary ;
}
}
}
renumbering ( count , address );
} else if ( command == 3 ) {
for ( i = 0; i < count -1; i ++ ) {
for ( j = count -2; j >= i ; j - - ) {
if ( strcmp ( address [ j ]. zip_code , address [ j +1]. zip_code ) > 0 ) {
temporary = address [ j ];
address [ j ] = address [ j +1];
address [ j +1] = temporary ;
}
}
}
renumbering ( count , address );
} else if ( command == 4 ) {
for ( i = 0; i < count -1; i ++ ) {
for ( j = count -2; j >= i ; j - - ) {
if ( strcmp ( address [ j ]. address , address [ j +1]. address ) > 0 ) {
temporary = address [ j ];
address [ j ] = address [ j +1];
address [ j +1] = temporary ;
5
}
}
}
renumbering ( count , address );
} else if ( command == 5 ) {
for ( i = 0; i < count -1; i ++ ) {
for ( j = count -2; j >= i ; j - - ) {
if ( strcmp ( address [ j ]. address_furikana ,
address [ j +1]. address_furikana ) > 0 ) {
temporary = address [ j ];
address [ j ] = address [ j +1];
address [ j +1] = temporary ;
}
}
}
renumbering ( count , address );
}
}
このソート関数は、バブルソートを用いている。
なお、strcmp 関数は、二つの文字列が等しいかどうかだけでなく、大小も判定してくれる。この関数は、
その仕様を用いている。
renumbering 関数のプログラム例
# define _CRT_SECURE_NO_WARNINGS
# include < stdio .h >
# include " address . h "
void renumbering ( int count , ADDRESS address []) {
int i ;
printf (" 番 号 の 付 け 替 え を 行 い ま す 。\ n ");
for ( i = 0; i < count ; i ++ ) {
address [ i ]. number = i +1;
printf ("% d \ n " , address [ i ]. number );
printf ("% s \ n " , address [ i ]. name );
printf ("% s \ n " , address [ i ]. name_furikana );
printf ("% s \ n " , address [ i ]. zip_code );
printf ("% s \ n " , address [ i ]. address );
printf ("% s \ n " , address [ i ]. address_furikana );
}
}

アバター
usao
記事: 1889
登録日時: 11年前

Re: c言語 住所プログラムについて

#2

投稿記事 by usao » 2年前

「宿題は自分でやってください」というテンプレな返しが欲しいのでないならば,
実際にあなたが取り組んでいて遭遇した解決すべき事柄に関する「質問」をしてください.

「何一つ自分自身ではやりたくないから,俺の代わりにこの問題に取り組んでコピペで提出できる物をよこせ」
という話なのであれば,何はともあれその旨を明記するべきでしょう.
(やってくれる人がいるかどうか?ってのはまた別問題ですが,話を明確にすることは必要でしょう.)

アバター
usao
記事: 1889
登録日時: 11年前

Re: c言語 住所プログラムについて

#3

投稿記事 by usao » 2年前

で,ご自身で取り組む気がある場合……

そこまでクソ細かく(あなたが考える余地がほとんどないほどに)物事が指定されているのですから,上から順にやっていけば良いだけの話かと見えます.
全部一気にやるんじゃなくて,1機能ずつ追加しては確認するという形でやっていけばよいでしょう.

返信

“C言語何でも質問掲示板” へ戻る