0

私は過去 8 時間このプログラムをいじっていましたが、どこに行けばいいのかわかりません。私のコードが外国語であることを非常に残念に思います。私は最善を尽くして英語でコメントしようとしました。ようやくデバッグできましたが、問題はほとんどありません。1) 最初の 5 行 (txt の最初の 5 行が失敗) を印刷してから、前の 5 行を再度印刷する方法は? 次の 5 つの Godfather II 、Shawshank Redemption、Leon、A Bittersweet Life、Se7en を印刷します。現在、前の 5:Memento、Godfather、Godfather II、Shawshank Redemption、Leon 2) プログラムでメニューを作成するために数字ではなく文字を使用する方法? 3) 私は本当にばかですか? 正直に答えてください。今は一休みして寝て、朝に返信を確認します。

#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

void sisend(); /*input*/
string valik(); /*choice*/
void kogukuvand(); /* the whole display of the database */
void valjumine();    /* program quit*/ 
void sisendvoivaljumine(); /*quiting with output to file or not*/
void viisjuurde(); /* input further 5 lines from the file */
void viismaha();    /* input previous 5 lines from the file*/





int main() 
{ 




         system ("title Filmide andmebaas"); /*Movie database*/
         system ("cls"); 
        int valik; 
         cout << "Vajuta klahv 'j',kui tahad naha jargmist 5 kirjet."<< endl; /* j to get extra 5*/
         cout << "Vajuta klahv 'e',kui tahad naha eelmist 5 kirjet."<< endl;  /* e for previous 5 lines */
         cout << "Vajuta klahv 'v',kui tahad lopetada programmi taitumist."<< endl; /* v for the output */
     cin >> valik; 

switch (valik)   {                   /*choice*/

          case 1:
                  viisjuurde(); 
                  break; 
          case 2:
                 viismaha(); 
                 break; 
          case 3: 

                 sisendvoivaljumine(); 
                 break; 
                 }  
                 }
void viisjuurde() 
{ 
      ifstream filmike("andmebaas.txt"); 
      int n, sum = 5;
  while (filmike >> n) {
      sum += n;

      string film; 
      string vaadatud; 
     int aasta; 
     long int hinne; 
      system ("CLS"); 
      cout << "Kogu filmide andmebaas"<<endl; 
     cout << "Film" << "  " << "Aasta" << "  " <<"Hinne"<< "  " << "Vaadatud" << endl; 
        cout << "------------------------------" << endl; 
         while (filmike>> film >> aasta >> hinne >> vaadatud)  
  { 
        cout << film << "  " << aasta << "  " << hinne << "  " << vaadatud << endl;  
  } 
      system ("pause");  
      cin.get(); 
      main(); 

  }  
}
  void viismaha() 
{ 
      ifstream filmike("andmebaas.txt"); 
      int n, sum = -5;
  while (filmike >> n) {
      sum += n;
  }
      string film; 
      string vaadatud; 
     int aasta; 
     long int hinne; 
      system ("CLS"); 
      cout << "Kogu filmide andmebaas"<<endl; 
     cout << "Film" << "  " << "Aasta" << "  " <<"Hinne"<< "  " << "Vaadatud" << endl; 
        cout << "------------------------------" << endl; 
         while (filmike>> film >> aasta >> hinne >> vaadatud)  
  { 
        cout << film << "  " << aasta << "  " << hinne << "  " << vaadatud << endl;  
  } 
      system ("pause");  
      cin.get(); 
      main(); 

  } 
void sisend() /* user input */
{ 
     string nimi; 
     int aasta; 
     long int hinne; 
     string vaadatud; 
     ofstream lisafilm("andmebaas.txt", ios::app); 
     cout <<"Sisestage filmi nimi." << endl;  /*Enter film's name */
     cin >> nimi; 
     string film;

     cout << "Sisestage filmi ilmumisaasta." << endl;  /* Enter film's year */
     cin >> aasta;     

     cout << "Sisestage filmi hinne." << endl;  /* Enter film's rating */
     cin >> hinne; 

     cout << "Kas olete filmi juba vaadanud?" << endl;  /* Has the user seen the movie already*/
     cout << "Vastake 'Jah' voi 'Ei'" << endl; 
     cin >> vaadatud; 
cout << film << "  " << aasta << "  " << hinne << "  " << vaadatud << endl;  

lisafilm<< nimi << "  " << aasta << "  " << hinne<< "  " << vaadatud << endl;  
lisafilm.close();  
main();

 cout << "Aitah kasutamast andmebaasi." << endl; 
 system("pause"); 
 cin.get (); 
} 



 void valjumine() /*quiting without output */
{  
 system("CLS"); 
 cout << "Aitah kasutamast andmebaasi." << endl; 
 system("pause"); 
 cin.get (); 
  } 
void kogukuvand()  /* the whole movie database*/
{ 
      ifstream filmike("andmebaas.txt"); 
      string film; 
      string vaadatud; 
     int aasta; 
     long int hinne; 
      system ("CLS"); 
      cout << "Kogu filmide andmebaas"<<endl; 
     cout << "Film" << "  " << "Aasta" << "  " <<"Hinne"<< "  " << "Vaadatud" << endl; 
        cout << "------------------------------" << endl; 
         while (filmike>> film >> aasta >> hinne >> vaadatud)  
  { 
        cout << film << "  " << aasta << "  " << hinne << "  " << vaadatud << endl;  
  } 
      system ("pause");  
      cin.get(); 
      main(); 

  } 
void sisendvoivaljumine() 
{ 
     int valik2; 
     system ("CLS"); 
     cout << "Vajuta klahv 'j',kui tahad salvestada kirje ja v2ljuda programmist." << endl;   /* output new movie to file and quit*/
     cout << "Vajuta klahv 'e',kui ei taha salvestada kirje ja v2ljuda programmist." << endl;  /*just quit, without any output to file*/
     cout << "Vajuta klahv 'k',kui tahad naha kogu filmide andmebaasi." << endl;  /* display the whole movie database*/
     cin >> valik2;


     switch (valik2) 
     { 


        case 1:
                 sisendvoivaljumine(); 
                 break; 
                 sisend(); 
                 break; 
        case 2:
                 valjumine(); 
                 break; 
        case 3: 
                 kogukuvand(); 
                 break; 



} 
}
4

1 に答える 1

1

いくつかのヒント:

  1. 一般的な規則に従って、コードをインデントおよびフォーマットします。これにより、読み取りとデバッグが容易になります (他のすべての人も同様です)。

  2. main() を再帰的に呼び出しています。そんなことしたらダメ。代わりに、メニュー スイッチの周りにループを使用してください。

  3. ファイルから行を読み取るフェイルセーフな方法は、getline() を使用することです。istringstream と組み合わせて、行から個々の値を読み取ります。

    ifstream infile("somefile.txt");
    string line;
    while ( getline(infile, line) ) // read infile until eof
    {
        istringstream iss(line); // create stream from line data
        string a, b, c, d;
    
        iss >> a >> b >> c >> d; // read just as from cin
        cout << a << "," << b << "," << c << "," << d << endl;
    }
    
  4. 整数を読み取る場合は、読み取りが成功したことを確認する必要があります (ファイルが読み取った時点で数字が含まれていることが確実でない場合)。

    int n;
    if (iss >> n)
    {
        // read OK
    }
    else
    {
        // read failed
        infile.clear();
        string junk;
        infile >> junk;
        cout << "ERROR: bad data was:" << junk << endl;
    }
    
  5. メニューで文字を使用するには、char データ型を使用できます。char 入力は失敗しないので、これは良い考えです:

    char choice;
    cin >> choice;
    switch (choice)
    {
        case '1':
        {
            // do something
            break;
        }
        case 'A':
        {
            // do something
            break;
        }
    }
    
  6. sisendvoivaljumineそのオプションを選択すると、 が自分自身を再帰的に呼び出すことに注意してください。メニューは無限に何度でも選択できるので、ループを使用してメニューを繰り返すことをお勧めします。

上記のトピックについて読みたいと思います。http://www.cplusplus.comを確認してください。デバッグするときは、プログラムが各ポイントで実行している行を正確に把握してください。あなたを助けるために明確なデバッグ出力を追加してください。

于 2013-03-18T02:41:54.873 に答える