• 締切済み

C言語についていくつか至急教えてください。

3つほどお聞きしたいことがあります。 1つ目は閏年についてです。 2つの年をmain関数内で入力し、その西暦を引数とする関数CheckYearを使い、結果を出すのですが、条件としては1.西暦年が4で割り切れる閏年。 2.1つ目を満たしていても西暦年が100で割り切れるときは閏年ではない。 3.2つ目を満たしていても西暦年が400で割り切れるならば閏年である。 実行結果として、西暦を入力:2000 西暦を入力:2009  2000年 2004年 2008年 閏年は3回あります。 とあるようにならなければなりません。 2個目は、10進数の値(dec)を読み込み4ケタの2進数に変換するものです。 なお、結果表示にはprintf("(10進数)%d%d%d%d\n",dec,d3,d2,d1,d0);を使います。 実行結果としては、7と入力する場合→(10進数)7=(2進数)0111 となります。 3個目は、棒グラフを表示するものです。 要素5個持っている配列dataに10以下の値を入力する。 関数はputbox(void型)を使用しputboxは1行当たり10個の□や■を表示。 引数の値だけ、□を表示し残りは、■を表示する。 配列の要素の値も表示のこと。 実行結果としては、10,9,8,4,0を入力する場合 1:10 2:9 3:8 4:4 5:0 10 □□□□□□□□□□  9□□□□□□□□□■  8□□□□□□□□■■  4□□□□■■■■■■  0■■■■■■■■■■ となるようにします。 身勝手で尚且つ分かりにくい文章で申し訳ありません。 どうかよろしくお願いいたします。

みんなの回答

回答No.5

閏年の問題。 条件としては 1.西暦年が4で割り切れる年は閏年。 2.1つ目を満たしていても西暦年が100で割り切れるときは閏年ではない。 3.2つ目を満たしていても西暦年が400で割り切れるならば閏年である。 #define common_year 0 #define leap_year 1 int CheckYear(int year) { int result; if (year % 4 == 0) { if (year % 100 == 0) { if (year % 400 == 0) resutl = leap_year; else result = common_year; } else result = leap_year; } else result = common_year; return result; } これは、次のように読み替えた方が、できてくるプログラムがシンプルになる傾向にあります。 1. 西暦が4で割り切れない年は平年(決定) 2. そうでなくて、100で割り切れない年は閏年(決定) 3. そうでなくて、400で割り切れない年は平年(決定) 4. そうでなければ、閏年(決定) ※複数の条件はなるべく早期に決定して、「そうでなくて(else)」で次に流すのがシンプルな構造の秘訣。 #define common_year 0 #define leap_year 1 int CheckYear(int year) { if (year % 4) return common_year; if (year % 100) return leap_year; if (year % 400) return common_year; return leap_year; }

回答No.4

No.3 ですが、間違いがあります。 まあ、putbox() の引数の型は指定がないから、 void putbox(unsigned int v) { if (v <= 10) printf("%2ud%s\n", v, lines[v]); } ということで。

回答No.3

せめて、「出題を正確にコピーする」くらいはやろう。 3個目(でも、これは反則) #include <stdio.h> char *lines[] = { "■■■■■■■■■■", "□■■■■■■■■■", "□□■■■■■■■■", "□□□■■■■■■■", "□□□□■■■■■■", "□□□□□■■■■■", "□□□□□□■■■■", "□□□□□□□■■■", "□□□□□□□□■■", "□□□□□□□□□■", "□□□□□□□□□□", }; void putbox(int v) { if (v <= 10) printf("%2d%s\n", v, lines[v]); } int main() { int data[5] = {10, 9, 8, 4, 0}; unsigned int i; for(i = 0; i < sizeof(data) / sizeof(data[0]); i++) putbox(data[i]); return 0; }

  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.2

宿題丸投げはNG・・・

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

で質問は何?

関連するQ&A

  • C言語のプログラミングについて

    私は大学2年なのですが、現在留年するかしないかというぎりぎりのところに立っています。好意で単位をなんとかしてくれる教授を探し出し、C言語の宿題を出されました。ですが私は根っからの文型で、プログラミングなどしたこともありません。教科書を図書館で借りて読んでみるものの、すぐ理解できるような難易度ではないことだけがわかりました。 そこでもしよろしければ、プログラムを教えてもらいたいです。 1.キーボードから整数の入力を繰り返す。0以下の値が入力されたら終了し、入力した値の中の最小値を表示する。また、それが何番目に入力された値かもあわせて表示する。(6つの整数を入力、最後の整数は0を入力することとする。) 実行結果例 整数を入力: 6 整数を入力: 5 整数を入力: 4 整数を入力: 3 整数を入力: 2 整数を入力: 1 整数を入力: 0 最小値は6番目の1 2.キーボードから整数の入力を4回繰り返し、それらの値を2次元配列Aの各要素に順に代入し、その行列のそれぞれの要素と行列式を表示するプログラムを作成せよ。 実行結果例 1行1列の要素? 6 1行2列の要素? 5 2行1列の要素? 4 2行2列の要素? 3 行列A = 6 5 4 3 行列式 = 2 3.キーボードから西暦年を入力し,その年が閏年のときは「○○年はうるう年です」と表示し,そうでないならば「○○年はうるう年ではありません」と表示するプログラムを作成しなさい. なお,閏年の定義は以下の通りである. ・西暦年が4で割り切れる年は閏年 ・ただし,西暦年が100で割り切れる年は平年 ・ただし,西暦年が400で割り切れる年は閏年 実行結果例 西暦年を入力してください. 1987 1987 年はXXXXXXXX 一時的ではありますが、皆様のお力をお借りしたいです。 もちろん、ここでお答えをもらってもわからないままにせずに、無事進級することができたら独学で勉強しようとは思ってます。 なお、理系の人たちはVisualBasicというソフトを使っているようです。よろしくお願い致します。

  • C言語の問題です

    うるう年も含めて、西暦年における各月の日数を表示せよ。 キーボードからの入力は、年と月、の2つの値。 例 2007 6   2007 2   2000 2   2100 2 画面にはその月の日数を表示する。 例 入力が 2007 6 に対して、画面に 「2007年6月の日数は30である」 と表示する。 間違って入力に対しては、再入力を促すようにすること。 プログラムに配列を必ず使うこと。 ソースプログラムと実行画面のコピーをWordファイルに貼り付けて提出すること。 うるう年の表示と年を選ばせることができません。 助けてください!

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • 閏年のプログラム

    C言語(閏年)の質問です。 任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成で途中まではわかって修正・追加する箇所があったら一緒に教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。) なお、閏年の判定方法は以下のとおりである。 条件1 西暦年が4で割り切れる年は閏年である 条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない 条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である 実行例1 西暦を入力:2000 西暦を入力:2009 2000年 2004年 2008年 閏年は3回あります。 実行例2 西暦を入力:2100 西暦を入力:2000 2000年 2004年 2008年 2012年 2016年 2020年 (省略) 2096年 閏年は25回あります。 実行例3 西暦を入力:2090 西暦を入力:2110 2092年 2096年 2104年 2108年 閏年は4回あります。 #include <iostream> bool checkYear(int year); int main() { int year; int year2; printf("西暦を入力:"); scanf("%d",year); printf("西暦を入力:"); scanf("%d",year2); int count = 0; for (int i = year; i < year2; i++) { if (checkYear(i)) { printf("%d年\n"); count++; } } printf("閏年は%d回です。\n"); return 0; } bool checkYear(int year) { return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); }

  • C言語について

    こんばんわ。協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • C言語 関数について

    協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • C言語 関数問題

    西暦年yearを引数として受け取り,閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し,そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく,メイン関数main()も含む下記プログラムを完成させる形で作成する #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */

  • C言語について教えてください。

    二次元配列でまとめられた「配列で実現する文字列」の文字と文字列を表示する関数を定義し、その関数の機能を確認するプログラムを作成する。 ただし、以下の例のように文字列の個数が変更されても処理できる関数を作成する。 また、文字列の文字の個数は最大9とする(一次元配列の要素数は10とする) さらに、関数printf()をできるだけ用いない。 (1)二次元配列でまとめられたすべての文字列を「一度に」表示する関数を定義する (2)二次元配列でまとめられたすべての文字列の文字を「一度に」表示する関数を定義する。このとき、前回の課題で定義した「すべての文字を表示する関数print_all_char()」を新しく定義する関数から呼び出して用いる。 (3)二次元配列に各文字列を格納してまとめるとき、初期化ではなく、配列の宣言・定義の後で、関数strcpy()を用いること(例では、初期化によりまとめている) [例] char astr[][10] = { "ABCD", "EFGHIJ", }; [実行結果の例] すべての文字列の表示 ABCD EFGHIJ すべての文字列の文字の表示 A B C D E F G H I J [ヒント] (1)二次元配列でまとめられた文字列の文字あるいは文字列を表示する関数<返却値型><関数名>(二次元配列の受け渡しに対応した仮引数の宣言、文字列の数) (2)文字列の数を求める。二次元配列のすべての要素に文字列が格納されている場合、文字列の数=二次元配列の要素数(一次元配列の数) =sizeof(astr)/sizeof(astr[0]) ただし、sizeof演算子の生成する型はsize_t型である。 この問題について教えてください。問題丸投げだとは分かっていますがどうしても分かりません。教えてください。ちなみに前回の課題の定義は下の通りです。 void print_all_char(char *chs) { while(*chs!='\0') { printf("%c\n",*chs); chs++; } } よろしくお願いします。

  • C言語をお願いします

    関数の使い方が分かりません、お知恵を貸してください 問題 一桁の整数を入力。 その数を起点として5の段までの九九の表を表示するプログラムを作成。 条件が4つ。 ・下記の実行結果のように表示しなさい。 ・タイトル行(1・・・5)の表示は、main 関数で行う。 ・入力した数を起点とした5の段までの九九の表を表示する関数 func99 を作る。 ・そのうち乗算部分は、func_mul 関数を作る。 5(入力) 実行例 1 2 3 4 5 //ここはプリントで出力 5 10 15 20 25 6 12 18 24 30 7 14 21 28 35 8 16 24 32 40 9 18 27 36 45 10 20 30 40 50 数字部分は%5dでお願いします

  • Visual C++で・・・・。

    以下の問題の答えを教えてくれませんか? 授業でVisual C++を習っていて、コレは課題ではありませんが、テスト対策用の問題で、答えがありません。 どなたか、どうかよろしくお願いします。 西暦(うるう年の判定) main関数:西暦の入力(入力された年=n) main関数:void uruu(int m)とする。    この関数の中で判定して、西暦とその結果を出力    この場合は戻り値を考える必要はない=>void    判定の内容は4で割り切れるか、100で割り切れるか、      さらに400で割り切れるかの条件 応用 5種類の西暦を入力して、入力した西暦を出力させて判定するように変更    main関数の中で西暦の入力と関数の実行を5回繰り返す。