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

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

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

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

Q&A

解決済

4回答

1264閲覧

実行できないので添削をお願いしたいです

BOSS723

総合スコア35

C

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

1グッド

1クリップ

投稿2016/07/12 04:54

x座標上に複数の長方形のビルがあったとき、それらでできるシルエットを答える問題なのですが...
入力1行目が1 11 5だとしたら座標1から5まで、高さ11のビルがあることを表しています。

例で下のように入力すると
1 11 5
2 6 7
3 13 9
12 7 16
14 3 25
19 18 22
23 13 29
24 4 28

出力は
1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0
となるようにしたいです。
イメージは下のようになります。
![イメージ説明

自分でも一応コード書いてみたのですが...

C

1#include <stdio.h> 2#define SIZE 10000 3 4int hi[SIZE]; 5 6int main(void) 7{ 8 int i, L, H, R, maxR = 0; 9 10 while (scanf("%d %d %d", &L, &H, &R) == 3) { 11 for (i = L; i < R; i++) { 12 if (H > hi[i]) 13 hi[i] = H; 14 } 15 if (R > maxR) 16 maxR = R; 17 } 18 19 for (i = 1; i < maxR; ++i) 20 if (hi[i] != hi[i - 1]) 21 printf("%d,%d ", i, hi[i]); 22 printf("%d \n", maxR); 23 return 0; 24}

なんかよくわからなくなってきたので添削お願いします(T ^ T)

mondaminZ👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

こんにちは。

ロジックは正しいように見えますので、Visual Studio 2015でやってみたら下記が出力されました。

1,11 3,13 9,0 12,7 16,3 19,18 22,3 23,13 29

, と最後の0が異なるだけなので、ほぼ完成しているように思います。


【追記】
あ、もしかして、入力データをファイルにしてリダイレクトして読ませたら、0しか出力されないのでしょうか?
その場合は、そのファイルがUTF-8のBOM付きになってます。先頭にBOMコード3バイトが入っているのでscanf()できないということです。もしも、その場合はC言語のfscanf関数についてを参考にしてみて下さい。

投稿2016/07/12 05:51

編集2016/07/12 05:54
Chironian

総合スコア23272

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

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

BOSS723

2016/07/12 05:55

そうなのですか? 自分がコンパイルして入力を打ち込んでも出力が何も出てくれなくて... もう少し試行錯誤してみます
Chironian

2016/07/12 06:07 編集

入力の終わりはどのようにしてます? Windowsでは文字を入力したらscanf()が0を返してきてループから抜けるようです。 しかし、Enterや数字を入れている限りは、scanf()から返ってこないか、3回目の数字入力で3を返してくるかのどちらかと思います。
BOSS723

2016/07/12 06:22

入力では 1 11 5 2 6 7 3 13 9 12 7 16 14 3 25 19 18 22 23 13 29 24 4 28 としか打ち込んでいないのですがどうやったらループから抜け出せるのでしょう? 私はMacのテラタームを使っているのでそこでもやり方が違ってるのでしょうか...
BOSS723

2016/07/12 06:36

テラタームではなくターミナルでした
Chironian

2016/07/12 06:57

恐らく、E[Enter] などでも終了すると思います。Eは数字でなければほとんどなんでもよいです。
BOSS723

2016/07/12 07:22

Enterをいくら押してもただ改行されるだけで入力終了されなかったんです... Macはそういう仕様なのでしょうかね...
Chironian

2016/07/12 07:23

[Enter]だけならその通りです。 アルファベットを1文字以上入力して[Enter]を押してみて下さい。
BOSS723

2016/07/12 07:28

おぉ!なるほど! こんなやり方もあるのですね! ありがとうございます!
guest

0

あ!!すいません!
Macでは入力終了はcontrol + Dなのですね....
知らなかったので入力がいつまでたっても終わりませんでした...
いろいろ意見くださってありがとうございましたm(..)m
凡ミスすみませんでしたm(
_)m

投稿2016/07/12 06:55

BOSS723

総合スコア35

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

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

0

Ideoneで試してみたら動きましたよ。
http://ideone.com/Snae9m
終わりの方の出力が少し違ったので手直ししてみましたが。

c

1 for (i = 1; i <= maxR; i++) // <=に変えた 2 if (hi[i] != hi[i - 1]) 3 printf("%d,%d ", i, hi[i]); 4 //printf("%d \n", maxR); // コメントアウト

投稿2016/07/12 06:04

ttyp03

総合スコア16998

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

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

BOSS723

2016/07/12 06:22

手直しありがとうございます!
guest

0

データ1 11 5は「1~5まで高さ11」という意味ですよね。だとしたらこのループ

c

1for (i = L; i < R; i++) {

では、L=1、R=5だと 1~4までしか回らないので意図と異な

--修正
データ1 11 5は「1~4まで高さ11」とのこと。

投稿2016/07/12 05:25

編集2016/07/12 05:46
sharow

総合スコア1149

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

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

BOSS723

2016/07/12 05:27

あ、すいません。 座標5の手前の4まで、でした。 詳しく書いてなくてすみません
sharow

2016/07/12 05:42

そうでしたか。それならループの範囲は正しいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問