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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1523閲覧

C言語のfor文について

tamura0425

総合スコア37

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/04/15 16:02

編集2021/04/15 18:35

C言語で以下の問題を出題されたのですが、以下で入れた配列データが、
while文を抜けると初期化されてしまい。
最後の答えを出すことができずに困っております。

大変申し訳ございませんが、どなたかご教示お願いします。

while(strInt[i] != '\0'){

※以下の配列部分にデータが入っているのは確認できるのですが、
次のwhile文でデータを取り出すと全て0になっています

ans[i] = sqrt(box*(box-num1)(box-num2)(box-num3));

最大の三角形

3本の棒の組みが与えらたとき、それの棒の端点同士を接着して三角形を作ることを考える。3本の棒の組みが何組か与えられたとき、出来上がる三角形の面積が最大になるのが何番目の組みのものであったかを調べたい。それぞれの組みの棒の長さが標準入力から与えられるとして、最大の面積を構成する棒の組みの番号を必要最小限の桁数で1行として標準出力に書き出すプログラムを作れ。最大の面積をもつものが複数あるときは、一番若い番号を書き出すこと。

#include <stdio.h> #include <stdint.h> #include <inttypes.h> #include <math.h> #include <string.h> //プログラム開始 int main(int argc, char *argv[]){ //変数定義 int strInt[1000]; int strInt2[3]; int ans[100]; int n=0; int i=0; int j=0; int num1; int num2; int num3; int x=0; int box=0; int box2=1; i=0; //標準入力値を全て配列に入れる while(scanf("%d",&n)!=EOF){ strInt[i]=n; i++; } //配列データがなくなるまでループを行う i = 0; j = 0; while(strInt[i] != '\0'){ strInt2[j] = strInt[i]; if(((i+1)%3) == 0){ num1 = strInt2[0]; num2 = strInt2[1]; num3 = strInt2[2]; box = (num1+num2+num3)/2; ans[i] = sqrt(box*(box-num1)*(box-num2)*(box-num3)); j=0; } else{ j++; } i++; } printf("%d\n",ans[0]); x=1; i=0; while(ans[i] != '\0'){ if( 0 > ans[i]){ box2 = 0; x++; i++; } else if(box2 < ans[i]){ box2 = ans[i]; x++; i++; printf("22%d\n",x); } else if(box2 == ans[i]){ box2 = ans[i]; i++; printf("33%d\n",x); } } //count=(i+1)/3; //出力 printf("%d\n",x); //プログラム終了 return 0; } コード

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

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

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

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

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

mather

2021/04/15 17:20

提示されたコードに for がありませんよ?
tamura0425

2021/04/15 17:25

失礼いたしました。
BluOxy

2021/04/15 18:18

C#の質問ではありませんからタグを外しましょう
mather

2021/04/15 18:25

今度は「以下で入れた配列データ」が何なのかわからなくなりました。 変数名を書きましょう。 また「初期化された」と考える理由はなんでしょうか、どこかの処理で期待通りの値が出てこなかったのでしょうか? 「ここで〇〇の値が取得できると思っていたが取得できない(またはエラーが表示される)」など具体的な問題点を記載しましょう。 あと、質問タイトルも修正しましょう。
takasima20

2021/04/15 18:55

とりあえず strInt に '\0' 入れてるとこないように見えますが?
kazuma-s

2021/04/16 01:12

テストに使った入力データは何ですか?
guest

回答3

0

ベストアンサー

安全面や予期しない動きを避けるため、できるだけ初期化したほうが良いと思います。
また、適当な名前をつけると混乱します。多少長くてもわかりやすい名前をつけると良いでしょう。

c

1int input_numbers[1000] = {0}; 2int triangle[3] = {0}; 3int answers[100] = {0}; 4 5int input_index = 0; // i 6int triangle_index = 0; // j 7int answer_index = 0;

他の方も指摘している通り、 ans[2], ans[5], ans[8], ... の場所にだけ値が入っており、ループが回せないのが原因です。
入力の添字 ( input_index ) と三つ組の面積の添字( answer_index )は同一ではありませんので、別にするべきでしょう。( (i - 2) / 3 などで対応できるが、わかりにくい)

投稿2021/04/16 06:13

mather

総合スコア6759

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

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

0

ans[i] = sqrt(box*(box-num1)(box-num2)(box-num3));

ここで値を入れているのだと思いますが、 iが 2,5,8,...((i+1)%3) = 0) にしか値が入らないと思います。それで、 while(ans[i] != '\0'){ i=0 の時、値は不定なのですが、0が入っていたのでは?
(なんで、文字の '\0' と比較するの? という疑問もあるが)

投稿2021/04/16 00:48

pepperleaf

総合スコア6385

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

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

0

ans[i] = sqrt(box*(box-num1)*(box-num2)*(box-num3));
ansの添え字がiとなっているのでansに思うように格納されていないんだと思います

投稿2021/04/15 19:07

編集2021/04/15 19:54
modieu

総合スコア282

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問