• 締切済み

プログラム

C言語を現在習いたての者ですが #include "stdafx.h" int main() { int i; for(i=0;i<10;++i) printf("%d %d %d\n",i,power(2,i), power(-3,i)); } power(x, n) int x,n; { int i,p; p=1; for(i=1;i<=n; ++i) p=p*x; return(p); } と、xのn乗を求めるpower関数のプログラムのようですが 教科書に記載されていた通り打ち込んでもコンパイルが通りません・・ ちなみに出るのは 'power': 定義されていない識別子です 'main': 関数に戻り値の型が指定されていません。voidを戻り値とみなし 'x' :定義されていない識別子です 'n':定義されていない識別子です '<Unknown>':関数の定義が間違っています 予期せぬEOFが発見されました でエラー5で警告1になります。 どこがダメなのか教えてください。

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.5

次の様にプログラムを修正してみました。 ---------------------------------------------------------------------- #include <stdio.h> int power(int, int); int main() {   int i;      for (i = 0; i < 10; ++i)     printf("%d %d %d\n", i, power(2, i), power(-3, i));      return 0; } int power(x, n) int x, n; {   int i, p;      p = 1;   for (i = 1; i <= n; ++i)     p = p * x;      return p; } ---------------------------------------------------------------------- 解説: >    printf("%d %d %d\n", i, power(2, i), power(-3, i)); printf()関数を使用する時は対応するヘッダファイルをインクルードして上げる必要があります。 この場合は、#include <stdio.h> が必要です。 > #include "stdafx.h" 今回使用していないようなので、削除しておきました。 >int power(x, n) >int x, n; >{ 自作の関数power()にはプロトタイプ宣言が必要です。 この場合は、int power(int, int); の部分がプロトタイプ宣言になります。 c言語では、関数が最初に呼び出される前に、プロトタイプが宣言されている必要があります。 >    printf("%d %d %d\n", i, power(2, i), power(-3, i)); にて、power()が呼び出されているので、それ以前にプロトタイプを宣言しておく事。 >  return 0; main()関数の戻り値の型がintと言う事なので、intをreturnしてあります。 main()関数は特にことわりがなければ、正常終了時に0をreturnしましょう。 エラー終了時に、エラーコードをreturnする事も出来ます。 >power(x, n) 戻り値の型が指定されてないのに、intをreturnしているので、 int power(x, n) とintをreturnする様に修正。 エラーについて、 >'power': 定義されていない識別子です power()関数がプロトタイプ宣言される前に呼び出されているので、出ているエラーと思います。 >'main': 関数に戻り値の型が指定されていません。voidを戻り値とみなし >'x' :定義されていない識別子です >'n':定義されていない識別子です こちらのエラーは未確認ですが、stdafx.hの中で何かいたずらをしているため出ているのではないでしょうか。 >int main() となっているので、main()関数の戻り値の型はintです。 >power(x, n) >int x,n; >{ x と n はここで定義されています。 >'<Unknown>':関数の定義が間違っています 何かわからない関数の定義が間違っているみたいですが、拙者宅では確認出来ませんでした。 >予期せぬEOFが発見されました {と}の対応を書き間違えた時とかによく見るエラーです。 拙者宅では、未確認ですが、これはstdafx.hがいたずらをしているんじゃないかな。 C言語の質問の際には環境を書きましょう。 拙者宅で確認した環境は: gcc (GCC) 3.4.2 (mingw-special) Windows 2000 Pro です。 ---------------------------------------------------------------------- おまけ: > power(x, n) > int x,n; > { の構文は、結構古い時代のC言語の仕様です。 最近の仕様で書き直すと、次の様になります。 ---------------------------------------------------------------------- #include <stdio.h> int power(int x, int n); int main() { int i; for(i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2, i), power(-3, i)); return 0; } int power(int x, int n) { int i, p; p = 1; for(i = 1; i <= n; ++i) p = p * x; return p; } ---------------------------------------------------------------------- power()関数と、power()関数のプロトタイプ宣言の部分が違っているのが確認できると思います。

minaraiH
質問者

お礼

古いのでとっかかえられました。ありがとうです

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

mainで使う関数のプロトタイプ宣言が無いので powerが定義されていないなどが出ます #include "stdafx.h" の次に int power( int, int ); を記述します power関数の定義部は int power( x, y ) int x, y; { } は旧形式なので 現在のコンパイラはエラーにすることが多いと思います int power( int x, int y ) {   int i,p;   p=1;   for(i=1;i<=n; ++i)    p=p*x;   return(p); } といった具合にして見ましょう

回答No.3

お使いの環境は VisualC++ だと思います。 プロジェクトを作る際に 「空のプロジェクト」 にチェックマークを入れてください。 お持ちの教科書は破り捨てて結構です。 #include "stdafx.h" ◆この行は不要です ◆stdio.h をインクルードしてください #include <stdio.h> ◆プロトタイプ宣言がありません int power(int x, int n); int main() ◆引数がありません int main(void) { int i; for(i=0;i<10;++i) printf("%d %d %d\n",i,power(2,i), power(-3,i)); ◆リターンがありません return 0; } power(x, n) ◆戻り値がありません、引数に型がありません int power(int x, int n) int x,n; ◆不要です { int i,p; p=1; for(i=1;i<=n; ++i) p=p*x; return(p); } //◆以下が修正版です。 #include <stdio.h> int power(int x, int n); int main() { int i; for(i=0;i<10;++i) { printf("%d %4d %6d\n",i,power(2,i), power(-3,i)); } } int power(int x, int n) { int i,p; p=1; for(i=1; i<=n; i++) { p *= x; } return(p); }

minaraiH
質問者

お礼

親切にどうもありがとうございます

  • t4t
  • ベストアンサー率55% (47/84)
回答No.2

//ずいぶん古い教科書をお使いかもしれませんね。 //これなら動くだろう、と直してみますので比べてみてください。 #include "stdafx.h" int power(int x, int n); int main() { int i; for(i=0;i<10;++i) printf("%d %d %d\n",i,power(2,i), power(-3,i)); return 0; } int power(int x, int n) { int i,p; p=1; for(i=1;i<=n; ++i) p=p*x; return(p); }

minaraiH
質問者

お礼

古いから違うのととっかえられました。ありがとうございました

回答No.1

その勉強に使っているテキストを直ちに捨ててください。 非常に古い流儀の書き方です。 (ついでに言えば、コンパイラは新しいもののようですね) もしかしたら、C++としてコンパイルされているのかもしれませんが。 いずれにしても、最近のCはこれとは違った書き方になっています。

minaraiH
質問者

お礼

なるほど、ありがとうございました

関連するQ&A

  • プログラムの改良。

    うまく改良できなくて困っています。 このプログラムを #include <stdio.h> #include <stdlib.h> /* データ用変数 */ struct xy {  int x;  int y; } *hil; int idx; /* ヒルベルトスキャン */ void hilbert(int n, int p, int x, int y) {  if (n>1) {   hilbert(n/2, (p+4)%8, x+(p&1)*(n/2), y+((p>>1)&1)*(n/2));   hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2));   hilbert(n/2, p, x+(~p&1)*(n/2), y+(~(p>>1)&1)*(n/2));   hilbert(n/2, 7-p, x+(~((p>>1)^(p>>2))&1)*(n/2), y+((p^(p>>2))&1)*(n/2));  } else {   hil[idx].x=x; hil[idx].y=y; idx++;  } } int main(void) {  int i,n;  /* nの入力と領域確保 */  printf("n? "); scanf("%d",&n);  if((hil=(struct xy*)malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) {   printf("malloc error\n"); return -1;  }  /* ヒルベルトスキャン */  idx=0; hilbert((1<<n),4,0,0);  /* データ表示 */  for (i=0; i<idx; i++) {   printf("%d ([d %d]\n",i,hil[i].x,hil[i].y);  }  /* 領域開放 */  free(hil);  return 0; } 実行結果はn?8 0 [0 0] 1 [0 1] ・ ・ 65534 [0 254] 65535 [0 255] と表示されます。これを buf[0]=img[hil[0].x][hil[0].y][0] buf[1]=img[hil[0].x][hil[1].y][0] ・ ・ buf[65534]=img[hil[0].x][hil[254].y][0] buf[65535]=img[hil[0].x][hil[255].y][0] と表示させたいのですがうまくできません。どこを改良すればいいでしょうか?お願い致します。 buf[]の中身は0から256*256-1を表しています。

  • C言語について

    こんばんわ。協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • C言語 関数について

    協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • 関数について

    協力お願いします。 2問あります 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • プログラム

    下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); }

  • C言語についてです。

    mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.提出するプログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述する これについて、作ってみたのですが実行できません。 どこが間違ってるか教えてください。 #include<stdio.h> int power(int m, int n); int main() { int m,n; int a,sum; printf("整数を入力してください:"); scanf("%d",&m); printf("何乗しますか?"); sum = power(n,m); printf("%dの%d乗は%dです。\n",n,m,sum); } int power(int m, int n) { int a, kotae; kotae = 1; for(a=1; a<=n; a++) kotae = kotae * m; return kotae; }

  • ポインタエラー?

    コンパイルエラーで、つまづいてます 型が合ってないというのはわかるのですが どうしたらいいのかわかりません どこを改善すればいいでしょうか 問題とソースです↓ ソースは色々てを加えたので変なものが混じってます。 関数ichi()を作成し、プログラムを完成させよ。 main内部を変更してはならない。 (見つからない場合も考慮されている事に注意せよ。) #include <stdio.h> #define MAX 10 int *ichi(int *,int); int main() { int x[MAX], i, n, *p; for (i = 0; i < MAX; ++i) { scanf("%d", &x[i]); } scanf("%d", &n); p = ichi(x, n); if (p) { printf("%d ha %d ko me ni arimashita\n", n, p-x); } else { printf("%d ha arimasen desita\n", n); } return 0; } int *cnt; int * ichi(int *x,int n) { //int cnt; //cnt = 0; while(*x){ if(*x == n){ cnt = &n; //cnt = x; //return x; return cnt; } *x++; } return NULL; }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • このプログラムの説明合っていますか?

    /* 線形探索(for文で実現)*/ #include <stdio.h> /*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/ int search(const int a[], int n, int key)    { int i;            /*iを宣言*/ for (i = 0; i < n; i++)     /*iの値を設定し宣言*/ if (a[i] == key)       /*iにkeyで入力*/ return (i); /* 探索成功 */ return (-1); /* 探索失敗 */ } int main(void)          /*main関数*/ { int i, ky, idx;/*i,ky,idxを宣言*/ int x[7]; /*xは配列で7つの数字を入れられる*/ int nx = sizeof(x) / sizeof(x[0]);/*配列を宣言*/ printf("%d個の整数を入力してください。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d]:", i); scanf("%d", &x[i]); }printf("探す値:"); scanf("%d", &ky); idx = search(x, nx, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); return (0);      /*0の数字で戻る*/ } 1行ずつ理解したいのですが分からない個所多いんです。 分からないの文は説明が書いてないので教えてください。

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

    C言語のプログラミングについて質問です。 入力されたデータの配列とデータ数を渡すと配列に格納された値を逆順にして、格納し直す関数reverse関数を書き結果を出力せよ、というものなのですが下のように書いたのですが、うまく作動しません。どこがいけないのでしょうか...?教えていただきたいです。 #include <stdio.h> void reverse(int *data[], int n); #define MAX 100 int main() { int data[MAX]; int n, i; scanf("%d", &n); if (n >= MAX) n = MAX; for (i = 0; i < n; i ++){ scanf("%d", &data[i]); } reverse(data, n); for (i = 0; i < n; i ++) { printf("%d\n", data[i]); } return 0; } void reverse(int *data[], int n) { int c, i; for (i = 0; i < n; i ++) { c = *data[i]; *data[i] = *data[n - (i + 1)]; *data[n - (i + 1)] = c; } }