アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

 


#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;
}
 
    • good
    • 0

関数分け、エラーチェックなど


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

この様な共通でやったほうが良いものは、
このプログラムに限らず、これからの物にも反映できますので、
いままでにもらったアドバイスを参考に、
自分で別解答を考えてみてはどうでしょう?
    • good
    • 0

 


 ちょっと訂正

void print(int *dat, int i)
{
if(i < 0) return;
print(dat, i - 1);
printf("%d\n", dat[i]);
return;
}
 
    • good
    • 0

そのプログラムが一番普通だとは思いますが。



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

とか。
    • good
    • 0

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