• ベストアンサー

C言語プログラム

こんな課題が出たのですが、さっぱりわかりません。 誰か解る人がいたら教えてほしいです。 1 3+5+7+…+nと奇数の和を求め、和が100を越えたときのnの値を求めて表示するプログラムをdo~whileを使って作成しなさい。 2  キーボードから3つの数を読み込み、最大値を求める処理を繰り返し行うプログラムを、do~whileを使って作成しなさい。繰り返しの終了は、計算のあとで、'S'(1文字)が入力されるまでとし、それ以外の文字では、処理を続行すること。 3  整数型1次元配列kに整数123,456,789をそれぞれ代入し、その内容を表示するプログラムを作成しなさい。 4  文字型1次元配列strに'u'を、'n'、'i'、'x'それぞれ代入し、その内容を文字列として出力するプログラムを作成しなさい。 5  要素数50の整数型1次元配列mの要素すべてに、その添字に対応した0~49の数値を代入し、その内容を表示するプログラムを作成しなさい。 3は #include <stdio.h> main() { int k[3]; k[0] = 123; k[1] = 456; k[2] = 789; printf("%d\n%d\n%d", k[0], k[1], k[2]); return 0; } と解いてみたんですが、やっぱ間違えてますよね?

質問者が選んだベストアンサー

  • ベストアンサー
  • susanna
  • ベストアンサー率100% (2/2)
回答No.7

<お礼・6>のプログラムは残念ながら正常に動作しません。 (1)プログラムの途中の } のせいで、main関数が終わってしまっています。  またwhileの位置もおかしいです。  ソースの4行目の } while ) を削除してください。 (2)exitを使うにはstdlib.hをincludeする必要があります。 (3)scanfは第1引数(" "で囲んだ個所)を読み込み、第2引数に格納していま す。だから   scanf("%c,n") ==> scanf("%s",n)  としましょう。""の位置が違うということですね。 書き直すとこのようになります。 ------------------------------ #include <stdio.h> #include <stdlib.h> main(){ int i, j, k; char n, s = 's'; do{ printf("i, j, kの値を入力してください。\n"); scanf("%d%d%d", &i, &j, &k); if(i >=j && i >=k) printf("最大値は、%d\n", i); else if(j >=k && j >=i) printf("最大値は、%d\n", j); else if(k >=j && k >=i) printf("最大値は、%d\n", k); printf("sを入力したら終了します。\n"); scanf("%s", &n); if(s == n) exit(0); }while(1); } --------------------------------- 投稿する前に一度プログラムを走らせて見ることをオススメします。 うっかりミスというのも良くあることですから。 それでは頑張ってください。

murasin
質問者

お礼

何度もご指摘すみません。でもありがたいご指摘ありがとうございます。 確かに間違いだらけですね。 今度からは投稿する前にプログラムを走らせてみます。 本当に手間かけてすみませんでした。 これからはもっと勉強してから質問します。

その他の回答 (6)

  • susanna
  • ベストアンサー率100% (2/2)
回答No.6

問題の2に対しての回答です。 詳しい入力検査はしていませんので、 数字以外を入れるとおかしくなるかもしれません。 s以外の文字を入れると終了せずに比較を続ける仕様になっています。 #include <stdio.h> int main(void) { char cEnd; int i1, i2, i3 ,iMax; do{ printf ("3つの数字を入力してください=>\n"); scanf("%d %d %d", &i1, &i2, &i3) ; iMax = i1 ; if(iMax < i2) iMax = i2 ; if(iMax < i3) iMax = i3 ; printf("%d, %d, %d の最大値は %d です。\n" , i1,i2,i3,iMax); printf ("終了の場合はsを入力してください\n"); scanf("%s",&cEnd); if(cEnd == 's') break; }while (1) ; return 0 ; } 入力する時は、1つの数字ごとにEnterキーを押してください。 ちなみに整数のみの比較です。いろいろ穴のあるプログラムですみません。

murasin
質問者

お礼

こんなに長いプログラムわざわざ考えていただいて本当にありがとうございました! 2は #include <stdio.h> main(){ int i, j, k; char n, s = 's'; }while( do{ printf("i, j, kの値を入力してください。\n"); scanf("%d%d%d", &i, &j, &k); if(i >=j && i >=k) printf("最大値は、%d\n", i); else if(j >=k && j >=i) printf("最大値は、%d\n", j); else if(k >=j && k >=i) printf("最大値は、%d\n", k); printf("sを入力したら終了します。\n"); scanf("%c, &n"); if(s == n) exit(0); }while(1); } でもあってますでしょうか??

  • 084
  • ベストアンサー率0% (0/7)
回答No.5

#include<stdio.h> main(){ char str[]={'u','n','i','x'}; int i=0; while(i<4) { printf("%c",str[i]); i++; } printf("\n"); return 0; } すみません、↓のが間違ってました。 文字型なのでchar型でした。 今度はfor文でなくwhile文で作ってみました。 本当に何度もすみません。 では、がんばって下さい!

murasin
質問者

お礼

わざわざ訂正ありがとうございます。 ↓に3と4を解いてみたので是非よかったら見てください。

  • 084
  • ベストアンサー率0% (0/7)
回答No.4

と、いうことで暇(?)ができたので4、です。 #include<stdio.h> main(){ int str[4]={'u','n','i','x'}; int i;      for(i=0;i<4;i++) { printf("%c",str[i]); } printf("\n"); return 0; } これ、unixを表示させればいいんですよね? 実行結果はunixです。 この課題での”代入”が出来ているか不安なので確かめてみてください。 参考になったかは自信ありません・・・。 私としても勉強になったのでお互い様です。 補足ですが、3番は表示させるのにfor文を使うことが出来ます。 2、は問題の意味がよくわからないのと、たとえわかったとしてもプログラム出来そうにないので回答できません。お役に立てなくて申し訳ない。たびたびですみませんでした。

murasin
質問者

お礼

たびたびありがとうございます。 そうですね。たぶん、unixを表示すればいいと思います。 十分、参考になりましたよ! 本当丁寧で解り易い解答ありがとうございました! ところで3は #include <stdio.h> main() { int k; int ndigit[3]; ndigit[0] = 123; ndigit[1] = 456; ndigit[2] = 789; for(k = 0; k < 3; k++) printf("%d\n", ndigit[k]); } であってるでしょうか? あと、4は #include <stdio.h> main() { char str[5]; str[0] = 'u'; str[1] = 'n'; str[2] = 'i'; str[3] = 'x'; str[4] = '\0'; printf("%s\n", str); } でもいいんでしょうか?? 何度もすみません!

  • 084
  • ベストアンサー率0% (0/7)
回答No.3

Sは奇数の和です。Sでなくてもよいです。 3、nを3にすると表示した時に、123456789と連続に表示され、区切りがわかりづらいので%4dとかにすると 123 456 789と表示されますよ。

murasin
質問者

お礼

あ~そうなんですか!それはわざわざ教えていただきありがとうございます♪ 勉強になります。 また、質問した時はお暇があればお願いします。 本当に色々と教えていただきありがとうございました!!

  • 084
  • ベストアンサー率0% (0/7)
回答No.2

no1の者です。 すみませんが、No1の回答に voidを取って、printf("%3d\n",n); の後にreturn 0;を加えてください。 no1と同条件です。 5、の回答です。 #include<stdio.h> main(){ int i,m[50]; for(i=0;i<=49;i++){ m[i]=i; printf("m[%2d]=%2d\n",i,m[i]); } return 0; } 実行結果は m[ 0]= 0 m[ 1]= 1 m[ 2]= 2 : m[49]=49 となります。 3、はprintf("%nd%nd%nd",k[0],k[1],k[2]); のnは数字じゃなくてnなのですか?そこだけちょっとわからないのですが他は正しいと思います。

murasin
質問者

お礼

わざわざ、訂正ありがとうございます。 5の方もなんとなくわかりました。 3の方ですが、確かにnじゃなくて数字でしたね。 この場合は数字は3でいいんでしょうか? わざわざご指摘ありがとうございました。

  • 084
  • ベストアンサー率0% (0/7)
回答No.1

C++言語で作ってますが大した差はないので 1についてです。 #include<stdio.h> void main(){ int n=3,s=0; do{ n+=2; }while((s+=n)<=100); printf("%3d\n",n); } n+=2で奇数を足して行き、whileの条件に和が100になるまでとしています。 実行すると答えは21です。日本語のパソコンで作ってます。

murasin
質問者

お礼

なるほど。解答見るとなんとなくわかりました! ところでsは奇数の和ってことですか?

関連するQ&A

  • c言語のプログラムで

    c言語で 2つの整数を読み込んで小さいほうの数以上で大きいほうの数以下の整数をすべて加えた値を表示するプログラム で最後の表示の仕方がわかりません。 実行結果は 整数1:37 整数2:28 28以上37以下の全整数は325です。と表示されるはずです。 この表示の3行目の28と37の表示がどうやればよいのかわかりません。 #include <stdio.h> int main(void) { int a, b; int sum=0; printf("整数1:"); scanf("%d",&a); printf("整数2:"); scanf("%d",&b); if(a>b) do{ sum=sum+b; b=b+1; }while(b<=a); else do{ sum=sum+a; a=a+1; }while(a<=b); printf("%d以上%d以下の全整数の和は%dです。",a,b,sum); return(0); } 全整数の表示はできます。 do文の中でa=cとかにしてやってみましたが、うまくいきませんでした。 お願いします。

  • C言語初心者です。次のプログラムを簡潔にしたいです

    二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成せよ。 自分のプログラムは以下の通りです。 #include <stdio.h> int main(void) { int num1,num2,small,big,sum=0; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d",&num1); printf("整数B:"); scanf("%d",&num2); small=(num1 > num2) ? num2 : num1; big=(num1 > num2) ? num1 : num2; printf("%d以上%d以下の全整数の和は",small,big); if (num1 < num2) { do { sum+=num1; num1++; }while (num1 <= num2); } else { do { sum+=num2; num2++; }while (num2 <= num1); } printf("%dです。",sum); return 0; } 結果は正しく表示されるはずです。 しかし多変数かつループ文を組み合わせているため、長ったらしくなっています。 どのようなプログラミングならば、簡潔にかけますか? 解答がないので困っています。

  • 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言語についてなんですが

    プログラムの作成で分からないところがあります。 「二つの整数値を読み込み、小さいほうの数以上で大きい数以下の 整数を全て加えた値を表示するプログラムをdo文を使って 作成せよ。」 下の図のようにしたいです。 2つの整数を入力せよ。 整数A:37 整数B:28 28以上37以下の全整数の和は325です。 よろしくお願いします。

  • C言語の問題でわからないところがあります

    先ほども似たような内容で質問させて頂いたのですが、もう一度質問させてください。 最近C言語を勉強し始めたのですが、わからないところがあります。 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成するものなのですが、うまくいかなく困っています。 他の書き方でやれば普通にいけると思うのですが、これだとできない理由がわからないと、もやもやしてしまうので・・・・ プログラムは以下の通りです #include <stdio.h> int main(void) { int n1,n2,n3,n4; puts("二つの整数を入力してください"); printf("整数1:"); scanf("%d",&n1); printf("整数2:"); scanf("%d",&n2); n3=(n1>n2) ? n2 : n1; n4=(n1>n2) ? n1 : n2; printf("%d以上%d以下の全整数の和は", n3,n4); int num=n3; /* numの最初の値は小さい方の値 */ int wa=0; /* n3が小さい方の数、n4は大きい方の数 */ do{ if (n1>n2) { wa=n4+num; /* 大きいほうの数(num)にsub(小さい方の数+0,2,3,4・・・)を足していく */ num=num+1;/* ここを通るたびにsubに+1 */ printf("%d",wa);} else { wa=n4+num; num=num+1; printf("%d",wa);} }while(num<n4); /* num<n4を満たさない=numが大きいほうの数よりも大きくなったらループを終了 */ printf ("です\n"); /* ですっす */ return 0; } これで大きい方に37、小さいほうに28と入力すると656667686970717273ととても大きな数値になってしまいます。 ループが間違っているのでしょうか? whileは whileの後の()の中身の条件を満たしているとにループする、と認識しているので、numが大きい方の数値より大きくなったとき、ループを終了するようにしているつもりです。 ここがどこか間違っているのでしょうか・・・? それから、初期化というのもいまいち理解していないのですが、intで宣言するときに、中に数値を格納しておく、という物だと思っています。 宣言の後にprintf("%d",num);などで確認すると、代入できているようなので、これは間違っていないと思うのですが・・・・、 間違っているところがざっとみて解りましたら、回答頂けるとありがたいです。 C言語を始めたばかりなので、できれば簡単に説明して頂けるとありがたいです。

  • C言語のプログラム問題

    【質問】 次の処理を行うプログラムを作成する。 (1)10個の要素を持つ一次配列dat[10]を宣言する (2)dat[0]に0、dat[1]に1をセットする (3)dat[2]以降の要素には、前の2つの要素の和を計算し入力する。 (4)配列の各要素の値を表示する 【プログラム作成例】 dat[ 0] = 0 dat[ 1] = 1 dat[ 2] = 1 dat[ 3] = 2 dat[ 4] = 3 dat[ 5] = 5 dat[ 6] = 8 dat[ 7] = 13 dat[ 8] = 21 dat[ 9] = 34 上記の解答は下記の通りなのですが、下記以外の解答方法を教えてはいただけないでしょうか? C言語に詳しい方よろしくお願いいたします。 #include <stdio.h> main() { int i, dat[10]; dat[0] = 0; dat[1] = 1; for (i=2; i<10; i++) { dat[i] = dat[i-2] + dat[i-1]; } for (i=0; i<10; i++) { printf ("dat[%2d] = %2d\n", i, dat[i]); } return (0); }

  • C言語プログラムの課題

    大学で以下のような課題が出ました。でも全然わかりません。わかる方がいらっしゃったら、是非教えてほしいです★ 1整数値123を変数iに代入して、iの値を表示するプログラムを作成せよ。 2実数値3.14159を変数xに代入して、xの値を表示するプログラムを作成せよ。 3文字型せーた'A'を変数chに代入して、chの値を表示するプログラムを作成せよ。ただし、chの値を表示する際には、%d,%x,%cの書式を用いること。 4キーボードから入力された2つの整数値i,jの値を画面に表示するプログラムを作成せよ。 5キーボードから2つの整数値を、変数in1とin2に入力して、以下の計算をした結果を画面に表示するプログラムを作成せよ。 in1+in2= in1-in2= in1*in2= in1/in2= in1%in2=

  • このC言語プログラムでどこをいじればいいのか教えて下さい。

    このC言語プログラムでどこをいじればいいのか教えて下さい。 //2 つの整数を入力し、和、差、積、商を計算し表示する。 #include<stdio.h> int main(void) { int a,b,wa,sa,seki,syou; scanf("%d %d",&a,&b); wa=a+b; sa=a-b; seki=a*b; syou=a/b; printf("%d+%d=%d\n",a,b,wa); printf("%d-%d=%d\n",a,b,sa); printf("%d*%d=%d\n",a,b,seki); printf("%d/%d=%d\n",a,b,syou); return (0); } これを繰り返し実行する形にしたいです。できれば今勉強中のwhileでお願いします。 また間違っている部分、指摘などありましたら宜しくお願いします。 大きな値をいれると足し算がダメになったり、割り算がおかしくなります。 また実数の時はどうなのかなど教えて下さい。

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • C言語についての質問です><

    0から100までの乱数を発生させ要素20個の整数配列aに乱数を格納し、 その配列を大きい順番に並び替える。 その際もともと格納されていた配列の場所もあわせて 表示するプログラムを示せ。 乱数発生にはsrand関数とrand 関数を使います。 二次元配列を使うこと. プログラムリソースとプログラム解説をつけてほしいです>< 例 number place a[0]=98 3 a[1]=94 19 a[2]=90 1 のようになるようにお願いしますm(_ _)m

専門家に質問してみよう