- ベストアンサー
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というソフトを使っているようです。よろしくお願い致します。
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
>f(n>0 && n<imin){ >n=imin; >x=i+1; これは、 if(n>0 && n<imin){ imin=n; x=i+1; の写し間違いでしょうか。ならば、これはこれでいいと思います。 あとは、nの初期値と >while(n != 0){ この部分ですね。 それと、 >実行例を見る限り、0~9の整数を入力するみたいなので この仮定ですが、問題文には記述されていないことなので、できればこの仮定なしでいきたいですね。方法はあります。 まあ、問3についてはこれで問題ないと思いますので、先に問2を仕上げて、時間があった場合に仮定なしの問1に挑戦するのがいいかなと思います。
その他の回答 (14)
- titokani
- ベストアンサー率19% (341/1726)
問1、問2とも大丈夫だと思います。(見落としがあったらごめんなさい) 短時間でここまでできれば立派なものだと思います。 ぜひ勉強を続けてみてください。才能あるかもしれませんよ。
お礼
他に就きたい職業があるので、こちらの道に進むことはないと思います。ですが、今後も独学でがんばってみようと思います。 質問に答えてくれた皆様、長時間付き合ってくれたtitokani様、本当にありがとうございました。
- titokani
- ベストアンサー率19% (341/1726)
#7,#8,#12です。 >他におかしいところはないでしょうか? nが初期化されていません。 >while(n != 0){ これでは、nが0の時のみ終了になります。問題文では「0以下」となっていますから、これでは違います。 >scanf("%d",&n); >if(n<imin){ 入力した値が0以下かどうかを判断する前に最小値と比較しています。 なので、終了するつもりで0を入力した場合、その0が最小値とされてしまいます。
お礼
f(n>0 && n<imin){ n=imin; x=i+1; こうしてみましたが、この以前でnが0以下かどうかを判断するには、またif文が必要なのでしょうか?なんだか混乱してきました。 #include <stdio.h> int main(void) { int y; printf("西暦年を入力してください");scanf("%d",&y); if ((y%4==0 && y%100!=0) || y%400==0) printf("%d年はうるう年です\n",y); else printf("%d年はうるう年ではありません\n",y); return 0; } 3番もやってみました。
- titokani
- ベストアンサー率19% (341/1726)
>28日まで というのには理由があり、うちの大学は今月中に成績を出さなければなりません。 それなら、29日の朝までとか(^^;、今年は閏年です。 >問1で、do-while文中で最小値(iminとします)に入力した値をいれる場合、一番最初はどうすればいいのでしょうか? >if文を使い、入力した文字(nとします)<iminの時にn=iminとしたかったのですが、一番最初はできないような気がします。 >これはdo-while文の前に非ループで1回だけ試行しろ ということでしょうか? そのあたりが、問1が曖昧であるということにも関係しています。 例えば、いきなり0が入力された場合、どうすればいいのでしょうか? 問題文だけではそれがわかりません。 ループの外で一回だけ実行するのは、良いアイデアです。その場合、do-whileよりも、ただのwhileループのほうがいいでしょうね。
お礼
期限については、最終手段ということにします。 実行例を見る限り、0~9の整数を入力するみたいなので、暫定的にですがプログラムを作ってみました。 #include <stdio.h> int main(void) { int n,i,x,imin; i=0; x=0; imin=10; while(n != 0){ printf("整数を入力:"); scanf("%d",&n); if(n<imin){ imin=n; x=i+1; } i++; } printf("最小値は%d番目の%d\n",x,imin); return 0; } いきなり0を入力したらどうするの?とか、突っ込みどころは満載かと思います。 その不自然な所を敢えて見ないようにした場合で、他におかしいところはないでしょうか? なければ他の問題に取り掛かろうと思います。
- titokani
- ベストアンサー率19% (341/1726)
#7,#8です。 とりあえず、問1は問題に曖昧な点があるので、それを指摘して一日伸ばしてもらいましょう(^^; 問2もそう難しくはない。でも、この場合、行列式の値って、-2じゃないのかな?
お礼
28日まで というのには理由があり、うちの大学は今月中に成績を出さなければなりません。 なので期限を延ばしてもらうことはできないと思われます。 少し疑問に思ったことがあります。 問1で、do-while文中で最小値(iminとします)に入力した値をいれる場合、一番最初はどうすればいいのでしょうか? if文を使い、入力した文字(nとします)<iminの時にn=iminとしたかったのですが、一番最初はできないような気がします。 これはdo-while文の前に非ループで1回だけ試行しろ ということでしょうか?
- jacta
- ベストアンサー率26% (845/3158)
#9です。 > 0以下の値が入力されたら終了し この条件がもれていました。 適当に直してください。
- jacta
- ベストアンサー率26% (845/3158)
1番だけ作ってみました。ただし、このまま提出すれば、ほぼ間違いなく留年確定でしょう。 #include <stdio.h> #include <stdlib.h> #include <limits.h> int main(void) { long long minimum = LLONG_MAX; int n = -1; for (int i = 1; i <= 6 + 1; i++) { printf("\u6574\u6570\u3092\u5165\u529b:"); fflush(stdout); long long value; scanf(" %lli", &value); if (i > 6) { if (value != 0) { abort(); } break; } if (value < minimum || n < 0) { minimum = value; n = i; } } printf("\u6700\u5c0f\u5024\u306f%d\u756a\u76ee\u306e%lld\n", n, minimum); } 処理系が不明なので、「キーボードから」というのは「標準入力から」に読み替えました。また、「表示する」は「標準出力に出力する」の意味に読み替えました。 一般的な整数を扱うことはできませんので、最大の整数型であるlong long型を使用しました。 日本語の文字列は、基本ソース文字集合の範囲で表現するため、国際文字名を使用しました。
お礼
ありがとうございました。 >>ただし、このまま提出すれば、ほぼ間違いなく留年確定でしょう。 私もそう思います。なので、参考にさせて頂きます。
- titokani
- ベストアンサー率19% (341/1726)
#7です。 >「とりあえずどんな本を見てもいいからがんばってこい」 これはやっぱり頑張るしかないね。 で、3だけど、 実行結果例 西暦年を入力してください. 1987 1987 年はXXXXXXXX ではなくて、 西暦年を入力してください. 1987 1987 を4で割った余りは 3 って表示するのは出来ますか?
お礼
現在1番をやってますが、時間がかかりそうです。
- titokani
- ベストアンサー率19% (341/1726)
>この授業は文系では選択授業で、私は元々は受けていません。 >ただしセミナーでこの教授が担当だったため、単位を相談したところ、「明日(28日)の6時までにこれできたらあげてもいいよ」と言われた次第です。 どうなんだろうなあ。それって「留年しなさい」ってメッセージなような気も(^^; 人に作ってもらったのを持っていくのと、たとえ完成しなくても、最大限努力して持っていくのと、どっちが有利だろう? とりあえず、3が一番簡単なので、頑張って3だけでも作って持っていってみては? >入力した文字の表示の方法程度です。 とのことなので、ヒント 余りを求めるには、%を使います。 yearに西暦が入っているとして、 year % 4; が0なら4で割り切れたということです。
お礼
留年してしまったらそれは再試験に受からなかった自分のせいなのでしょうがないですが、まだ可能性があるのならそれに縋りたいです。 ヒント、ありがとうございます。 現在はkamejiro様のヒントを元に、1番をやってみてる所です。
- jacta
- ベストアンサー率26% (845/3158)
> その先生は私のことを文型で、C言語などやったことがないことを理解してるはずですから、 何かおかしくないですか? やったことがない宿題なんか、あり得ないと思います。本来やるべきだったのを、怠っていただけではないのですか? ところで、「文型」ではなく「文系」ではないでしょうか?
お礼
別の教科の再試験に落ち、進級するための単位が足りませんでした。 そこで、「授業は受けてないけどレポートか何かで単位をくれる教授」を探した結果がこうなったのです。 この授業は文系では選択授業で、私は元々は受けていません。 ただしセミナーでこの教授が担当だったため、単位を相談したところ、「明日(28日)の6時までにこれできたらあげてもいいよ」と言われた次第です。 文型は誤字です、失礼しました。
- asuncion
- ベストアンサー率33% (2127/6290)
仮に、こちらで答えを教えてもらったとします。 その答えをご自分でじゅうぶん咀嚼できないまま先生のところへ持っていき、 「書いたプログラムの内容を説明せよ」と問われて 撃沈しないことを切に祈ります。
お礼
ありがとうございます。 その先生は私のことを文型で、C言語などやったことがないことを理解してるはずですから、おそらく突っ込んだことは聞かれないと思います。
- 1
- 2
お礼
#include <stdio.h> int main(void) { int n,i,x,imin; x=0; n=0; printf("整数を入力:"); scanf("%d",&n); imin=n; i=1; while(n>0){ printf("整数を入力:"); scanf("%d",&n); if(n>0 && n<imin){ imin=n; x=i+1; } i++; } printf("最小値は%d番目の%d\n",x,imin); return 0; } ループ前に一度試行し、iの初期値を1にしてみました。 whileでのループ定義を勘違いしていたため、そこを修正。 問2 #include <stdio.h> int main(void) { int a[2][2],i,j; for(i=0;i<2;i++){ for(j=0;j<2;j++){ printf("%d行%d列の要素? ",i+1,j+1); scanf("%d",&a[i][j]); } } printf("行列A =\n%d %d\n%d %d\n",a[0][0],a[0][1],a[1][0],a[1][1]); printf("行列式= %d",a[0][0]*a[1][1]-a[0][1]*a[1][0]); return 0; } ちょっと行列の計算の式があってるか不安です。 質問には載せてないですが、問4と問5も実在したりします。 こちらは穴埋め形式のため、なんとかがんばってみようと思います。