2016-02-15 90 views
-2

我想創建一個程序,提示用戶輸入班級中的學生人數,然後循環讀取那麼多姓名。一旦所有的名字都被讀入,報告哪個學生會在該行的前面,哪個學生會在該行的末尾。你可以假設沒有兩個學生有相同的名字。按字母順序顯示姓名

但是我在我的輸出程序不顯示字符串的右比較...

以下是我的輸出。 ...請幫幫我。

Enter the number of students(1 - 25): 5 
Enter the name: ali 
Enter the name: hamxa 
Enter the name: hassan 
Enter the name: anjum 
Enter the name: java 
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠java ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠java 
Press any key to continue . . . 

以下是我的代碼

#include<iostream> 
#include<cstring> 
using namespace std; 

int main() 
{ 
    const int size = 10; 
    char name[size], largest[size], smallest[size]; 
    double num; 

    do 
    { 
     cout << "Enter the number of students(1 - 25): "; 
     cin >> num; 
    } while (num < 1 || num > 25); 

    cin.ignore(); 
    for (int i = 0; i < num; i++) 
    { 
     cout << "Enter the name: "; 
     cin.getline(name, size); 
     if (strcmp(name, largest) > 0) 
     { 
      largest[size] = name[size]; 
     } 
     if (strcmp(name, smallest) < 0) 
     { 
      smallest[size] = name[size]; 
     } 

    } 

    cout << largest << " " << smallest << endl; 

    return 0; 
} 
+0

這是C僞裝成C++。它也看起來像功課似的懷疑。我已經適當修改了你的問題標籤,直到代碼改變爲反映C++。 – Casey

+2

@Casey這不是C語言,不會用C編譯器編譯,也不是跟隨C標籤的人可能有興趣回答這個問題。我會回滾你的不正確的編輯。 – Lundin

+2

@Casey這是C++而不是C,這是事實。請堅持事實。這可能是寫得不好的C++,但是這仍然是C++。 –

回答

0

首先,您需要更改largest[size] = name[size];strcpy(largest, name);

largest[size] = name[size]沒有意義,因爲largest[i]等於(I + 1)個符號,在你的情況下,size = 10,largest是10長,所以largest[size]指向不存在的第11個符號。

strcpy將一個字符串複製到另一個字符串。

其次,您必須爲smallestlargest設置默認值。因爲默認char[]等於╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠等垃圾。

char largest[size] = ""; 
char smallest[size] = "zzzzzzzzz"; 

所以,你的代碼應該類似於此

const int size = 10; 
char name[size]; 
char largest[size] = ""; 
char smallest[size] = "zzzzzzzzz"; 
double num; 

do 
{ 
    cout << "Enter the number of students(1 - 25): "; 
    cin >> num; 
} while (num < 1 || num > 25); 

cin.ignore(); 
for (int i = 0; i < num; i++) 
{ 
    cout << "Enter the name: "; 
    cin.getline(name, size); 
    if (strcmp(name, largest) > 0) 
    { 
     strcpy(largest, name); 
    } 
    if (strcmp(name, smallest) < 0) 
    { 
     strcpy (smallest, name); 
    } 
} 

cout << largest << " " << smallest << endl; 
0

對於初學者來說是沒有意義的聲明變數num具有類型double

double num; 

我認爲名字的數量不能是分數。

最好是將其聲明爲具有至少型size_t

size_t num; 

的字符數組largestsmallest不是最初初始化。因此,在這些條件下,如果語句也沒有意義

if (strcmp(name, largest) > 0) 
//... 
if (strcmp(name, smallest) < 0) 

您應該初始化「空」的字符串數組或複製到他們在主字符串循環。

數組沒有複製賦值操作符。您必須將一個數組的元素複製到另一個數組中。對於包含字符串的字符數組,您可以使用標準C函數strcpy

而且這些語句

largest[size] = name[size]; 
smallest[size] = name[size]; 

嘗試一個陣列中不存在的單元分配到另一個。它們不會將字符串從一個數組複製到另一個數組中。

該程序可查找例如以下方式

#include <iostream> 
#include <cstring> 

int main() 
{ 
    const size_t SIZE = 10; 
    char name[SIZE], largest[SIZE], smallest[SIZE]; 
    size_t num; 

    do 
    { 
     std::cout << "Enter the number of students(1 - 25): "; 
     std::cin >> num; 
    } while (num < 1 || num > 25); 

    std::cin.ignore(); 

    for (size_t i = 0; i < num; i++) 
    { 
     std::cout << "Enter the name: "; 
     std::cin.getline(name, SIZE); 

     if (i == 0) 
     { 
      std::strcpy(largest, name); 
      std::strcpy(smallest, name); 
     } 
     else if (std::strcmp(largest, name) < 0) 
     { 
      std::strcpy(largest, name); 
     } 
     else if (std::strcmp(name, smallest) < 0) 
     { 
      std::strcpy(smallest, name); 
     } 
    } 

    std::cout << largest << " " << smallest << std::endl; 

    return 0; 
}  

它的輸出可能看起來像

Enter the number of students(1 - 25): 5 
Enter the name: ali 
Enter the name: hamxa 
Enter the name: hassan 
Enter the name: anjum 
Enter the name: java 
java ali