AKB48の推しメンをセンターにできちゃうかもしれない!? >>

C言語 プログラミング

ごめんなさい。間違いの指摘をお願いします。
関数はこのままでお願いします

/* 等比数列を求めるプログラム */

#include <stdio.h>
#include <math.h>

int main()
{
double a, b, c, result;
int n;

printf("初項を入力してください:");
scanf("%lf", &a);
printf("公比を入力してください:");
scanf("%lf", &b);
printf("項数を入力してください:");
scanf("%d", &n);

c = pow ( b, n-1 );

for (int i=0; i<n; i++){
printf("%f\n",a);
a*c;
}
return 0;
}

A 回答 (5件)

No.4 はい。

公比<>0は等比数列の大前提です。
powとforを理解するための実習問題に、業務システムを開発する時のような値チェックは
本来理解すべき箇所を見付けづらくする害悪ですので入れていません。
    • good
    • 0

公比に 0 を入れるとアウトになる可能性は理解できていますよね>#3.

    • good
    • 0

間違いの指摘というよりは、途中で力尽きた感じがしましたので、


できるだけシンプルな形で、動作するものにしました。
(こちらでは、scanfをscanf_sに変更の上、Visual studio 2017で動作確認済)

以下がそちらで動作しましたら、プログラムを見比べて頂いて、
おかしかった箇所に気づいて下さればと思います。

/* 等比数列を求めるプログラム */

#include <stdio.h>
#include <math.h>

int main()
{
double a, b;
int n;

printf("初項を入力してください:");
scanf("%lf", &a);
printf("公比を入力してください:");
scanf("%lf", &b);
printf("項数を入力してください:");
scanf("%d", &n);

for (int i = 0; i < n; i++) {
printf("%lf\n", a * pow(b, i));
}
return 0;
}
    • good
    • 0

・for の中, 「a*c;」ってなにをしている?


・result って変数はどこで使っている?
・公比 0, 項数 1 を入れるとアウト.
・そもそも「等比数列を求める」が意味不明.
    • good
    • 0

> 間違いの指摘をお願いします。


> 関数はこのままでお願いします

おお、最近では珍しく潔いですね(笑)。

では。
ぶっちゃけた話、forが要りません。pow関数を使う限り、繰り返しをする必要がないのです。
つまり、「プログラムがどーの」って話じゃなくって、数学的に

「等比数列の式を定義通りに組み立てれば良いだけ」

なんで、例えば

printf("%f\n", a*pow(b, n-1));

でもすれば充分でしょう。
あと、pow関数の項数(n)は基本的にdouble型なんですが・・・・ここは自動でキャストしてくれるのかな?

いずれにせよ、

1. pow関数を使う(非常にアタマの良い選択です)なら繰り返しは要らない
2. 逆に繰り返しを使え、と言う指定ならpow関数が要らない

と言う事ですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qc言語の課題がわかりません

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください。プログラムの途中経過と実行例を記しておきます。
#include<stdio.h>
int main(){
int x;
char a[256],b[256];

printf("Select Mode 1.Encryption, 2.Decryption :");
scanf("%d",&x);
if(a==1){
printf("Input passphrase :");
scanf("%s",a);
printf("Input key:");
scanf("%d",b);
}else{
printf("Input key:");
scanf("%d",b);

}

if(a==3){
printf("Invalid value\n");
}
return 0;
}
<実行例 1>
Select Mode 1.Encryption, 2.Decryption : 1
Input passphrase : password
Input key : $
TEWWSKV@
<実行例 2>
Select Mode 1.Encryption, 2.Decryption : 2
Input key : $
Code : TEWWSKV@
Decode : password
<実行例 3>
Select Mode 1.Encryption, 2.Decryption : 3
Invalid value

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください...続きを読む

Aベストアンサー

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

#include<stdio.h>
#include<string.h>

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf("Input passphrase : ");
scanf("%s", a);

printf("Input key: ");
scanf("%s", b);

} else if (x == 2) {
printf("Input key: ");
scanf("%s", b);

printf("Code : ");
scanf("%s", a);

printf("Decode : ");

} else {
printf("Invalid value\n");
return 0;
}

for (unsigned int i = 0; i < strlen(a); i++) {
r[i] = a[i] ^ b[0];
}

printf("%s\n", r);

return 0;
}

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

#include<stdio.h>
#include<string.h>

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf(...続きを読む

Qこのプログラムを教えてください。

このプログラムを教えてください。

Aベストアンサー

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* 入力直径を半径に変換 */
d = d / 100; /* 入力値の単位変換 [cm]→[m] */

printf("(1)円の円周 [m] =%f\n", 2 * PI * d );
printf("(2)円の面積 [m2]=%f\n", PI * d * d );
printf("(3)球の表面積[m2]=%f\n", 4 * PI * d * d );
printf("(4)球の体積 [m3]=%f\n", (4.0 / 3.0) * PI * d * d * d);

return 0;
}

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* ...続きを読む

QC言語について質問です。 下記のように出力する際は、どのように記述すれば良いのでしょうか? ****

C言語について質問です。
下記のように出力する際は、どのように記述すれば良いのでしょうか?
********
* スタート *
********

Aベストアンサー

printf("********\n* %s *\n********\n", "スタート");

Qこのプログラミングの問題がいくら考えてもわかりません。for文とif文を組み合わせて使うと言われたの

このプログラミングの問題がいくら考えてもわかりません。for文とif文を組み合わせて使うと言われたのですが、よろしければ教えてください

Aベストアンサー

No.1です、
念のための追加です。

日本語で「〇〇の値が××だったら、、、。そうでなかったら~。」といった表現で書かれたものが多くのプログラミング言語ではifを用いた処理になります。
同じく「〇〇の値が××になるまで、、、を繰り返す。」といった表現で書かれたものfor文やwhile文を用いた処理になります。

参考まで。

Qsleep関数の原理について

sleep関数がPC内でどういった原理で一定時間おきに動作などを行っているのか教えてください。
「Linuxカーネルがどういう働きしている」「ハードがどういう動作している」とかです。

Aベストアンサー

>一定時間おきに動作などを行っているのか
確実にsleep関数で指定した時間はお休みしているだけであり、
厳密には「一定時間おき」に動作はしません。

・LinuxはマルチタスクOSである
・一定時間(確か100Hzだったと思います)ごとにタスク切り換えを行っている

この2点がわかっていれば、
>「Linuxカーネルがどういう働きしている」
は簡単ですよね。

「sleep関数で指定した時間は、タスク切り換えで自分にCPU時間を割り当てることはしない」というだけです。

>「ハードがどういう動作している」
特段ハードでは、sleep関数実現のために何もしていません。

<おまけ>
sleep関数を呼ばなくてもマルチタスクOS上のタスクは、
 ユーザの知らないタイミングで休み休み動いている
ということです。

QC言語の課題がわかりません char型変数をa個、int型変数をb個、double型変数を4個使うと

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

char型変数をa個、int型変数をb個、double型変数を4個使うとき、全部で何バイトのメモリを使うか求めるプログラムを作成せよ。なおa,bは実行中にキーボードから入力すること、また各データ型もしくは各変数のバイト数を求める際にはsizeof演算子を使うこと。

という問題なのですが、言っている意味も分からなければどのようなプログラムを書けばよいのかもわかりません。おしえてください

Aベストアンサー

『標準入力から』が正しい表現なんでしょうけど、初学者向けだとキーボードからと書かれる…でしょう。>#3


>またキーボードで入力するということはscanfを使うということなのでしょうか

scanf()だけとは限りませんけどね。
fgets()で取り込んで、数字→数値変換するとかありますし。
が、学校とかの課題レベルならscanf()辺りが妥当でしょう。
ろくにエラー処理してなくても合格もらえるんじゃないでしょうかね。

>変数の内容ではなく個数と書いてある点がよくわからなくて…

サイズ(バイト数)の計算に、個々の変数の内容は関係ないからです。
int型の変数に0が格納されているときと10000が格納されているときでメモリ上のサイズが変動したりはしません。

QC言語でプログラミングを組みたいんですがcosの使い方がわかりません

x_i = cos((pi*(2i-1))/2N) (i=1,2,…,N)

という式で、N=5,9,17の時の値を求めたいのですが、うまくできません。

頑張ってN=5の式を作ってみたのですがうまくいきませんでした。
C言語、プログラミング初心者でわからないのでできるだけ丁寧に教えていただけると助かります。

自分で作ってみたプログラムを書いてみたので、どこが違うか、またどうすればいいかを教えていただきたいです。



#include <stdio.h>
#include <math.h>

#define iMAX 5

#define PI 3.1415926535


int main()
{

int i ;

int x[iMAX] ;

int n = ((PI * (2i-1) ) / 10) ;

double cos ( n ) ;



for (i = 1; i < 5; i++) {

x[i] = cos ( n );

}


for (i = 1; i<=5; i++) {

printf("x[%d] = %d\n",i,x[i]);

}


return 0 ;


}

x_i = cos((pi*(2i-1))/2N) (i=1,2,…,N)

という式で、N=5,9,17の時の値を求めたいのですが、うまくできません。

頑張ってN=5の式を作ってみたのですがうまくいきませんでした。
C言語、プログラミング初心者でわからないのでできるだけ丁寧に教えていただけると助かります。

自分で作ってみたプログラムを書いてみたので、どこが違うか、またどうすればいいかを教えていただきたいです。



#include <stdio.h>
#include <math.h>

#define iMAX 5

#define PI 3.1415926535


i...続きを読む

Aベストアンサー

cosの結果はdouble型です。
x_i = cos((pi*(2i-1))/2N) は、コード上、正確には
x_i = cos((pi*(2*i-1))/(2*N)) です。
N=5の場合、iを1からNまで変化させればOKです。
以下のようにしてください。
#include <stdio.h>
#include <math.h>
#define N 5
#define PI 3.1415926535
int main()
{

int i;
double x_i;
for (i = 1; i <= N; i++) {
x_i = cos((PI*(2*i-1))/(2*N));
printf("x[%d] = %f\n",i,x_i);
}
return 0;
}
-----------------------
以下、実行結果です。
x[1] = 0.951057
x[2] = 0.587785
x[3] = 0.000000
x[4] = -0.587785
x[5] = -0.951057

cosの結果はdouble型です。
x_i = cos((pi*(2i-1))/2N) は、コード上、正確には
x_i = cos((pi*(2*i-1))/(2*N)) です。
N=5の場合、iを1からNまで変化させればOKです。
以下のようにしてください。
#include <stdio.h>
#include <math.h>
#define N 5
#define PI 3.1415926535
int main()
{

int i;
double x_i;
for (i = 1; i <= N; i++) {
x_i = cos((PI*(2*i-1))/(2*N));
printf("x[%d] = %f\n",i,x_i);
}
return 0;
}
-----------------------
以下、実行結果です。
x[...続きを読む

QCのif文の書き方の質問です

『x=a & j=1 』の様に、『&』の前後に式を書くことがありますか?
使ったことがないので、ここに質問させて頂いております。
コメント、説明頂けますと大変有り難いです。

if stype=='L' then
x=a & j=1 //===
elseif stype=='M' then
x=a+(h/2) & j=2//============
else x=a+h & j=3//=================
end

以上、宜しくお願いします。

Aベストアンサー

見た目から、命令の区切りに使っているように見えますが、
公式マニュアルを確認しても ; や , はありましたが & は見つけられなかったので断言はできません。

https://help.scilab.org/docs/6.0.1/ja_JP/comma.html
https://help.scilab.org/docs/6.0.1/ja_JP/semicolon.html

QC言語、関数を用いたプログラムがうまくいきません。

C言語で、以下の漸化式について
T(0)=1
T(1)=X             のとき

T(k+1)=2XT(k)-T(k-1)    (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。


以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>

int main()
{
double x ;
int k ;
int K ;
double T[20] ;

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

T[0] = 1 ;
T[1] = x ;

for (k = 1; k < K; k++) {
T[k+1] = 2 * x * T[k] - T[k - 1];
}

for (k = 0; k <= K; k++) {
printf("T[%2d] = %f\n",k,T[k]);
}
return 0 ;
}

//結果//
k = 5
x = 2
T[ 0] = 1.000000
T[ 1] = 2.000000
T[ 2] = 7.000000
T[ 3] = 26.000000
T[ 4] = 97.000000
T[ 5] = 362.000000

k = 4
x = 3
T[ 0] = 1.000000
T[ 1] = 3.000000
T[ 2] = 17.000000
T[ 3] = 99.000000
T[ 4] = 577.000000


今回は上記のプログラムを、関数を使って作りました。
以下にプログラムの内容と結果を書きます。


#include <stdio.h>
#include <math.h>

double t[20];

double T(double x, int k)
{
if (k = 0)
{
return 1 ;
}

if (k = 1)
{
return x ;
}

else
{
return 2 * x * t[k] - t[k - 1];
}

}

int main()
{
double x ;
int k, K ;
double t[20];

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

for (k = 0; k <= K; k++)
{
printf("T[%2d] = %lf\n",k,T(x,k));
}
return 0;
}


//結果//
k = 5
x = 2
T[ 0] = 2.000000
T[ 1] = 2.000000
T[ 2] = 2.000000
T[ 3] = 2.000000
T[ 4] = 2.000000
T[ 5] = 2.000000

k = 4
x = 3
T[ 0] = 3.000000
T[ 1] = 3.000000
T[ 2] = 3.000000
T[ 3] = 3.000000
T[ 4] = 3.000000


このように、計算がうまくいきません。
何を直せばうまくいくかなど教えていただけると嬉しいです。
また、C言語、プログラミング初心者なので、わかりやすく丁寧に教えていただけると助かります。
よろしくお願いします。

C言語で、以下の漸化式について
T(0)=1
T(1)=X             のとき

T(k+1)=2XT(k)-T(k-1)    (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。


以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>

int main()
{
double x ;
int k ;
int K ;
double T[20] ;

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

T[0] = 1 ;
...続きを読む

Aベストアンサー

C言語における比較演算子は"=="
"="は代入演算子。
if文の()の中が全て"="になっていますね。これを全て"=="に変えましょう。

if(k=0)
はkに0を代入。そしてその代入した値がその式の値として評価されます。
つまり、k=0は偽として処理される。(C言語において式の値が"0"=偽)
kの値はこの時点で"0"になっている。

if(k=1)
kに1が代入される。そしてその式の値は"1"であり真(C言語において式の値が"0"以外=真)
真であるため、ifの後の{}中の式が実行される。return文なのでここでこの関数は終了される。
要するにxの値がそのまま出力される。
当然それ以下の式は実行されない。

Qc言語 立方根

プログラムは全くの初心者です。
数学をしていて級数の計算(収束が遅いので)をするために必要最低限だけ覚えようとしました。

c言語で立方根の計算をしたくてnの立方根を出すときに
n=;\\任意の数
t=pow(n,1/3);
printf("%f",t);
でしました。が、試しにn=2でした時1.000…と小数点以下が切り下げ?四捨五入?されています。そのままの値を返す方法が知りたいです。
簡単な質問ですが、すいません。
回答お願いしますm(._.)m

Aベストアンサー

1 / 3 は0ですよ。C言語の基本の基本です(^-^;

プログラム初心者ではしょうがないかもしれませんが
数学の数式とCの数式は別物。
最初は、演算に対して、演算の入力、演算結果の「型」を強く意識して
「式」を覚えるのが肝要です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング