3

最初に少し紹介:

私は初心者の C++ プログラマー (プログラミングは初めてです) で、ちょっとした乗算表の練習プログラムを書いています。このプロジェクトは、プログラミングの基礎を独学するための小さなプログラムとして始まりました。プログラミングについて学ぶにつれて、新しい機能を追加し続けています。最初は、ask for input、ループ、if-else ステートメントなどの基本しかありませんでした。しかし今では、ベクトルを使用し、ファイルの読み取りと書き込み、ディレクトリの作成などを行います。

ここでコードを確認できます: Project on Bitbucket

私のプログラムには 2 つのモードがあります。ユーザーが自分で選択できる単一の九九を練習するか、すべての九九を組み合わせて練習します。現在、両方のモードは内部でまったく異なって動作します。そして、混合モードを別のプログラムとして開発しました。これにより、開発が容易になり、既存のコードにどのように統合するかを気にする代わりに、コード自体を書くことに専念できました。

現在別の混合モード プログラムのコードの下:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <time.h> 

using namespace std;
using std::string;

int newquestion(vector<int> remaining_multiplication_tables, vector<int> multiplication_tables, int table_selecter){
  cout << remaining_multiplication_tables[table_selecter] << " * " << multiplication_tables[remaining_multiplication_tables[table_selecter]-1]<< " =" << "\n";
  return remaining_multiplication_tables[table_selecter] * multiplication_tables[remaining_multiplication_tables[table_selecter]-1];
}

int main(){
  int usersanswer_int;
  int cpu_answer;
  int table_selecter;
  string usersanswer;
  vector<int> remaining_multiplication_tables = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  vector<int> multiplication_tables(10, 1);//fill vector with 10 elements that contain the value '1'. This vector will store the "progress" of each multiplication_table.
  srand(time(0));

  table_selecter = rand() % remaining_multiplication_tables.size();
  cpu_answer = newquestion(remaining_multiplication_tables, multiplication_tables, table_selecter);
  while(remaining_multiplication_tables.size() != 0){
    getline(cin, usersanswer);
    stringstream usersanswer_stream(usersanswer);
    usersanswer_stream >> usersanswer_int;
    if(usersanswer_int == cpu_answer){
      cout << "Your answer is correct! :)" << "\n";
      if(multiplication_tables[remaining_multiplication_tables[table_selecter]-1] == 10){
       remaining_multiplication_tables.erase(remaining_multiplication_tables.begin() + table_selecter);
      }
      else{
    multiplication_tables[remaining_multiplication_tables[table_selecter]-1] +=1;
      }
      if (remaining_multiplication_tables.size() != 0){
    table_selecter = rand() % remaining_multiplication_tables.size();
    cpu_answer = newquestion(remaining_multiplication_tables, multiplication_tables, table_selecter);
      }
    }
    else{
      cout << "Unfortunately your answer isn't correct! :(" << "\n";
    } 
  }
  return 0;
}

ご覧のとおり、混合モードの newquestion 関数はまったく異なります。また、while ループには、その他の混合モード固有のコードが含まれています。

混合乗算テーブル モードを既存のメイン プログラムに統合する場合、2 つの選択肢があります。 mode) または mode == 100 (混合九九モード)。また、newquestion() 関数に if-else ステートメントを配置して、mode == 10 または mode == 100 かどうかを確認します - ユーザーが単一の乗算テーブルまたは混合乗算テーブル モードを選択して 2 を作成するかどうかを起動時にプログラムにチェックさせることができますwhile ループと 2 つの newquestion() 関数。それは次のようになります。

int newquestion_mixed(){
 //newquestion function for mixed mode
}
int newquestion_single(){
 //newquestion function for single mode
}

//initialization
if mode == 10
 //create necessary variables for single mode
 while(){
  //single mode loop
 }
else{
 //create necessary variables for mixed mode
 while(){
  //mixed mode loop
 }
}

なぜわざわざ 2 つの別々のループと関数を作成する必要があるのでしょうか。プログラムがループを実行するたびに (ユーザーが新しい質問をするたびに (たとえば、「5 * 3 =」)、ユーザーがどのモードを選択したかをチェックするのは非効率的ではありませんか? このオプションでのパフォーマンスが心配です。しかし、今日の非常に強力なプロセッサと大量の RAM を備えた、パフォーマンスがそれほど重要ではない単純なアプリケーションのパフォーマンスを気にする必要があるでしょうか? さて、先ほど言ったように、このプログラムは主に自分自身に良いコーディングスタイルを教えたり、プログラミングの方法を学んだりすることです.

2 while ループと関数のオプションははるかに効率的で、使用する CPU は少なくなりますが、より多くのスペースが使用され、コードの複製が含まれます。これもスタイルがいいのかわかりません。

基本的に私は専門家に、この種のことを処理するための最良のスタイル/方法は何かを尋ねています. また、私のコードや悪いスタイルに何か問題がある場合は、教えてください。私はまだ初心者なので、フィードバックをお待ちしています。;)

4

2 に答える 2