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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2262閲覧

c言語の多重配列での出力の仕方をきれいにしたい

oinari03

総合スコア59

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/17 11:05

編集2020/07/17 12:08

したいこと

c言語を用いて以下の問題を解きたい。自分である程度やってみたが正解の出力の形にどうしてもならず。アドバイスをいただきたいです。

問題
ある配列にはある12月分の気温データが入っているので、それぞれの”月”、”気温データの中身”、”先月とのデータの差”を以下の形で出力せよ。(これを12月分)
*データの中身はソースコードに入っています。
必ずこのような配列形式でデータを代入します。データは配列にある12個のものです。

申しわけないです。今回のデータは以下に示すような配列形式になっていて出力の計算結果から見てもわかる通りで、論理的に変な内容となっています。ご指摘していただきありがとうございます。

イメージ説明

イメージ説明

自分の書いたコード

sampl.c

1 2#include <stdio.h> 3 4int main(void) 5{ 6 double tana[12] = { 7 7.7, 4.9, 8.4, 14.3, 18.2, 22.3, 24.8, 27.7, 24.2, 16.6, 9.6, 5.9 8 }; 9 10 int i; 11 int j; 12 int k; 13 int x = 11; 14 printf("month\n"); 15 16 for (i=0;i<12;i++){ 17 printf("%d",i+1); 18 printf("\n"); 19 } 20 printf("temperature\n"); 21 22 for (j=0;j<12;j++){ 23 printf("%.1f",tana[j]); 24 printf("\n"); 25 } 26 printf("change\n"); 27 28 for (k=0;k<12;k++){ 29 printf("%.1f\n",tana[k] - tana[x]); 30 x=k; 31 } 32 33 34 return 0; 35} 36

てな感じです。最初は安直に三重for分で回そうと思ったんですが出力があまりにも長くて変えました。

出力結果

month 1 2 3 4 5 6 7 8 9 10 11 12 temperature 7.7 4.9 8.4 14.3 18.2 22.3 24.8 27.7 24.2 16.6 9.6 5.9 change 1.8 -2.8 3.5 5.9 3.9 4.1 2.5 2.9 -3.5 -7.6 -7.0 -3.7

おそらく計算結果はあっていると思うのでこれをいかにうまく横並びに表示するかです。
しかもいい感じに行間も空いています。安直にすべてをfor分で3重に回してもダメなのはわかりました....

まとめ

初めにも書いたように、正解結果になるようなコードの改善点やアドバイスを教えていただきたいです。
まだまだ未熟なもので、何か至らない点があればよろしくお願いします。
どうか皆様のお力をお借りさせてもらいたいです。

変更点

\tとスペースを使って強引に中央ぞろえにしたのですが、もっときれいに
かける方法ってありませんでしょうか。

#include <stdio.h> int main(void) { double tana[12] = { 7.7, 4.9, 8.4, 14.3, 18.2, 22.3, 24.8, 27.7, 24.2, 16.6, 9.6, 5.9 }; int i; int y = 0; int x = 11; printf("month\ttemperature\tchange\n"); for (i=0;i<12;i++){ y=i; printf("%d\t %.1f\t %.1f\t",i+1,tana[i],tana[y]-tana[x]); printf("\n"); x=y; } return 0; }
month temperature change 1 7.7 1.8 2 4.9 -2.8 3 8.4 3.5 4 14.3 5.9 5 18.2 3.9 6 22.3 4.1 7 24.8 2.5 8 27.7 2.9 9 24.2 -3.5 10 16.6 -7.6 11 9.6 -7.0 12 5.9 -3.7

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

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

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

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

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

yumetodo

2020/07/17 11:28

そのtemperatureの数値の中央揃えはさいげんしないといけない部分でしょうか? あと1月のchnageを同年の12月との差分で求めているのは論理的におかしい気もしますが大丈夫ですか?
oinari03

2020/07/17 11:38

ご指摘ありがとうございます。。 中央揃えをしなくてはいけないのと、そもそも同年で差分を求めるというおかしな問題なのです....
guest

回答2

0

printf関数の使い方を確認しましょう。
2変数以上を引数に取り出力することが可能です。

例:

int year=2020,month=7,day=17; printf("%d年 %d月 %d日",year,month,day); //出力 2020年 7月 17日

参考:http://www9.plala.or.jp/sgwr-t/c/sec05.html

投稿2020/07/17 11:24

Kaleidoscope

総合スコア257

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

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

oinari03

2020/07/17 11:42

これは一つのfor分で回して複数で表示できるようにすればいいのでは?という意味でしょうか? indexをデータに関しては1から表示するのに対して、差分を求めるときにどうしてもindexの部分をいじるので、困ってしまいます。 意味が違うようでしたらもう少しアドバイスをいただけると幸いです。
Kaleidoscope

2020/07/17 11:55

「先月とのデータの差」を表すときに、昨年12月のデータは渡されていないので、1月のデータは空欄でいいです。 ですので、i=0(1月)のときに条件分岐して、データの差は表示しないようにすれば良いです。 それ以外の月は(tana[i]-tana[i-1])で先月との差が計算できます。
oinari03

2020/07/17 12:10

なるほど。そういう手も考えられるのですね!ありがとうございます。
guest

0

ベストアンサー

まあこういうことだろうか。もっと大きな数が来ると表示が崩れるからその時はまた考えないといけないけど。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 const double tana[12] = { 6 7.7, 4.9, 8.4, 14.3, 18.2, 22.3, 24.8, 27.7, 24.2, 16.6, 9.6, 5.9 7 }; 8 puts("month temperature(C) change"); 9 for (int i = 0, j = 11; i < 12; j = i, ++i) { 10 // month temperature(C) change 11 printf(" %2d %4.1f %4.1f\n", i + 1, tana[i], tana[i] - tana[j]); 12 } 13 return 0; 14}

https://wandbox.org/permlink/d9ig3WUwxOaoNgOj

投稿2020/07/17 11:56

yumetodo

総合スコア5852

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

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

oinari03

2020/07/17 12:10

ありがとうございます。
oinari03

2020/07/17 12:12

加えて申しわけないですが、for分の真ん中にi,jを二つ入れる形を初めて見たのですがどういうことが起きているのでしょうか?
yumetodo

2020/07/20 08:57

int i = 0, j = 11 は単に変数を複数同時に定義してるだけで、 j = i, ++i はoperator,は左辺の演算結果を無視して(j = iの結果jの値が返されているがそれを使わないということ)右辺を評価するという性質を使っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問