
x_i = cos ((PI*(2*i-1))/( 2*N )) i =1,2,...,N (見づらくてすみません)
という式を計算して、結果を出力したいのですが、コンパイルできません。
自分で書いてみたプログラムとエラーを書いておくので、どこを直せばいいか教えてください。
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
double x_i(int i, int N)
{
for (i = 1 ; i <= N ; i++) {
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
}
}
int main()
{
int i, N ;
printf("N= ");
scanf("%d", &N);
for (i = 1 ; i <= N ; i++) {
printf("x[%2d] = %f\n",i, x_i(i,N));
}
return 0 ;
}
C:\Users>gcc nnn.c
nnn.c: In function 'x_i':
nnn.c:9:16: error: lvalue required as left operand of assignment
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
^
初心者なのでできれば丁寧に教えていただけると助かります。
よろしくお願いします。
結果は、
C:\Users>a
N = 5
x[ 1] = 0.951057
x[ 2] = 0.587785
x[ 3] = 0.000000
x[ 4] = -0.587785
x[ 5] = -0.951057
という風にしたいです。
No.9ベストアンサー
- 回答日時:
>以下のプログラムで正常に動いたので、これを関数に変えればいいと思っていたのですが、うまくいかず質問させていただいてるという流れです。
・ループはコール側でやっているので関数内でやる必要はない。
・ループで結果を表示しているので配列は関係ない。
ということで…
>double x_i(int i, int N)
>{
> for (i = 1 ; i <= N ; i++) {
> x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
> }
>}
は、
double x_i(int i, int N)
{
return cos ((PI*(2*i-1))/( 2*N ));
}
になるだけなんじゃないですかね?
>int i[20]; //配列の指定の大きさ
>int N[20];
で、関数の方は
>double x_i(int i, int N)
で、コールは
>printf("x[%2d] = %f\n",i, x_i(i,N));
コールする時の第1引数と第2引数は配列を渡していますが、関数の仮引数の方と一致しません。
ということで、コンパイルエラーでしょう。
>x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
既に指摘していますし、他の方からも回答ありますが、関数コールに対して値の代入はできません。
ので、こちらもコンパイルエラーでしょう。
>Nは5と決まっているわけではなくて、20までで自分で、自由に決めれるようにしたいです。
>printf("i = ");
>scanf("%d", &N);
iなのかNなのか不明ですが…
規定の範囲の値が入力されるまでループするようにすればよいかと。
do {
printf("i = ");
scanf("%d", &N);
} while((N < 0) || (N > 20));
とか?
# scanf()でのエラー処理していませんが。(数字以外を入力すると無限ループに堕ちるとか)
No.12
- 回答日時:
昔知り合いにこんなプログラムを書く人がいたなー。
質問者はC言語とBASICを混同していませんか?
関数の戻り値は"return"で、これがC言語の決まり。
また、関数名はその関数内で変数とはならない。
double x_i(int i, int N)
{
for (i = 1 ; i <= N ; i++) {
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
}
}
先ず、 x_i(int i, int N)関数内で x_i(i, N)を出していますね。これはC言語では再帰に使用します。つまり、x_i()関数をx_i()関数内で呼び出しているのです。今回の場合、x_i()に数値を入力しようとしていますが、こんなことはC言語ではできません。
BASICだとこの書き方はx_i()に戻り値を与えることになりますが、C言語では違います。
関数の戻り値は単にreturnに戻り値を渡せばOK。return a;とすればaの値がこの関数の値として呼び出した側の関数に渡されます。
それとこの関数内でforループを入れる必要はありませんね。main()関数でforループを回しているのでx_i()関数内でのforループは不要。ついでに言っておくとC言語では一つの関数に複数の戻り値を持たせることはできない。
複数の結果が必要な場合は引数をポインタで渡して、そのポインタから得られるアドレスに数値を代入することになります。
質問者が望むC言語の関数x_i()は
double x_i(int i, int N)
{
return cos ((PI*(2*i-1))/( 2*N ));
}
これで十分。
No.11
- 回答日時:
>double x_i(int i, int N)
>{
> for (i = 1 ; i <= N ; i++) {
> x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
> }
> return 0 ; //ここにreturnがなかった
>}
『関数の戻り値に代入しようとしている。』
という点を除けば、とりあえず戻り値返しているのでコンパイルエラーにはならずに済むでしょう。
ただし、cos()の結果は捨てて「常に0は正義なのだ!!!」としているので、
x[ 1] = 0
x[ 2] = 0
x[ 3] = 0
x[ 4] = 0
x[ 5] = 0
となりますが。
何度も書いていますが、計算結果を一時保存するわけではないのですから配列はまったく無関係です。
仮に一時保存するのであれば、「20までで自分で、自由に決めれるようにしたいです。」という条件から、動的確保することになるでしょう。
# 最大値の要素数20個の配列固定でもいいですけどね。(エラー処理あるから20個固定の方が楽でしょう)
No.10
- 回答日時:
>ここも
>double x_i[ i, N]
それで…x_iというシンボルは
「配列」なんですかね?
「関数名」なんですかね?
No.6
- 回答日時:
ご回答ありがとうございます。
理解が悪くてすみません。配列の大きさの指定は読んだことがありました。
それで、変えてみたのですが、
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
int i[20]; //配列の指定の大きさ
int N[20];
double x_i(int i, int N)
{
for (i = 1 ; i <= N ; i++) {
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
}
return 0 ;
}
int main()
{
int i, N ;
printf("N= ");
scanf("%d", &N);
for (i = 1 ; i <= N ; i++) {
printf("x[%2d] = %f\n",i, x_i(i,N));
}
return 0 ;
}
で合ってますか?また何か違うところがあれば教えていただけると嬉しいです。
No.5
- 回答日時:
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
で、左辺の 「 x_i(i,N) 」というのが、文法的には「関数の呼び出し」で、
「関数の呼び出し」というのは、その値を参照することはできても代入はできない値(rvalue)です。
その rvalue に代入しようとしている、というのがエラーの内容です。
lvalue required as left operand of assignment
代入の左辺にlvalueが必要だ
まずは、 x_i という関数がどんな仕様なのか、はっきりさせましょう。
x_i = cos ((PI*(2*i-1))/( 2*N )) i =1,2,...,N
の iとNを指定して、そのときの x_iの値を求める関数、ということなら、この関数の中でループする必要は無いし、
存在しない「配列」なんて考える必要もありません。
No.4
- 回答日時:
>double x_i(int i, int N)
>{
> for (i = 1 ; i <= N ; i++) {
> x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
> }
>}
関数の戻り値?にcos()の結果を代入したいんでしょうか?
でも、return文がないので戻り値ではないですね。
どこにも配列は出てきていませんが。
ご回答ありがとうございます。
直してみたんですが、wr5さんのおっしゃってるのは
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
int i[20];
int N[20];
double x_i(int i, int N)
{
for (i = 1 ; i <= N ; i++) {
x_i(i, N) = cos ((PI*(2*i-1))/( 2*N ));
}
return 0 ; //ここにreturnがなかった
}
int main()
{
int i, N ;
printf("N= ");
scanf("%d", &N);
for (i = 1 ; i <= N ; i++) {
printf("x[%2d] = %f\n",i, x_i(i,N));
}
return 0 ;
}
で合ってますか?もし何か間違いがあれば教えていただきいです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
char型配列をint型に代入するには
-
配列の要素数に変数を入れたい...
-
C言語の課題が出たのですが自力...
-
配列要素の値の入れ替え
-
C#で配列が空かを判定するには?
-
c言語 構造体
-
C言語において、 配列要素をひ...
-
c言語
-
MFCのCArrayを使った二次元配列
-
万年カレンダーについて。
-
C言語の2次元配列 容量が大き...
-
fclose()でセグメンテーション違反
-
C言語 ファイルの指定された行...
-
define で 配列
-
コンボボックスでデフォルト値...
-
IPアドレスを配列に代入する方法。
-
C言語の配列のコピーについて
-
Borland C CSVファイル読み込み
-
順不同の問題の結果について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語の課題が出たのですが自力...
-
C#で配列が空かを判定するには?
-
構造体のextern方法
-
C言語の配列のコピーについて
-
c言語 構造体
-
C言語 数値の連続入力について
-
MFC - ダイアログボックスのPic...
-
C++DLLからC#へのコールバック...
-
配列のアドレス部
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
.NET C++で、構造体の配列をnew...
-
2番目の最大値を求める
おすすめ情報
求めたい結果なんですが、Nは5と決まっているわけではなくて、20までで自分で、自由に決めれるようにしたいです。
N = 8
x[ 1] = 0.980785
x[ 2] = 0.831470
x[ 3] = 0.555570
x[ 4] = 0.195090
x[ 5] = -0.195090
x[ 6] = -0.555570
x[ 7] = -0.831470
x[ 8] = -0.980785
N = 3
x[ 1] = 0.866025
x[ 2] = 0.000000
x[ 3] = -0.866025
このように、N=
に数字を入れると計算して出力できるようにしたいです。
説明足らずですみません。
以前、同じ目的で以下のプログラムを作成しました。
今回はこのプログラムを、関数を作成して同じように作動するようにするのが目的です。
以下のプログラムで正常に動いたので、これを関数に変えればいいと思っていたのですが、うまくいかず質問させていただいてるという流れです。
このプログラムも捕足になるか分かりませんが、書いておくので、このプログラムを関数を利用する形(私が最初に質問で書いていたプログラム)にすると、なぜうまくいかないのか、どうすればうまくいくのかなど、教えていただけるとありがたいです。よろしくお願いします。
プログラムが入らないので、次の補足に入れます。
先ほどの補足に入らなかった分のプログラムです。
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
int main()
{
int i , N ;
double x_i ;
printf("i = ");
scanf("%d", &N);
for (i = 1 ; i <= N ; i++) {
x_i = cos ((PI*(2*i-1))/( 2*N ));
printf("x[%2d] = %f\n",i, x_i);
}
return 0 ;
}
皆さんのご回答を参考にさせていただいて何とか正常に動くプログラムを作成することができました。
特にrnakamraさん、Wr5さん、kmeeさんなどの回答を参考にしてプログラムを作らせてもらいました。
皆さんご回答ありがとうございました。また、質問していたらご回答いただけると嬉しいです。
一応成果としてプログラムと結果を書かせていただきます。
入らないので、次のページに書きますね。
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
double x_i(int i, int N)
{
return cos ((PI*(2*i-1))/( 2*N ));
}
int main()
{
int i, N ;
do{
printf("N= ");
scanf("%d", &N);
}
while((N < 0) || (N > 20));
for (i = 1 ; i <= N ; i++) {
printf("x[%2d] = %lf\n",i, x_i(i,N));
}
return 0 ;
}
結果
N= 5
x[ 1] = 0.951057
x[ 2] = 0.587785
x[ 3] = 0.000000
x[ 4] = -0.587785
x[ 5] = -0.951057
N= 3
x[ 1] = 0.866025
x[ 2] = 0.000000
x[ 3] = -0.866025
N= 7
x[ 1] = 0.974928
x[ 2] = 0.781831
x[ 3] = 0.433884
x[ 4] = 0.000000
x[ 5] = -0.433884
x[ 6] = -0.781831
x[ 7] = -0.974928
Nの値も整数なら自由に入れることができました。