🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

2回答

1348閲覧

このコードのどこが汚いか

Mitacchi

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

0クリップ

投稿2021/01/01 04:50

とても抽象的な質問で申し訳ないのですが、自分は独学のプログラミング初心者でc++のコードを今回初めて書きました。
ですが、とても汚い書き方をしているように思えてしまうので、改善点を教えていただきたいのです。

プログラムは、txtファイルから問題と答えを読み込んでコマンドプロンプトでクイズをするといったものです。
ans.txtとqus.txtにはそれぞれ問題と答えを行で分けて書いています。
今のところ文字化けなどはなく、自分の思った通りには動いています。

自分的には、変数の初期化がうるさいところや、for文の中身がぐちゃぐちゃなところが気に入らないです。
これが最善手であれば納得しますが、
もっといい書き方があればご教授いただきたいです...!

c++

1 2#include<iostream> 3#include<fstream> 4#include<string> 5using namespace std; 6 7string qus[200]; 8string ans[200]; 9string you; 10int i = 0; 11 12 13 14int main() 15{ 16 // pemファイル読み込み 17 ifstream qifs("qus.txt"); 18 string qline; 19 20 if (qifs.fail()) { 21 std::cerr << "File Open Error" << std::endl; 22 return -1; 23 } 24 while (getline(qifs, qline)) { 25 qus[i] = qline; 26 i++; 27 } 28 29 i = 0; 30 ifstream aifs("ans.txt"); 31 string aline; 32 33 if (aifs.fail()) { 34 std::cerr << "File Open Error" << std::endl; 35 return -1; 36 } 37 while (getline(aifs, aline)) { 38 ans[i] = aline; 39 i++; 40 } 41 42 43 for (int i = 1; i < 200; i++) 44 { 45 cout << i << "." << qus[i - 1] << "\n"; 46 cin >> you; 47 if (you == ans[i - 1]) 48 { 49 cout << "〇\n"; 50 } 51 else 52 { 53 cout << "×" << ans[i - 1] << "\n"; 54 } 55 56 } 57 return 0; 58} 59

qustxt

1に勝利する 2を改善する 3を発達させる 4 5. 6. 7. 8以下200個

anstxt

1win 2improve 3develop 4 5. 6. 7. 8以下200個

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

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

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

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

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

guest

回答2

0

using namespace std;

できればコレは main() 内に置く

string qus[200];
string ans[200];
string you;
int i = 0;

グローバル空間に置かない。

string qus[200];
string ans[200];

これだと200個で頭打ちになる。

...で、僕ならこう↓書く:

C++

1#include <iostream> // cout, endl 2#include <fstream> // ifstream 3#include <string> // string 4#include <vector> // vector 5#include <utility> // pair 6 7int main() { 8 std::vector<std::pair<std::string,std::string>> qa; 9 10 { 11 std::ifstream qifs("qus.txt"); 12 std::ifstream aifs("ans.txt"); 13 if ( !qifs.is_open() || !aifs.is_open() ) { 14 return -1; 15 } 16 std::string qline, aline; 17 18 while ( getline(qifs, qline) && getline(aifs, aline) ) { 19 qa.push_back(std::make_pair(qline,aline)); 20 } 21 } 22 23 int i = 1; 24 for ( auto& qa_pair : qa ) { 25 std::string you; 26 std::cout << i << "." << qa_pair.first << " ? " << std::flush; 27 std::cin >> you; 28 if ( you == qa_pair.second ) { 29 std::cout << "〇\n"; 30 } else { 31 std::cout << "× " << qa_pair.second << std::endl; 32 } 33 ++i; 34 } 35}

投稿2021/01/01 05:31

編集2021/01/01 05:34
episteme

総合スコア16612

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

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

Mitacchi

2021/01/01 06:21

質問と答えを一緒にするのは僕も考えましたが、少しややこしくなってあきらめていました... 理解できればこちらのほうがスマートそうですね 勉強の参考にさせていただきます!回答ありがとうございました!
guest

0

ベストアンサー

指摘するなら次の通りでしょうか。

  • 変数定義をグローバルにしているのは何故ですか?必要性がないならばローカル変数として定義すべきです。
  • ループの回し方が変です。これでは最後の問題が出力されません。

c

1 for (int i = 1; i < 200; i++) { 2 cout << i << "." << qus[i - 1] << "\n";

こうすべきでは?

c

1 for (int i = 0; i < 200; i++) { 2 cout << i << "." << qus[i] << "\n";

また、問題と答えの行数が200行に満たない場合も200個のループが回りますが問題ないですか?

  • qusとansにいれるデータの行数が等しいかチェックする処理を入れるべきです。同様に200行以上のデータを受け付けないようにする処理も入れるべきです。

投稿2021/01/01 05:24

TaroToyotomi

総合スコア1448

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

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

Mitacchi

2021/01/01 05:26

漠然とした質問に回答いただきありがとうございます! 変数の定義についてもう少し考えてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問