0

私はC++にはかなり慣れていませんが、論理的にはこれでうまくいくはずだと思いました。

ユーザーからの入力を受け取り、配列のメモリ割り当てを設定する関数があります。

void setarraynum(){
  string mystr;
  cout<<"Please enter the size of your array: ";
  getline(cin, mystr);
  stringstream(mystr)>>arraynum;
  array = new int [arraynum];
  cout<<"\n";
}

arraynum と array は、次のように設定されたグローバルです。

int arraynum;
int * array;

次に、配列入力を受け取る関数があります。

void setarray(){
  string mystr;
  cout<<"Please enter "<<arraynum<<" numbers:\n";
  for(int n=0; n<arraynum; n++){
    getline(cin, mystr);
    stringstream(mystr)>>array[n];
  };
cout<<"\n";
}

配列番号の入力に関して問題が発生すると、配列の最初のインスタンス (array[0]) が自動的に 0 に設定されます。あたかもループがユーザーに入力を求めずに最初の反復を反復するかのように。次に、通常どおりユーザーに尋ねます。

何か案は?

ありがとう。

*編集(要求に応じて、コード全体):

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int arraynum;
int * array;
bool isin = false;
int input;
char order;

void insertionsortdesc(int a[]);
void insertionsortasc(int a[]);
void getarray(int a[]);
void isinarray(int a[], int b);

void setsearch();
void setarray();
void setarraynum();
void setorder();

int main(){

 cout<<"\n//// INPUT ////\n\n";

 setarraynum();
 setorder();
 setarray();
 setsearch();

 if(order=='a'){insertionsortasc(array);
 }else if(order=='d'){insertionsortdesc(array);};

 cout<<"//// OUTPUT ////\n\n";
 getarray(array);
 isinarray(array, input);

 return 0;
}

void setorder(){
 bool isvalid = false;

 while(!isvalid){
  cout<<"Ascending or Descending [a/d]: ";
  cin>>order;
  if(order=='a'||order=='d'){isvalid = true;
  }else{cout<<"Please enter a valid option!\n";};
 };

cout<<"\n";
}

void setarraynum(){
 string mystr;
 cout<<"Please enter the size of your array: ";
 getline(cin, mystr);
 stringstream(mystr)>>arraynum;
 array = new int [arraynum];
 cout<<"\n";
}

void setsearch(){
 string mystr;
 cout<<"Search for (int): ";
 getline(cin, mystr);
 stringstream(mystr)>>input;
 cout<<"\n";
}

void setarray(){
 string mystr;
 cout<<"Please enter "<<arraynum<<" numbers:\n";
 for(int n=0; n<arraynum; n++){
  getline(cin, mystr);
  stringstream(mystr)>>array[n];
 };
cout<<"\n";
}

void insertionsortdesc(int a[]){
 for(int n=1; n<arraynum; n++){
  int key = a[n];
  int j = n-1;
  while((j>=0)&&(a[j]<key)){
   a[j+1] = a[j];
   j -= 1;
  };
  a[j+1]=key;
 }
}

void insertionsortasc(int a[]){
 for(int n=1; n<arraynum; n++){
  int key = a[n];
  int j = n-1;
  while((j>=0)&&(a[j]>key)){
   a[j+1] = a[j];
   j -= 1;
  };
  a[j+1]=key;
 }
}

void isinarray(int a[], int b){
 for(int n=0; n<arraynum; n++){
  if(a[n] == b){
   isin = true;
   break;
  };
 };

 if(isin){
  cout<<b<<" is present in the given array.";
 }else{
  cout<<b<<" is not present in the given array.";
 };

 cout<<"\n\n";
}

void getarray(int a[]){
 cout<<"Sorted array sequence: ";
 for(int n=0; n<arraynum; n++){
  cout<<a[n]<<", ";
 };
 cout<<"\n\n";
}
4

3 に答える 3

1

パラダイムcin >> arraynum;で整数を読み取る代わりに、直接使用することを強くお勧めします。stringstream(mystr) >> arraynum;

C++ リファレンスhttp://www.cplusplus.com/reference/string/string/getline/からgetline

区切り文字が見つかった場合、それは抽出されて破棄されます。つまり、格納されず、次の入力操作がその後に開始されます。

これが問題です。@Vaughnが指摘しているように、関数で使用するcin >> order;と、入力バッファsetorderにテーリングが残ります。\n

あなたのコードから学んだ教訓は、I/O の問題に取り組むとき、関数が同じパラダイムで呼び出されることを確認することです。

于 2013-08-28T06:02:34.357 に答える
0

コードを少し変更しましたが、期待どおりに動作します。ユーザーが入力を区切る必要があるかどうか、またはどのように区切る必要があるかをユーザーに示すことをお勧めします。配列よりもベクトルを使用したいと思います。あなたはまだ配列の割り当てを解除していません-それは問題ではありませんが、別のプログラムで可能性があります。

また、cin で既に整数を取得できるのに、なぜ getline を使用するのかわかりません (コードを参照)。

#include <iostream>
#include <sstream>
#include <string>

int arraynum;
int * array;
bool isin = false;
int input;
char order;

void insertionsortdesc(int a[]);
void insertionsortasc(int a[]);
void getarray(int a[]);
void isinarray(int a[], int b);

void setsearch();
void setarray();
void setarraynum();
void setorder();

int main(){

 std::cout<<"\n//// INPUT ////\n\n";

 setarraynum();
 setorder();
 setarray();
 setsearch();

 if(order=='a'){insertionsortasc(array);
 }else if(order=='d'){insertionsortdesc(array);};

 std::cout<<"//// OUTPUT ////\n\n";
 getarray(array);
 isinarray(array, input);

 return 0;
}

void setorder(){
 bool isvalid = false;

 while(!isvalid){
  std::cout<<"Ascending or Descending [a/d]: ";
  std::cin>>order;
  if(order=='a'||order=='d'){isvalid = true;
  }else{std::cout<<"Please enter a valid option!\n";};
 };

std::cout<<"\n";
}

void setarraynum(){
 std::cout<<"Please enter the size of your array: ";
 while( !( std::cin >> arraynum ) )
 {
   std::cout << "Please enter integer!";
 }
 array = new int [arraynum];
 std::cout<<"\n";
}

void setsearch(){
 std::cout<<"Search for (int): ";
 while( !(std::cin >> input) )
 {
   std::cout << "Please enter integer!" << std::endl;
 }
 std::cout<<"\n";
}

void setarray(){
 std::ostringstream msgStream;
 msgStream << "Please enter "<<arraynum<<" numbers:";
 std::cout << msgStream.str() << std::endl;

 for(int n=0; n<arraynum; n++){
   if( !(std::cin >> array[n]) ){
     n = 0;
     std::cout << msgStream.str() << std::endl;
   }
 }
std::cout<<"\n";
}

void insertionsortdesc(int a[]){
 for(int n=1; n<arraynum; n++){
  int key = a[n];
  int j = n-1;
  while((j>=0)&&(a[j]<key)){
   a[j+1] = a[j];
   j -= 1;
  };
  a[j+1]=key;
 }
}

void insertionsortasc(int a[]){
 for(int n=1; n<arraynum; n++){
  int key = a[n];
  int j = n-1;
  while((j>=0)&&(a[j]>key)){
   a[j+1] = a[j];
   j -= 1;
  };
  a[j+1]=key;
 }
}

void isinarray(int a[], int b){
 for(int n=0; n<arraynum; n++){
  if(a[n] == b){
   isin = true;
   break;
  };
 };

 if(isin){
  std::cout<<b<<" is present in the given array.";
 }else{
  std::cout<<b<<" is not present in the given array.";
 };

 std::cout<<"\n\n";
}

void getarray(int a[]){
 std::cout<<"Sorted array sequence: ";
 for(int n=0; n<arraynum; n++){
  std::cout<<a[n]<<", ";
 };
 std::cout<<"\n\n";
}
于 2013-08-28T06:24:47.123 に答える