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

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

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

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

Q&A

4回答

3324閲覧

(C言語)この課題がわかりません

JAVA

総合スコア11

C

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

0グッド

0クリップ

投稿2014/12/18 07:18

(C言語)この課題がわかりません

以下の問題に手こずっています。回答宜しくお願いします。
実行結果を以下のように表示させたいのですが、できません。
私は、ソースコードを以下のように組み立ててみました。修正コードとなぜそうなるのか解説を詳しく記入していただけると理解できると思います。
地区コード| 地区名 | 人口(人) | 面積(km2)|人口密度|
1 | 東北地方 | ××× | ××× |××× |

lang

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4//都道府県構造体 5typedef struct { 6 char kcode[3]; //都道府県コード 7 char lcode; //地区コード 8 char kname[9]; //都道府県名 9 int jinko; //人口(人) 10 double area; //面積(km2) 11} TDFK; 12//地方構造体 13typedef struct { 14 char lcode; //地区コード 15 char lname[9]; //地区名 16 double ljinko; //人口(人) 17 double larea; //面積(km2) 18} CHIKU; 19/*** 関数 ***/ 20void readKen(TDFK ken[]); 21int printMenu(void); 22void sortKen(TDFK ken[]);//面積の広い順 23void printKen(TDFK ken[]); 24void printChiku(TDFK ken[]); 25void sortArea(TDFK ken[]); 26int printMenu(void); 27void readKen(TDFK); 28 29int main(void){ 30 TDFK ken[47]; //47都道府県データ 31 CHIKU chi[7]; //7地区のデータ 32 int i, j; 33 int chiku //入力する地区コード 34 char selno; //処理番号 35 readKen(ken); 36 do{ 37 selno = printMenu(); 38 switch(selno){ 39 case 1: 40 readKen(ken);//再読み込み 41 break; 42 case 2: 43 sortKen(ken); 44 break; 45 case 7: 46 printMitudo 47 break; 48 case 7: 49 printChiku(ken); 50 break; 51 case 10: 52 printKen(ken); 53 break; 54 } 55 }while(selno != 99); 56 57 return 0; 58} 59void 60void printChiku(TDFK ken[]){ 61 //地区コードを入力し、その地域の都道府県を表示する。 62 CHIKU ch[7] = { 63 { '1', "東北地方"}, 64 { '2', "関東地方"}, 65 { '3', "中部地方"}, 66 { '4', "近畿地方"}, 67 { '5', "四国地方"}, 68 { '6', "中国地方"}, 69 { '7', "九州地方"}}; 70 int i; 71 int chiku; //入力する地区コード 72 char wklcode; 73 74 //地区コードを入力し、地方名を表示する 75 printf("*** 地区コードと地方名 ***\n\n"); 76 for(i = 0; i < 7; i++){ 77 printf("%c:%8s\n", 78 ch[i].lcode, ch[i].lname); 79 } 80 //地区コードの入力 81 do{ 82 printf("地区コード-> "); 83 scanf("%d", &chiku); 84 }while(chiku < 1 || chiku > 7); 85 wklcode = chiku + '0'; 86 87 printf("%sの都道府県\n", ch[chiku - 1].lname); 88 for(i = 0; i < 47; i++){ 89 if(ken[i].lcode == wklcode){ 90 printf("%s %c %-10s\n", 91 ken[i].kcode, ken[i].lcode,ken[i].kname); 92 } 93 } 94 95} 96 97void printKen(TDFK ken[]){ 98 int i; 99 100 //都道府県データ表示 101 for(i = 0; i < 47; i++){ 102 printf("%s %c %-10s %8d %06.2f\n", 103 ken[i].kcode, ken[i].lcode,ken[i].kname, 104 ken[i].jinko, ken[i].area); 105 } 106 107 108} 109void sortKen(TDFK ken[]){ 110 int i,j; 111 TDFK wkken; 112 113 //都道府県コードの昇順に並び替える 114 //基本選択法 115 for(i = 0;i < 46; i++){ 116 for(j = i + 1; j < 47; j++){ 117 if(strcmp(ken[i].kcode , ken[j].kcode) > 0){ 118 wkken = ken[i]; 119 ken[i] = ken[j]; 120 ken[j] = wkken; 121 } 122 } 123 } 124 125 126} 127void printChiku(TDFK ken[]){ 128 int i,j; 129 TDFK wkken 130 131} 132//都道府県ファイルの入力 133void readKen(TDFK ken[]){ 134 FILE *fin; //入力ファイルポインタ 135 int i; 136 137 //入力ファイルのオープン 138 fin = fopen("都道府県別人口と面積.txt", "r"); 139 if(fin == NULL){ 140 printf("File Open Error\n"); 141 exit(0); 142 } 143 i = 0; 144 while(fscanf(fin, "%s %c %s %d %lf", 145 ken[i].kcode, &ken[i].lcode,ken[i].kname, 146 &ken[i].jinko, &ken[i].area) != EOF){ 147 i++; 148 } 149 //ファイルのクローズ 150 fclose(fin); 151 152} 153//メニュー表示 154int printMenu(void){ 155 int num; 156 157 printf("*---------- 都道府県データ統計メニュー ----------*\n"); 158 printf("* *\n"); 159 printf("* 1: ファイルの再読込み *\n"); 160 printf("* 2: ソート(都道府県コードの昇順) *\n"); 161 printf("* 3: ソート(人口の多い順) *\n"); 162 printf("* 4: ソート(面積の広い順) *\n"); 163 printf("* 5: 都道府県別人口密度 *\n"); 164 printf("* 6: 地域別人口密度 *\n"); 165 printf("* 7: 地域別の都道府県データ表示 *\n"); 166 printf("* 8: *\n"); 167 printf("* 9: *\n"); 168 printf("* 10: 47都道府県データ表示 *\n"); 169 printf("* *\n"); 170 printf("* 99: 終了 *\n"); 171 printf("*------------------------------------------------*\n"); 172 printf("処理番号を選択して下さい\n"); 173 printf("番号入力 --> "); 174 scanf("%d", &num); 175 176 return num; 177} 178/*ヒント 179no = ken[i].lcode - '0'; 180↑数値 ↑char型 181ch[ no ].ljinko += 182 ken[i].jinko;*/ 183/*ヒント2 184地区コード| 地区名 | 人口(人) | 面積(km2)|人口密度| 185 1 | 東北地方 | ××× | ××× |××× |

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

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

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

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

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

len_souko

2016/01/10 18:42

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答4

0

まずはコンパイルが通らないようですけれど、できないというのはコンパイルができないということですか?

それと、開発環境が何か分からないと適切に回答できません。
あと、できれば入力ファイルも一部でもいいので提示してください。

投稿2014/12/18 12:37

genovese

総合スコア93

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

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

0

息抜きがてら、こういうことがやりたいのかなーと勝手に推測して読みやすく、拡張しやすく私なりに組んでみました。
returnのみの関数の中身を記述すればそのまますべてのメニュー項目を利用することができます。
メニューを増やす場合は、列挙リストの中身とMenuList文字列配列に項目を追加し、メインループ内のswitch文で対応する関数を呼び出すようにすればそのまま動くはずです。
かなり長いので、不要であればその旨コメントしていただければ削除しますね。
何かの役に立てば幸いです。
また、このコードを見ておかしいなと思ったりこうした方がいいよ!などアドバイスある方いらっしゃればコメントくださると幸いです。

【追記】あまりにも見づらかったので運営さんに削除要請出しました。ご迷惑をおかけしました。

投稿2015/01/06 13:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/01/06 13:22

■Structures.h ```lang-<c> #ifndef _STRUCTURES_INCLUDED_ #define _STRUCTURES_INCLUDED_ //■地方構造体 struct Region { //■地区コード int m_RegionCode; //■地区名 char m_RegionName[ 9 ]; //■人口数 int m_NumPeople; //■面積(km^2) double m_RegionSize; }; //■都道府県構造体 struct Prefecture { //■所属している地方コード int m_BelongRegionCode; //■都道府県コード int m_PrefectureCode; //■都道府県名 char m_PrefectureName[ 9 ]; //■人口数 int m_NumPeople; //■面積(km^2) double m_PrefectureSize; }; #endif ```
退会済みユーザー

退会済みユーザー

2015/01/06 13:23

コメントだとコード化できないみたいですね・・・ ■Config.h #ifndef _CONFIG_INCLUDED_ #define _CONFIG_INCLUDED_ //■各都道府県データが記述されているファイルのアドレス #define ADDRESS_FILE ( "都道府県別人口と面積.txt" ) //■地方の数 #define NUM_REGIONS ( 7 ) //■都道府県の数 #define NUM_PREFECTURES ( 3 ) //■メニューの項目(プログラム用) enum { //■ファイルを読み込みなおす MENU_RELOAD_FILE = 1, //■ソート(都道府県コードの昇順) MENU_SORT_BY_PREFECTURECODE, //■ソート(人口の多い順) MENU_SORT_BY_NUM_PEOPLE, //■ソート(面積の広い順) MENU_SORT_BY_SIZE, //■都道府県別人口密度 MENU_PRINT_DENSITY_POPULATION_EACH_PREFECTURES, //■地方別人口密度表示 MENU_PRINT_DENSITY_POPULATION_EACH_REGIONS, //■地方別の都道府県データの表示 MENU_PRINT_PREFECTURES_EACH_REGIONS, //■47都道府県データの表示 MENU_PRINT_ALL_PREFECTURES, //■プログラムを終了する MENU_QUIT_PROGRAM, //■メニューの項目の数(+1した値) NUM_MENUES_PLUSONE, }; //■メニューの項目(表示用) static char MenuList[][ 46 ] = { "ファイルの再読込み *\n", "ソート(都道府県コードの昇順) *\n", "ソート(人口の多い順) *\n", "ソート(面積の広い順) *\n", "都道府県別人口密度表示 *\n", "地方別人口密度表示 *\n", "地方別の都道府県データ表示 *\n", "47都道府県データ表示 *\n", "プログラムを終了する *\n", };
退会済みユーザー

退会済みユーザー

2015/01/06 13:28

■Main.cpp #include <stdio.h> #include <stdlib.h> #include "Config.h" //<-- プログラムのコンフィグを記述したヘッダ #include "Structures.h" //<-- 地方構造体と都道府県構造体について記述したヘッダ //■関数プロトタイプ bool CreatePrefecturesDataFromFile( char* const argFileName, Prefecture* argArrayPrefectures ); void PrintMenu( ); int SelectCommand( int argMinCommand, int argMaxCommand ); void SortByPrefectureCode( Prefecture* argArrayPrefecture ); void SortByNumPeople( Prefecture* argArrayPrefecture ); void SortBySize( Prefecture* argArrayPrefecture ); void PrintDensityPopulationEachPrefectures( Prefecture* argArrayPrefecture ); void PrintDensityPopulationEachRegions( Region* argArrayRegions ); void PrintPrefecturesEachRegions( Prefecture* argArrayPrefecture ); void PrintAllPrefectures( Prefecture* argArrayPrefecture ); //============================================== // ■エントリーポイント■ int main( ) { //====================================== //■初期化処理 bool result; //▼地方構造体の配列 Region ArrayRegions[ NUM_REGIONS ]; //▼都道府県構造体の配列 Prefecture ArrayPrefectures[ NUM_PREFECTURES ]; //▼都道府県データを構築する result = CreatePrefecturesDataFromFile( ADDRESS_FILE, ArrayPrefectures ); if( !result ) exit( 0 ); //====================================== //■メインループ int selected; do{ //■メニュー項目の表示 PrintMenu( ); //■ユーザー入力待ち selected = SelectCommand( MENU_RELOAD_FILE, NUM_MENUES_PLUSONE - 1 ); //■入力されたコマンドから該当する処理を実行する switch( selected ) { //■ファイルを読み込みなおす case MENU_RELOAD_FILE: CreatePrefecturesDataFromFile( ADDRESS_FILE, ArrayPrefectures ); break; //■ソート(都道府県コードの昇順) case MENU_SORT_BY_PREFECTURECODE: SortByPrefectureCode( ArrayPrefectures ); break; //■ソート(人口の多い順) case MENU_SORT_BY_NUM_PEOPLE: SortByNumPeople( ArrayPrefectures ); break; //■ソート(面積の広い順) case MENU_SORT_BY_SIZE: SortBySize( ArrayPrefectures ); break; //■都道府県別人口密度 case MENU_PRINT_DENSITY_POPULATION_EACH_PREFECTURES: PrintDensityPopulationEachPrefectures( ArrayPrefectures ); break; //■地方別人口密度表示 case MENU_PRINT_DENSITY_POPULATION_EACH_REGIONS: PrintDensityPopulationEachRegions( ArrayRegions ); break; //■地方別の都道府県データの表示 case MENU_PRINT_PREFECTURES_EACH_REGIONS: PrintPrefecturesEachRegions( ArrayPrefectures ); break; //■47都道府県データの表示 case MENU_PRINT_ALL_PREFECTURES: PrintAllPrefectures( ArrayPrefectures ); break; //■プログラムを終了する case MENU_QUIT_PROGRAM: printf( "プログラムを終了します。\n\n" ); break; //■例外処理 default: //■エラーメッセージを表示 printf( "エラー。\n" ); //■プログラムを終了させる selected = MENU_QUIT_PROGRAM; break; } } while( selected != MENU_QUIT_PROGRAM ); system( "pause" ); return 0; } //============================================== // ■ファイルから都道府県データを構築する■ //●引数 //argFileName : 読み込むファイルのアドレス //argArrayPrefectures : 都道府県データの格納先 bool CreatePrefecturesDataFromFile( char* const argFileName , Prefecture* argArrayPrefectures ) { //====================================== //■ファイルを読み込む FILE* fileHandle; fileHandle = fopen( argFileName, "r" ); //▼ファイルが正常に読み込めなかった場合 //※エラーメッセージを表示し偽を返却する if( fileHandle == NULL ) { printf( "ファイル【 %s 】を正常に開けませんでした。\n\n", argFileName ); return false; } else { printf( "ファイル【 %s 】を正常に開きました。\n\n", argFileName ); } //====================================== //■Config.hで設定した都道府県の数またはファイルの[EOF]までの情報を読み込む //※引数としてポインタ渡しされた構造体配列に書き込んでいく int i = 0; while( EOF != fscanf( fileHandle, "%d%d%s%d%lf", &argArrayPrefectures[ i ].m_BelongRegionCode, &argArrayPrefectures[ i ].m_PrefectureCode, argArrayPrefectures[ i ].m_PrefectureName, &argArrayPrefectures[ i ].m_NumPeople, &argArrayPrefectures[ i ].m_PrefectureSize ) ) { //■ファイル内に情報がまだ残っていても規定の都道府県数に達した段階で処理を中断する if( i++ >= NUM_PREFECTURES ) break; } //====================================== //■終了処理 fclose( fileHandle ); return true; } //============================================== // ■メニューの表示■ void PrintMenu( ) { //====================================== //■上枠の表示 printf( "*---------- 都道府県データ統計メニュー ----------*\n" ); //====================================== //■Config.h内で設定されたメニューリストを表示する int i; for( i = 0; i < NUM_MENUES_PLUSONE - 1; i++ ) { printf( "* %2d: %s", i + 1, MenuList[ i ] ); } //====================================== //■下枠の表示 printf( "*------------------------------------------------*\n" ); } //============================================== // ■コマンドの入力■ //●引数 //argMinCommand : 最少の入力有効値 //argMaxCommand : 最大の入力有効値 //============================================== int SelectCommand( int argMinCommand, int argMaxCommand ) { //====================================== //■有効なコマンドが入力されるまで入力待ちする int selected = argMinCommand - 1; do{ printf( "コマンドを入力してください。\n" ); printf( "※有効値【 %d ~ %d 】\n", argMinCommand, argMaxCommand ); printf( "コマンド >> " ); //■バッファフラッシュ fflush( stdin ); //■コマンドの入力 scanf( " %d", &selected ); //■見易さを調整 printf( "\n" ); } while( selected < argMinCommand || selected > argMaxCommand ); //====================================== //■終了処理 //▼入力したコマンドを返却 return selected; } //============================================== // ■ソート(都道府県コードの昇順)■ //●引数 //argArrayPrefectures : 都道府県構造体配列 //============================================== void SortByPrefectureCode( Prefecture* argArrayPrefectures ) { //●ソート済みの都道府県構造体配列 Prefecture sortedArray[ NUM_PREFECTURES ]; //●探索中の都道府県コード int currentPrefectureCode; //■都道府県コードを逆順に都道府県構造体を探索する for( currentPrefectureCode = NUM_PREFECTURES - 1; currentPrefectureCode >= 0; currentPrefectureCode-- ) { //■探索中の都道府県コードが見つかるまで、もしくはすべての都道府県を調査し終えるまで探索する //●現在調査対象の都道府県 int currentPrefecture; for( currentPrefecture = 0; currentPrefecture < NUM_PREFECTURES; currentPrefecture++ ) { //■捜索中の都道府県コードを持った都道府県構造体を発見した場合 //※ソート済み配列に追加して次の都道府県コードを探索する if( currentPrefectureCode == argArrayPrefectures[ currentPrefecture ].m_PrefectureCode ) { sortedArray[ currentPrefectureCode ] = argArrayPrefectures[ currentPrefecture ]; break; } } } //■ソート済みの都道府県構造体配列でソート前の配列を上書きする int i; for( i = 0; i < NUM_PREFECTURES; i++ ){ argArrayPrefectures[ i ] = sortedArray[ i ]; } printf( "ソートしました。\n\n" ); } //============================================== // ■ソート(人口の多い順)■ //●引数 //argpArrayPrefectures : 都道府県構造体配列 void SortByNumPeople( Prefecture* argArrayPrefecture ){ return; } //============================================== // ■ソート(面積の広い順)■ //●引数 //argpArrayPrefectures : 都道府県構造体配列 void SortBySize( Prefecture* argArrayPrefecture ){ return; } //============================================== // ■都道府県別人口密度表示■ //●引数 //argpArrayPrefectures : 都道府県構造体配列 void PrintDensityPopulationEachPrefectures( Prefecture* argArrayPrefectures ){ return; } //============================================== // ■地方別人口密度表示■ //●引数 //argpArrayRegions : 地方構造体配列 void PrintDensityPopulationEachRegions( Region* argArrayRegions ){ return; } //============================================== // ■地方別の都道府県データの表示■ //●引数 //argpArrayPrefectures : 都道府県構造体配列 void PrintPrefecturesEachRegions( Prefecture* argArrayPrefecture ){ return; } //============================================== // ■47都道府県データの表示■ //●引数 //argpArrayPrefectures : 都道府県構造体配列 void PrintAllPrefectures( Prefecture* argArrayPrefecture ) { printf( "地方 | 県 | 都道府県 | 人口(人) | 広さ(km^2)\n" ); int i; for( i = 0; i < 3; i++ ) { printf( "%4d %2d %-8s %8d人 %0.2fkm^2\n", argArrayPrefecture[ i ].m_BelongRegionCode, argArrayPrefecture[ i ].m_PrefectureCode, argArrayPrefecture[ i ].m_PrefectureName, argArrayPrefecture[ i ].m_NumPeople, argArrayPrefecture[ i ].m_PrefectureSize ); } }
退会済みユーザー

退会済みユーザー

2015/01/06 16:26

■都道府県別人口と面積.txt 1 2 愛知県 1234 1144436 1 1 三重県 15432243 1658774 1 0 鹿児島県 41435 14355 [EOF]
guest

0

■うまくいかない大きな原因
そもそも名前と引数が同じ関数が2つ存在していたりセミコロンがなかったりと、文法上のエラーがあります。
このままではコンパイルが通りません。

■情報が足りなくて解決策の提示ができない
情報が足りないです!
readKen()関数のコードを見る限りおそらくファイルの中身は”1 1 東京 1 1\n[EOF]”といった具合になっていると推測し、ファイルを実行したところメニューの処理は問題なく実行できました。
しかしどの選択肢を選んで、どういう結果を得られるようにしたいのかなどの情報が足りないので、「こうしたときにこういう風になってほしいけどならない!」といった具体的な問題点を提示してほしいです。

投稿2015/01/05 13:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

質問文にあるコードはコンパイルエエラーがでますね。
なんとかエラーがでないようにはできましたが、走らせるとファイルリードのエラーになりました。
都道府県別人口と面積.txt が必要なようです。
そのファイル内容のサンプルを提示して欲しいです。

現状の質問文にある情報だけでは、回答は得にくいとおもいます。

投稿2014/12/19 13:36

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問