2015-10-23 51 views
1
#include <iostream> 
#include <algorithm> 
using namespace std; 

int main(){ 

string m; 
int n; 

cout << "How many elements would you like to sort?" << endl; 

cin >> n; //index for the array 



cout << "Enter " << n << " numbers seperated by a comma to be sorted" << endl; 

cin >> m; 

string unsortedNumbers[n]={m}; // values inputed stored as array values 
cout << m << endl; 

std::sort(m.begin() , m.end()); //sorting string m 
std::cout<< m << endl; 

} 

據我所知,代碼是錯誤的,如果你運行代碼的'字符串'正常工作,直到排序。當對大於10的數字進行排序時,它將它們分解爲1和0.所有的逗號都被排序,並說你的輸入是2,3,4,5,你的輸出看起來像是,,,, 2345。所以我的問題是如何讓用戶選擇索引大小,然後允許他們輸入的任何數字來確定要排序的變量數量?如何讓用戶輸入數組索引以及數組的值?

+1

有些東西叫'#PRAGMA',它可以打開和關閉這個動態接口。如果你想知道更多,你可以谷歌它。我和Bjarne Stroustrup的同事談了這件事。有一些數字與它相關。 –

+1

另外,您需要一個向量數組的字符串。或者一系列整數。你必須知道你想要什麼。你可以用函數重載來測試它。像 –

回答

0
FunctionOne(int &arr[]) {} 

void main() { 
    int n; 
    cout << "How many elements would you like to sort?" << endl; 

    cin >> n; //index for the array 



    cout << "Enter " << n << " numbers. Separate by <enter> to be sorted" << endl; 
#PRAGMA NUMBER 
    int arr[n]; 
    for (int m:arr) 
     cin >> m; 
    FunctionOne(&arr); 
} 

所以你沒有我們所說的意大利麪代碼,你可以把它放在一個函數中。這是很好的做法。

+0

這只是一個超載。我會修復它 –

+0

我以爲他試圖在'sort()'上做一個超載。字符串弄亂了我。 @ user4581301 –

+0

爲了完美公平,y0ur代碼非常棒。礦山只是我的。你只需要確保y0ur輸入是一個int數組,而不是一個字符串, –

1

讓用戶輸入數組的大小,然後排序,並在屏幕上打印結果的最簡單的方法就是使用這樣的

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    std::cout << "How many elements would you like to sort?" << std::endl; 
    std::size_t n; 
    std::cin >> n; //index for the array 

    std::cout << "Enter " << n << " numbers seperated by a comma to be sorted" << std::endl; 

    std::vector<char> vec; 
    vec.reserve(n + n - 1); // array size + commas 

    // get array values from user 
    std::copy_n(std::istream_iterator<char>(std::cin), vec.capacity(), std::back_inserter(vec)); 

    // remove commas 
    vec.erase(std::remove(vec.begin(), vec.end(), ','), vec.end()); 

    // sort array 
    std::sort(vec.begin(), vec.end()); 

    // print it 
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<char>(std::cout, " ")); 
    // input: 2, 3, 1 
    // output: 1 2 3 
} 
+0

你可以使用'std :: remove'來獲得更簡單的代碼。 –

+0

@NeilKirk我editted答案。謝謝 – MORTAL

2

STD辦法,我只能這樣做在一個安靜的繁瑣的方法,因爲我將字符串轉換爲char *,最後再將char *轉換爲字符串。在我看來,C++標準庫的字符串類使您能夠將字符串用作正常類型,這對用戶不會造成任何問題。因此,您可以複製,分配和比較字符串作爲基本類型,而無需擔心或擔心是否有足夠的內存或內部存儲器有效的時間。但是,這也意味着我們只能使用接口,不能做任何我們想做的事情。您知道,基於基本模板類basic_string的字符串>,並且看起來像容器而不是char *。

#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <algorithm> 
using namespace std; 

int main(){ 
    string m; 
    int n; 
    cout << "How many elements would you like to sort?" << endl; 
    cin >> n; //index for the array 
    cout << "Enter " << n << " numbers seperated by a comma to be sorted" << endl; 
    cin >> m; 


    //string c[n]={m}; 
    vector<int> unsortedNumbers; 
    const char* p=m.c_str(); 
    int i=0; 
    while(i<n){//or *p!='\0' 
     i++; 
     unsortedNumbers.push_back(atoi(p)); 
     while(*p>='0'&&*p<='9') p++; 
     if(i<n)p++; 
    } 
    //std::sort(m.begin() , m.end()); //sorting string m 
    sort(unsortedNumbers.begin(), unsortedNumbers.end()); 
    for_each(unsortedNumbers.begin(), unsortedNumbers.end(), [](int x){cout<<x<<" ";}); 
    //now we have a sorted array and its type is double[] 
    char arr[n][m.length()]; 
    for(int i=0;i!=n;i++) { 
     if(i!=n-1) sprintf(arr[i],"%d,",unsortedNumbers[i]); 
     else sprintf(arr[i],"%d",unsortedNumbers[i]); 
    } 
    m.clear(); 
    for(auto i:arr) m+=i; 
    cout<<m; 
} 
+0

我幾乎可以得到這個答案。問題:'int unsortedNumbers [n];'在C++中無效。可變長度數組在某些但不是全部的編譯器中被擴展支持。「我」是無限的,可以超過陣列的末端。忽略輸入是逗號分隔的。 – user4581301

+0

意見建議:而不是atoi,它迫使你去尋找數字的結尾,使用strtol,因爲它告訴你數字的末尾在哪裏。 – user4581301

+0

剛剛意識到一些事情。最後'p ++'int解析循環應該消除逗號。它欺騙了我,因爲在「1,2,3,4,5」中它消耗了終止的空值,你可能會猜測它的功能。 – user4581301