質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

3回答

1329閲覧

コマンドライン引数として読み込み、標準出力に表示するプログラムを作成したい

pickasound

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2021/11/15 19:47

編集2021/11/16 14:37

前提・実現したいこと

コマンドライン入力に20と入力した場合に 標準出力に83621143489848422977と出力されることを求めています。

「コマンドライン入力」に正の整数値 n を入力すると,動的な配列を生成し,n 桁以下のフィボナッチ数で最大のもの計算して画面上(標準出力)に表示するプログラムを作成。

発生している問題・エラーメッセージ

実行時間が3秒を超えました。

該当のソースコード

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *a, *b, *c; int i, n, na, nb, nc, r; if (argc != 2) { printf("usage: %s number_of_digits\n", argv[0]); return 1; } n = atoi(argv[1]); if(n < 1) { puts("number of digits should be greater than 1"); return 1; } a = calloc(n+1, sizeof (char)); b = calloc(n+1, sizeof (char)); c = calloc(n+1, sizeof (char)); if ((a == NULL) || (b == NULL) || (c == NULL)) { printf("cannot allocate memory.\n"); exit(1); } a[0] = 0; b[0] = 1; na = nb = 1; for (; nb <=n;){ r = 0; for (i= 0; i != nb; i++) { r = a[i] + b[i] + r; c[i] = r % 10; r = r / 10; } if (r == 1) { c[i] = 1; nc = nb + 1; } else { nc = nb; } for (i = 0; i !=nb; i++) a[i] = b[i]; for (i = 0; i !=nc; i++) b[i] = c[i]; na = nb; nb = nc; } for (i = na - 1; i>=0; i--) printf("%d", a[i]); printf("\n"); free(a); free(b); free(c); return 0; }
ソースコード ```C ### 試したこと 以下、プログラムを入れてみたが、エラーメッセージが出た。 + if (argc != 2 || (n = atoi(argv[1])) < 1) return 1; 以下を追記 nc = nb + 1;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/11/15 23:53

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
pickasound

2021/11/16 03:33

修正してみましたが、いかがでしょうか。ご確認お願いします。
BeatStar

2021/11/16 09:51

エラ―メッセージぐらい読みましょう。 エラーメッセージは暴言や罵声ではありません。 コンパイラやインタプリタ等からのメッセージです。 つまり、今の状態は『相手の話を聞かずに自分で早合点とかして暴走しているだけ』です。 そんな人はコミュニケーションなんて取れませんよね。 プログラミングは「機械とのコミュニケーション」です。 まずはメッセージぐらい読みましょう。
guest

回答3

0

コマンドライン入力の問題ではありません。
ソースコード上で、na,nb,ncを増やしているところがどこにもないため、いくらループを回してもnbが20を超えることはありません。

投稿2021/11/15 20:42

actorbug

総合スコア2429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pickasound

2021/11/16 11:44

いろいろと調べているのですが、na,nb,ncを増やす方法が分かりません。教えて頂けますと助かります。宜しくお願いします。
pickasound

2021/11/16 20:42

ご指摘頂いた部分を入力したところ、期待していた結果を得ることができました。ありがとうございました。助かりました。
guest

0

BA されていませんが解決されているようですので、本体の書き方でこんな感じもということで。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define TRUE 1 5#define FALSE 0 6 7typedef struct { 8 int l; 9 char d[0]; 10} Value; 11 12Value *vlalloc(int n, int i) { 13 Value *v = calloc(1, sizeof(Value)+sizeof(char)*n); 14 if(v == NULL) { 15 printf("cannot allocate memory.\n"); 16 exit(1); 17 } 18 v->d[0] = i; 19 v->l = 1; 20 return v; 21} 22 23void vlfree(Value *v) { 24 if(v != NULL) free(v); 25} 26 27void print(char*prompt, Value *v) { 28 printf(prompt); 29 for(int i=v->l-1; i>=0; i--) printf("%d", v->d[i]); 30 printf("\n"); 31} 32 33int max(int a, int b) { 34 return a > b ? a : b; 35} 36 37void swap(Value **a, Value **b) { 38 Value *t = *a; 39 *a = *b; 40 *b = t; 41} 42 43// a+=b 44int add(Value *a, Value *b, int n) { 45 a->l = max(a->l, b->l); 46 for(int i=0; i<a->l; i++) { 47 a->d[i] += b->d[i]; 48 if(a->d[i] >= 10) { 49 a->d[i] -= 10; 50 if(i+1 >= n) return FALSE; //overflow 51 a->d[i+1] ++; 52 a->l = max(a->l, i+2); 53 } 54 } 55 return TRUE; //success 56} 57 58int main(int argc, char *argv[]) { 59 60 int n = 20; 61 //if(argc >= 2) { 62 //n = atoi(argv[1]); 63 //} else { 64 //scanf("%d", &n); 65 //} 66 67 Value *a = vlalloc(n, 0); 68 Value *b = vlalloc(n, 1); 69 70 while(add(a, b, n)) swap(&a, &b); 71 //print("a=", a); 72 print("", b); //83621143489848422977 73 74 vlfree(a); 75 vlfree(b); 76 77 return 0; 78}

投稿2021/11/17 06:20

編集2021/11/17 18:32
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

フィボナッチ数Wikiより
↑これを計算したいという事ですよね?

ご希望の回答とは違いますが、
結果がでるプログラムを作ってみました。
参考になれば...。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define MAX 20 5 6void add(char *c, char *a, char *b); //c = a + b 7void move(char *a, char *b); //b -> a 8void disp(char *p); 9 10int main(int argc, char *argv[]) 11{ 12 char a[MAX+1]; 13 char b[MAX+1]; 14 char c[MAX+1]; 15 char d[MAX+1]; 16 17 memset(a, 0, sizeof(a)); 18 memset(b, 0, sizeof(b)); 19 memset(c, 0, sizeof(c)); 20 memset(d, 0, sizeof(d)); 21 22 a[0] = 1; 23 24 while (strlen(d) <MAX) { 25 26 add(d, b, c); //b+cを一時的にdにセット 27 28 add(c, a, b); //c = a + b 29 move(b, a); //aをbに移動 30 move(a, d); //dをaに移動 31 32 memset(d, 0, sizeof(d)); 33 add(d, d, a); //d=a+b+c 34 add(d, d, b); 35 add(d, d, c); 36 37 disp(d); 38 } 39 return 0; 40} 41 42void add(char *c, char *a, char *b) 43{ 44 char n[MAX + 1]; 45 int i, r; 46 47 memset(n, 0, sizeof(n)); 48 r = 0; 49 50 for (i=0; i<MAX; i++) { 51 r = a[i] + b[i] + r; 52 n[i] = r % 10; 53 r = r / 10; 54 } 55 n[i] = r; 56 57 memcpy(c, n, sizeof(n)); 58} 59 60void move(char *a, char *b) 61{ 62 memcpy(a, b, MAX); 63 memset(b, 0, MAX); 64} 65 66 67void disp(char *p) 68{ 69 int i=0; 70 71 for (i=MAX-1; i>=0; i--) { 72 printf("%d", p[i]); 73 } 74 printf("\n"); 75}

投稿2021/11/16 15:22

編集2021/11/16 22:40
uroncha

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問