- ベストアンサー
C言語について
以前も同じことを質問したのですが、分からなかったので、また質問します。本を読んでも分かりませんのでプログラム全てを教えて下さい。2日も考えています。他人からすれば何で説明を読んでも分からないのか?と思われると思いますが、本当に全く分からないし見当もつきません。よろしくお願いします。 1.キーボードから整数nを入力して、1+2+…+nを求めるプログラムを作れ。 2.キーボードから整数nを入力して、1*2*…*nを求めるプログラムを作れ。 3.キーボードから10個の実数を入力し、それらの平均を求めるプログラムを作れ。 4.円錐の体積を求めるプログラムを作れ。 注:円錐体積V=π*r*r*h/3 5.キーボードから文字列を入力し、それを逆さまにするプログラムを作れ。例えば、"dog"を逆さまにすると"god"になる。 以上の5問です。できるだけ簡単で理解しやすいものでお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
printf関数とscanf関数の使い方、forループの使い方と基本的な動作、配列についての基礎知識はあるものとして回答します。 ■1 sum.c #include <stdio.h> void main(void) { int n; int sum = 0; /* 計算用。最終的に答えが入る */ int i; printf("n="); scanf("%d", &n); /* scanfでは&を忘れずに! */ for (i = 1; i <= n; i++) sum = sum + i; /* sumとiの和を、sumの新しい値とする */ /* このためsumの初期値は0にしておいた */ printf("%d\n", sum); } ■2 fac.c #include <stdio.h> void main(void) { int n; int fac = 1; /* 計算用。最終的に答えが入る */ int i; printf("n="); scanf("%d", &n); for (i = 1; i <= n; i++) fac = fac + i; /* facとiの積を、facの新しい値とする */ /* このためfacの初期値は1にしておいた */ printf("%d\n", fac); } ■3 ave.c #include <stdio.h> void main(void) { double n; /* 実数を扱う場合、double型とする */ double sum = 0.0; /* 合計計算用 */ double ave; /* 平均用 */ int i; for (i = 1; i <= 10; i++) { printf("%d番目=", i); scanf("%lf", &n); /* double型は、%lfで入力する */ sum += n; /* sum = sum + n; の省略形 */ } ave = sum / 10; printf("%f\n", ave); /* double型は、%fで表示する */ } ■4 cone.c #include <stdio.h> void main(void) { double r, h; /* 半径、高さ */ double v; /* 体積 */ double pi = 3.141592; /* π */ /* 時には1行に複数の文を並べた方が、(ソースが)見やすくなることもある */ printf("底面(円)の半径="); scanf("%lf", &r); printf("円錐の高さ="); scanf("%lf", &h); v = pi * r * r * h / 3; printf("円錐の体積は%fです\n", v); } ■5 strrev.c #include <stdio.h> #include <string.h> void main(void) { char str[256]; /* 文字列保存用 */ char ch; /* 文字列反転用 */ int n1, n2; /* 文字列反転用 */ puts("文字列を入力してください"); /* putsだと、\nなしでも改行される */ gets(str); /* scanfではスペースが入力できないので、getsを使う */ /* <基本アルゴリズム> */ /* 配列strの中を、先頭から後ろへ、終端から前へ、同時に1文字ずつ見て交換していく。 */ /* どこを見ているのかを覚えておくために、先頭から用にn1、終端から用にn2を用意する。 */ /* 先頭は常に0番だが終端は入力内容により変わるため、strlen関数(文字列の文字数を返す)で求める。 */ /* ただし文字数は 1,2,3 … と数えるのに対し、配列アクセスは 0,1,2 … であるため、1を引いて調整する。 */ n1 = 0; n2 = strlen(str) - 1; /* 見ていくポイントがすれ違って行き過ぎないように、whileの条件を作る */ while (n1 < n2) { /* n1番目の値と、n2番目の値を、chを経由して交換する */ ch=str[n1]; str[n1]=str[n2]; str[n2]=ch; /* 後ろにずらす時は++、前にずらす時は--する */ n1++; n2--; } puts(str); }
その他の回答 (4)
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 1. :void main(){ : int i; : int key; : int ans = 0; : scanf("%d", &key); : for(i=0;i<key;i++){ : ans += (i+1); : } : printf("Ans.%d", ans); :} 2. :void main(){ : int i; : int key; : int ans = 1; : scanf("%d", &key); : for(i=0;i<key;i++){ : ans *= (i+1); : } : printf("Ans.%d", ans); :} 3. :void main(){ : int total = 0; : int key; : int i; : for (i=0;i<10;i++){ : scanf("%d", &key); : total += key; : } : printf("Ans.%f3.2", key/10); :} 4. :void main(){ : int r; : int h; : scanf("%d", &r); : scanf("%d", &h); : printf("Ans.%f3.2", 3*r*r*h/3); :} 5. :void main(){ : char str[255]; //254文字まで対応 : char ans[255]; //同上 : char *p; : int i; : memset(&str[0], 0, 255); : memset(&str[0], 0, 255); : scanf("%s", &str); : p = &ans[0]; : for (i=strlen(str);i=0;i--){ : &p = str[i]; : } : printf("Ans.%s", ans); :} 暫く Cは使っていなかったので間違いだらけかもしれません(^^; 参考程度にお願いします(..
お礼
honiyonさんありがとうございます。早速がんばってみます。ありがとうございます。
プログラムを作ってあげるのは簡単ですが、ちょっと意地悪したくなります。 この時期、学生さんから課題を解いてくれという質問が多いのですが、ただひたすら「分かりません」「全てを教えてください」「できるだけ簡単で理解しやすく」という言い方をする人が多いですね。たとえば英文和訳の問題で、出典も前後の文脈も示さずただ「訳してください」とか。 答える人だって生身の人間ですから、少しでも良い印象を持たれる質問方法を心がけたほうが得ですよ。 具体的には「どんな箇所が分からないのか」「自分はどこまで理解しているのか」「これまでに何を試したのか、どんな努力をしたのか」を書けば、皆さん答えやすいでしょう。 本を読んでも分からないそうですが、最初の1文字から分からないわけではないですよね。では、がんばってください。 ……だけではあんまりなので、今回のポイントを挙げましょう。C言語の入門書には載っているはずです。 (1) キーボードから値を入力する方法(ヒント:scanf) (2) 処理の繰り返し(ヒント:for, while) (3) 文字列の長さを知る方法、文字列の中から1文字づつ取り出す方法(ヒント:配列, strlen)
お礼
#include <stdio.h> void main(void) { で始めるということしか…。scanf for while は見たことはありますが使い方は分かりません。アドバイスありがとうございました。
直答えは何なんでヒントとなるものを。 ちなみにこれは(UNIX/C)で実行したときです。 多分WINのC++でも同じ結果は得られると思いま すが未確認で。 ・コマンドラインから因数を求めるのにargvというのが あります。これを利用して、WINから、値を入力します。 ・後キーボードから値を得るための関数にscanfがあります。あんまり推奨じゃないんですがね。 (ex.2つの値をキーボードから入力して足し算を求める) main() { int a,b; scanf ("%d %d" a,b); printf("%d + %d = %d", a, b, a+b); return 0; } まあ、使い方はPRINTFとさほど変わりません。 文字とかはポインタを使ってfgetsつかってやるの が早いかと. (構文) fgets(char *s, int n, FILE *stream); 最初の引数は文字を入れる入れ物で、charのポインタ型、 2番目は入れる文字数、3番目はキーボードがらならSTDIN になります。 多分これだけわかれば簡単にできるんでがんばってくだ さい. 後詳しい情報はしたのURLがわかりやすいですよ.
お礼
ありがとうございます。参考になります。
==== 1 ===================== #include <stdio.h> void main(void) { int n; /* 入力値 */ int cnt; /* カウンタ */ int gokei = 0; /* 加算合計 */ printf("n="); scanf("%d",&n); /* 整数値nの入力 */ for( cnt = 1; cnt <= n; cnt++ ){ /* 1~nまで繰り返す */ gokei = gokei + cnt; /* cntをたす */ } printf("1,nの合計%d\n",gokei); /* 結果出力 */ } ==== 2 ===================== #include <stdio.h> void main(void) { int n; /* 入力値 */ int cnt; /* カウンタ */ int gokei = 0; /* 加算合計 */ printf("n="); scanf("%d",&n); /* 整数値nの入力 */ for( cnt = 1; cnt <= n; cnt++ ){ /* 1~nまで繰り返す */ gokei = gokei * cnt; /* cntをかけていく */ } printf("1,nの合計%d\n",gokei); /* 結果出力 */ } ==== 3 ===================== #include <stdio.h> void main(void) { int n; /* 入力値 */ int cnt; /* カウンタ */ int gokei = 0; /* 加算合計 */ for( cnt = 1; cnt <= 10; cnt++ ){ /* 1~10まで繰り返す */ printf("n="); scanf("%d",&n); /* 整数値nの入力 */ gokei = gokei + n; /* nをたす */ } int kekka = goukei/10; printf("1,nの合計%d\n",kekka); /* 結果出力 */ } ==== 4 ===================== #include <stdio.h> void main(void) { int r,h = 0; /* 入力値 */ int V = 0; /* 結果 */ printf("r="); scanf("%d",&r); /* 整数値nの入力 */ printf("h="); scanf("%d",&h); /* 整数値nの入力 */ V = 3.14*r*r*h/3 printf("1,円錐体積 %d\n",V); /* 結果出力 */ } ============================================================ 1~4の答えです。たぶんあってると思います。 わかりにくかったらごめんなさい。 最初は難しいかもしれないけど、慣れだと思います。 頑張ってください。
お礼
1~4まででも十分です。ありがとうございます。救われました。
お礼
本当にありがとうございます。leaz024さんに感謝です。助かりました。