こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

Listとfor loopで足し算をしたい

C++初心者ですが、どうしても分かりたく、質問します。
以下が現在自分が考えるプログラムとエラーメッセージで、listとfor loopで、list a (lsta)とlist b (lstb)それぞれ3要素の1番目同士、2番目同士、3番目同士を足し算したいです。今は2番目の要素までしかしていません。エラーは恐らく、for loopの外でlist a, list bの第2要素を使えないということだと思うのですが、足し算にはそれらがfor loopの外で必要で、どうしたらよいのか分かりません。助けてください。プログラム下にエラーメッセージもコピーしました。
#include <iostream>
#include <list>
using namespace std;

int a, b;
int c;
int add(int a, int b)
{
c = a + b;
return c;
}

int main() {
list<int> lsta{ 1, 2, 3 };
auto itrA = lsta.begin();
list<int> lstb{ 2, 4, 6 };
auto itrB = lstb.begin();
add(*lsta.begin(), *lstb.begin());
cout << add(*lsta.begin(), *lstb.begin()) << endl;
if (lsta.size() > 1)
{
list<int>::iterator itA = next(lsta.begin(), 1);
cout << *itA << endl;
}
if (lsta.size() > 1)
{
list<int>::iterator itB = next(lsta.begin(), 1);
cout << *itB << endl;
}
add(*itA, *itB);
cout << add(*itA, *itB) << endl;



//for (auto itr = lsta.begin(); itr != lsta.end(); ++itr) {
// int ai
// for (auto itr = lista.begin(); itr != lstb.end(); ++itr)

return 0;
}

error codes.
1>C:\Users\yumik\source\repos\ListAdd2\ListAdd2.cpp(30,7): error C2065: 'itA': undeclared identifier
1>C:\Users\yumik\source\repos\ListAdd2\ListAdd2.cpp(30,13): error C2065: 'itB': undeclared identifier
1>C:\Users\yumik\source\repos\ListAdd2\ListAdd2.cpp(31,3): error C2146: syntax error: missing ';' before identifier 'cout'
1>C:\Users\yumik\source\repos\ListAdd2\ListAdd2.cpp(31,16): error C2065: 'itA': undeclared identifier
1>C:\Users\yumik\source\repos\ListAdd2\ListAdd2.cpp(31,22): error C2065: 'itB': undeclared identifier
1>Done building project "ListAdd2.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

投稿日時 - 2020-09-25 19:24:02

QNo.9803776

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

lstaとlstbの要素数がどちらも3の場合にループを使わずに書くとこんな感じになります。要素数のチェックは省いています。

list<int> lsta{ 1, 2, 3 };
list<int> lstb{ 2, 4, 6 };

auto itrA = lsta.begin();
auto itrB = lstb.begin();
auto valA = *itrA;
auto valB = *itrB;
cout << valA << " + " << valB << " = " << (valA + valB) << endl;
itrA = next(itrA);
itrB = next(itrB);
valA = *itrA;
valB = *itrB;
cout << valA << " + " << valB << " = " << (valA + valB) << endl;
itrA = next(itrA);
itrB = next(itrB);
valA = *itrA;
valB = *itrB;
cout << valA << " + " << valB << " = " << (valA + valB) << endl;

これをループを使う形に書き換える場合、要素数が3と決まっているなら3回実行したら終了するループを書けばいいわけですが、もっと少なかったり多かったりしても動くようにするには工夫が必要です。

投稿日時 - 2020-09-27 22:50:24

補足

いつもありがとうございます。
引き続き頑張ります。
いつか自分も初心者を助ける側に廻れたらなあ、と夢のようなことを考えています。

投稿日時 - 2020-09-28 22:03:13

ANo.2

>if文自体がlist a (lsta)の2番目の要素をとる条件を表しているので、if文の外で2番目の要素をとる方法がわかりません。

「if文の外で2番目の要素をとる」のではありません。下記のように変数itAを宣言する位置をif文の外に出して、itAの有効範囲を広げるだけです。

list<int>::iterator itA; // if文の外で変数を宣言
if (lsta.size() > 1)
{
itA = next(lsta.begin(), 1); // ここでは代入のみ
cout << *itA << endl;
}

itBについても同様に変更すれば、add(*itA, *itB);の行で出ていたコンパイルエラーは回避できます。
もっとも、コンパイルエラーが出ないこととプログラムが正しく動くことは別の話です。listの長さが2未満のときにadd(*itA, *itB);を実行しても意図した結果を得られないのでその部分も追加対応が必要になります。

2つのlistの長さが違う場合も考えられます。lstaが{ 1 }でlstbが{ 2, 4, 6 }のとき、どういう結果が欲しいですか?
A:長さが違うことは想定しない(それが原因で異常動作しても気にしない)
B:長さ0のlistまたは何らかのエラーを返す
C:短いほうに合わせて{ 3 }を返す
D:長いほうに合わせて{ 3, 4, 6 }を返す(短いほうのlistには要素として0が入っていると考える)

投稿日時 - 2020-09-26 09:26:00

ANo.1

2つのlistの要素同士を足し算しようとする前に、listの理解のために、1つのlistの要素を先頭から最後までforループで足し算するプログラムを書いてみてください。つまり、listの内容が{ 1, 2, 3 }であれば6、{ 2, 4, 6, 8, 10 }であれば30を答えるようなプログラムです。

>エラーは恐らく、for loopの外でlist a, list bの第2要素を使えないということだと思うのですが

この解釈は間違いです。

>1>C:\Users\yumik\source\repos\ListAdd2\ListAdd2.cpp(30,7): error C2065: 'itA': undeclared identifier

このエラーメッセージは、30行目の add(*itA, *itB); に書かれているitAという変数名が無効だということを示しています。itAは下記のif文の中だけがスコープ(有効範囲)になっているので、そこから抜けた30行目でitAを使うことはできません。

if (lsta.size() > 1)
{
list<int>::iterator itA = next(lsta.begin(), 1);
cout << *itA << endl;
}

このif文の外でもitAという変数を使いたければ、もっと外側のスコープで宣言する必要があります。

ついでに指摘しますと、せっかく宣言・初期化したitrAやitrBが全く使われていませんね。

投稿日時 - 2020-09-25 20:34:02

補足

前回に続き、アドバイスありがとうございます。
if文自体がlist a (lsta)の2番目の要素をとる条件を表しているので、if文の外で2番目の要素をとる方法がわかりません。サイト等あれば是非教えて下さい。

for loopで全要素を足すプログラムをまず考えた方がよい、というアドバイスに従い、明日考えて、また報告させて頂きます。

ありがとうございます。

投稿日時 - 2020-09-25 22:30:54