• ベストアンサー

配列のプログラム作成

【質問】 次の処理を行うプログラムを作成します。 (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); }

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

  • ベストアンサー
回答No.2

  #include <stdio.h> int func(int *dat, int i) { if(!i) return dat[i] = 0; if(i == 1) return dat[i] = 1; return dat[i] = func(dat, i - 1) + func(dat, i - 2); } void print(int *dat, int i) { if(!i){ printf("%d\n", dat[i]); return; } print(dat, i - 1); printf("%d\n", dat[i]); return; } int main(void) { int dat[10]; func(dat, 9); print(dat, 9); return 0; }  

その他の回答 (3)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

関数分け、エラーチェックなど C言語でやったほうが良い基本的な部分を追加してみるとか。 #include <stdio.h> #define MAXARRAYLEN (10) typedef enum {  OK = 0,  NG_ARRAY,  NG_SIZE, }ret_e; static char* errmsg[] ={  "Success.",  "Invalid Array.",  "Invalid Size.", }; ret_e init_dat( int *dat, size_t size ) {  if( !dat ){   return NG_ARRAY;  }  if( size < 2 ){   return NG_SIZE;  }  dat[0] = 0;  dat[1] = 1;  return OK; } ret_e calc_dat( int *dat, size_t size ) {  size_t i;  if( !dat ){   return NG_ARRAY;  }  if( size < 2 ){   return NG_SIZE;  }  for (i=2; i<size; i++) {   dat[i] = dat[i-2] + dat[i-1];  }  return OK; } ret_e print_dat( int *dat, size_t size ) {  size_t i;  if( !dat ){   return NG_ARRAY;  }  if( size < 2 ){   return NG_SIZE;  }  for (i=0; i<size; i++) {   printf ("dat[%2d] = %2d\n", i, dat[i]);  }  return OK; } int main( int argc, char* argv[] ) {  ret_e ret;  int dat[MAXARRAYLEN];  ret = OK;  ret = init_dat( dat, MAXARRAYLEN );  if( ret!=OK ){  fprintf( stderr, "init_dat() faild, %s\n", errmsg[ret] );   return 1;  }  ret = calc_dat( dat, MAXARRAYLEN );  if( ret!=OK ){   fprintf( stderr, "calc_dat() faild, %s\n", errmsg[ret] );   return 2;  }  ret = print_dat( dat, MAXARRAYLEN );  if( ret!=OK ){   fprintf( stderr, "print_dat() faild, %s\n", errmsg[ret] );   return 3;  }  return 0; } この様な共通でやったほうが良いものは、 このプログラムに限らず、これからの物にも反映できますので、 いままでにもらったアドバイスを参考に、 自分で別解答を考えてみてはどうでしょう?

回答No.3

   ちょっと訂正 void print(int *dat, int i) { if(i < 0) return; print(dat, i - 1); printf("%d\n", dat[i]); return; }  

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

そのプログラムが一番普通だとは思いますが。 #include <stdio.h> #include <math.h> int main(void) {  int i, dat[10];  for (i=0; i<10; i++) {   dat[i] = 1.0/2.23607 * (pow(1.618034, i) - pow(-1.618034, -i)) + 0.5;  }  for (i=0; i<10; i++) {   printf ("dat[%2d] = %2d\n", i, dat[i]);  }  return (0); } とか。

関連するQ&A

  • 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); }

  • 一次元配列についてです

    配列matを以下の様に宣言し、連続した3つの数の和を順に書き出すプログラムを作成しています。が、条件式とprintfの出力の仕方が全く解りません。この二つが解る方、教えて頂けませんか。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { } printf("\n"); return(0); }

  • 二次元配列に関する質問です。

    一次元配列はわかるのですが二次元配列になると、わからない時があります。 <ソース> #include<stdio.h> int main() { int dat[2][5]={1,2,3,4,5,6,7,8,9,10}; int i; int j; for(i=0;i<2;i++){ for(j=0;j<5;j++){ printf("dat[%d][%d] %d\n",i,j,dat[i][j]); } } return 0; } このプログラムでわからないのは、 int dat[2][5]={1,2,3,4,5,6,7,8,9,10};の部分です。 普段は、int dat[2][5]={{1,2,3,4,5}, {6,7,8,9,10}, }; という使い方をしているのですが・・・。 どうちがうのでしょうか?

  • 一次元配列の添え字の出力について

    配列matを以下のように宣言し、要素の値が2の倍数、または3の倍数ならば、その添え字を書き出すプログラムを作成しています。が、どうにも上手くいかなくて困ってます。条件式に誤りがあるのだと思いますが、解る方、何処が間違っているのか教えてください。 すぐに回答が欲しいです。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { if(mat[i]/ 2==1 || mat[i]/ 3==1){ printf("%d",i); } } printf("\n"); return(0); }

  • プログラム作成が出来ません

    プログラム作成の課題でエラーが出て進めません (1)~(3)までだけなら作成できるのですがどうしても(4) を表示させることができません^^; (1)3~99までの奇数を7*7の2次元配列に読み込み表示 (2)(1)の配列の行と列を入れ替えたものを表示 (3)全要素の平均 (4)要素の中から9の倍数を選び出し表示 添削よろしくお願いします。 #include <stdio.h> main() { int a[7][7]; int i,j,ave,sum; int c; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { a[i][j] =3+(j*2)+(i*14); } } for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { for(c=0; c<49; ++c) { if((3+(j*2)+(i*14))%9==0) { c=3+(j*2)+(i*14); } } } } sum=0; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { sum=sum+a[i][j]; } } ave=sum/7/7; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[i][j] ); } printf( "\n" ); } printf("\n"); for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[j][i] ); } printf( "\n" ); } printf("\n"); printf("average=%d\n",ave); printf("\n"); for(c=0; c<49; ++c) { printf("%d",c); } } 長々と失礼しました・・・

  • ポインタと配列 助けてください

    #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 0}; int i, *ptr; ptr = ######; while (*ptr != 0){ ######; ######; }      for (i = 0; i < 5; i++) printf("a[%d]=%2d &a[%d]=%p\n", i, #####,i, #####); putchar('\n'); ptr = ######; for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", ####, ####); ####; } printf("\n"); return (0); } 一次元配列a[]の一番目の要素以外を0にするプログラム(ただし、最後の要素は0)を作成したいのですが、#の部分に何をあてはめたらいいかわかりません。 助けてください。

  • プログラミング 配列 合計

    配列の要素に値を読み込んで表示させるプログラムは 1#include <stdio.h> 2 3int main(void) 4{ 5 6 int i; 7 int vc[5]; 8 9 for (i = 0; i < 5; i++) 10 vc[i] =i + 1; 11 12 for(i = 0; i < 5; i++) 13 printf("vc[%d] = %d\n", i, vc[i]); 14 15 return (0); }でこれを書きなおして配列の値を合計するプログラムはどういうプログラムになるか教えていただけませんか?

  • 配列の和を求めるプログラム

    キーから入力したデータを配列に入力した後、その和を求めるプログラムを作成したいのですが、プログラミング初心者の私にはさっぱりわかりません。 和を求めたいのに平均値が出てきてしまいます。 どこが間違っているのか教えてください。 #include <stdio.h> float data[5]; float total(int max); void main(void) { int cnt = 0; float d; printf("please input a data: "); scanf("%f", &d); while((cnt < 5) && (d > 0.0)) { data[cnt] = d; cnt++; printf("please input a data: "); scanf("%f", &d); } printf("total data: %5.2f\n", total(cnt)); } float total(int max) { int i; float total = 0.0; for(i = 0; i < max; i++) { total += data[i]; } return total / max; }

  • 二次元配列の対各成分を書き出すプログラムについて

    実行結果が3,5,7を書き出すプログラムを作成したいです。1,5,9を書き出す(以下のプログラム)を書き出すものは出来たのですが、3,5,7を書き出すプログラムが解りません。誰か解る方、教えて下さい。 #include<stdio.h> int main(void){ int i,mt[3][3]= {{1,2,3}, {4,5,6},     {7,8,9}}; for(i=0;i<3;i++){ printf("%d",mt[i][i]); } printf("\n"); return(0); }

  • 配列の初期化に関する質問です

    配列を初めにAB[10]={0,1,・・・・,0}のように宣言すればちゃんと動くのですが, int l_AB=10; としてからAB[l_AB]={0,1,・・・・,0}とすると「配列初期化子内の要素が多すぎます」となりコンパイルできません。自分には何が違うのかよくわかりません。出来ないのが普通なのでしょうか? #include<stdio.h> #include<stdlib.h> int main() { int l_AB = 10; int AB[l_AB]={0,1,1,1,1,0,1,1,1,0}; int i=0; for(i=0;i<l_AB;i++){ printf("%d",AB[i]); } }

専門家に質問してみよう