按字母顺序显示名称

displaying names in alphabetical order

本文关键字:显示 顺序      更新时间:2023-10-16

我想制作一个程序,提示用户输入班级中的学生人数,然后循环读取这么多名字。一旦读完所有的名字,就会报告哪个学生将排在队伍的最前面,哪个学生会在队伍的末尾。您可以假设没有两个学生具有相同的名字。

但是我的输出程序没有显示字符串的正确比较......

以下是我的输出。请帮助我。

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;
}

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

largest[size] = name[size]没有意义,因为largest[i]等于(i+1(个符号,在你的例子中size = 10largest的长度为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;

对于初学者来说,将变量num声明为具有类型double是没有意义的。

double num;

我认为名字的数量不能是零头。

最好将其声明为至少具有类型 size_t

size_t num;

字符数组largestsmallest最初未初始化。所以 if 语句中的这些条件也没有意义

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

您应该使用"空"字符串初始化数组,或者在主 for 循环中将字符串复制到它们。

数组没有复制赋值运算符。您必须将一个数组的元素复制到另一个数组中。对于包含字符串的字符数组,可以使用标准 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