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

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

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

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

Q&A

解決済

3回答

433閲覧

ループ抜け後、変数に足算し、再度ループを回したいです。

Moco

総合スコア7

C++

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

0グッド

0クリップ

投稿2022/07/02 23:45

編集2022/07/02 23:46

入力H × W 個の '$' で描かれた長方形を出力するプログラムを作成しています。
例ーーーーーーーーーーーーーーーーー
入力が「3 4」[5 6]の場合。
$$$$
$$$$
$$$$

$$$$$$
$$$$$$
$$$$$$
$$$$$$
$$$$$$
ーーーーーーーーーーーーーーーーーー

私が作成したプログラムが下記となります。簡単にご説明させていただきます。
まず、入力された数値を配列に格納します。そして、配列の各要素に多重ループを用いて参照し、"$"を出力しようと思った次第です。
※配列vec(300)に関してですが、配列の要素数には変数が適用できないと考え、適当に設定しました。

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main(){ 5 int l,z=0; 6 vector<int>vec(300); 7 8 while(cin>>l){ 9 vec[z] = l; 10 z++; 11 } 12 13 //cout << vec[0] << " " << vec[1]<< " " << vec[2] << " " << vec[3] << endl; 14 15 int count = 0; 16 17 for(int i=0; i<vec[count]; i++){ 18 for(int p=1; p<vec[count+1]; p++){ 19 cout << "#"; 20 } 21 cout << "#" << endl; 22 } 23 24}

最初の入力の[3 4]であれば、望んでいる出力結果となります。
しかし、次に入力される[5 6]等を上手く出力できずに困っています。
count変数を用意し、ループ終了直後に、countを+2して、再度ループを回す事ができれば、配列の次の要素にアクセスできるのではと思いました。(第1ループ:vec[0][1]を参照。→ループを抜けた後にcountに+2→第2ループ:vec[2][3]を参照。....以下ループのようなイメージです。)
しかし、ループを抜けた後に、count+2して再度ループを回すやり方がどうしても思いつきません。
何か良い方法はありますでしょうか。ご助言いただけると幸いです。何卒よろしくお願いいたします。

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

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

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

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

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

BeatStar

2022/07/03 03:25

> 配列vec(300)に関してですが、配列の要素数には変数が適用できないと考え… 違いますよ。そもそも前提が違う。確かにstd::vectorも配列ではあるけど、動的配列(C++でいうnew/deleteでやる配列)をクラスのメンバ変数として包んでメンバ関数を介してアクセスするやつです。生成時に要素数を指定する場合はコンストラクタに渡しているため、関数にとっての引数のようなものです。 だから一応生身のデータでも変数でも可能。
BeatStar

2022/07/03 03:33 編集

後、入力値はどのように渡されますか? 同じ標準入力を使うにしても、 「縦 横」をペアで一行で渡されてそれの複数行なのか、一括で「縦 横 縦 横 …」と一行で渡されるのか、縦と横をそれぞれ一行で渡される(つまりニ行で一つのペア)のかでも変わってきますよ。 やろうと思えば質問のコードをベースにして修正することは可能ですが、回りくどくなるので…
fana

2022/07/03 04:03

(すっごいどうでもいい話だけど,$って指定されているなら$を出力しようよ)
guest

回答3

0

ベストアンサー

まずvecはサイズ300など与えずに0で構築して、各数値を格納します。
あとは以下のようにcountの増分値を+2でvecサイズまでループすればよいです。

C++

1 for( int count = 0; count < vec.size(); count += 2){ 2 cout << vec[count] << " " << vec[count+1] << endl; 3 }

投稿2022/07/03 00:27

can110

総合スコア38262

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

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

Moco

2022/07/03 10:30

ご回答いただき、誠にありがとうございます。 vec(300)からvec(0)に変更して各数値を格納し、頂いたプログラムを追記して実行しましたが、エラーが発生してしまいました。 ご教示いただいた訂正箇所を、私が間違えてプログラム訂正している為だと考えられます。 もしよろしければ、私のプログラムのどの位置にどう追記すれば良いのか、教えていただきたく存じます。 お忙しいところ大変恐縮ですが、何卒よろしくお願いいたします。
can110

2022/07/04 01:09

こちらではとくにエラーなど発生しません。 エラーメッセージ、発生するコードなどを提示すると何か分かるかもしれません。
Moco

2022/07/21 01:05

お世話になっております。 返信が遅れてしまい、大変申し訳ございません。 エラーコードが「139」となった為、恐らく配列の範囲外にアクセスし、Runtime Errorが出たのかと思われます。また、vec(300)の場合、下記のコードは作動しますが、vec(0)にすると作動しません。 下記に追記したコードを提示させていただきます。 #include <bits/stdc++.h> using namespace std; int main(){ int l,z=0; vector<int>vec(0); while(cin>>l){ vec[z] = l; z++; } //cout << vec[0] << " " << vec[1]<< " " << vec[2] << " " << vec[3] << endl; int count = 0; for (int count = 0; count < vec.size(); count += 2){ for(int i=0; i<vec[count]; i++){//i<3間ループ。//1⃣i=0,p=1//i=0,p=2//i=0,p=3 for(int p=1; p<vec[count+1]; p++){//p<4間ループ。//1⃣i=0,p=1//i=0,p=2//i=0,p=3 cout << "#"; } cout << "#" << endl; } } } お忙しい中大変恐縮ですが、ご助言いただけると幸いです。何卒よろしくお願いいたします。
can110

2022/07/21 01:12

「vec[z] = l」のように代入するのではなく追加しないとだめです。 具体的にどうしたらいいか分からない場合はvectorの基本的な使い方を学んでください。
Moco

2022/07/22 01:39

「vec[z] = l」を「vec.push_back(l);」に変更したら無事に解決しました。 数多くの質問に対して、ご丁寧に解答していただき、誠にありがとうございました。大変助かりました。
guest

0

H と W が入力されるごとに、'$' で長方形を描けば、配列も vector も要らないでしょう。

C++

1#include <iostream> // cin, cout, endl 2#include <string> // string 3using namespace std; 4 5int main() 6{ 7 int h, w; 8 while (cin >> h >> w) 9 for (string s(w, '$'); --h >= 0; cout << s << endl) ; 10}

追記
なお、質問のコードを修正するとすれば、int count = 0;
for (int count = 0; count < z; count += 2) に変更するだけ。

投稿2022/07/03 05:28

編集2022/07/03 05:59
kazuma-s

総合スコア8224

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

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

Moco

2022/07/03 10:34

ご回答ありがとうございます。 配列もvectorも要らない方法がある事を知り、驚きました。簡単明瞭で、感動しております。 追記のコードに関しましても、正常に作動しました。 ご丁寧に説明していただき、誠にありがとうございました。非常に助かりました。
guest

0

for( int count=0; count<2; count++ )で回したら良いかと思います。

投稿2022/07/02 23:52

Serbonis

総合スコア581

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

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

Moco

2022/07/03 10:35

類似コードを追記させていただき、無事に作動いたしました。 非常に助かりました。ご回答いただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問