Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不确定我的排序算法出了什么问题

不确定我的排序算法出了什么问题
EN

Stack Overflow用户
提问于 2019-07-14 19:33:53
回答 1查看 50关注 0票数 0

我一直在尝试使用c字符串对输入的数据执行排序。到目前为止一切顺利,除了在案例3和案例4中,也就是排序和显示排序的数据,输出并不是预期的。显示的排序数据的输出只给出了

0 0 0。。这是我第一次使用c-string,我仍然不太熟悉structs的概念。如果有人有替代方法,或者知道我的代码在案例3/4中有什么问题,请让我知道。谢谢

下面是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
using namespace std;

struct sPlayer {
    char lname[20];
    char fname[20];
    int birthmonth;
    int birthday;
    int birthyear;
};
int main()
{

    int choice;
    sPlayer players[10];
    sPlayer sortedData[10];

    while (true) {
        cout << "Choose an option: " << endl;
        cout << "1 - Input data, 2 - display original data, 3 - 
            sort data by last name,\n4 - display sorted data,
            5 - search by
                    last name,\n6 - display goodbye message and exit the program " << 
            endl;

        cin >> choice;
        switch (choice) {
        case 1:

            cout << "Enter data for 10 soccer players " << endl;
            cout << "Enter in order: Last name, first name,(as integers) birth month, birthday, birth year, ";
            cout << "separated by a space. Press [ENTER] to enter next player data. " << endl;

            for(int i = 0; i < 10; i++)
            {
                cin >> players[i].lname;
                cin >> players[i].fname;
                cin >> players[i].birthmonth;
                cin >> players[i].birthday;
                cin >> players[i].birthyear;
            }
            break;

        case 2:
            cout << "Unsorted data: " << endl;
            for (int i = 0; i < 10; i++) {
                cout << players[i].lname << " "
                     << players[i].fname << " " << players[i].birthmonth;
                cout << " " << players[i].birthday << " " << players[i].birthyear << endl;
            }
            cout << endl;
            break;

        case 3:
            sortedData[10] = players[10];
            for (int i = 0; i < 9; i++) {
                for (int j = i + 1; j < 10; j++) {

                    if (strcmp(sortedData[i].lname, sortedData[j].lname) > 0) {
                        char tempLastName[20];
                        char tempFirstName[20];
                        int tempBirthmonth;
                        int tempBirthday;
                        int tempBirthyear;

                        strcpy(tempLastName, sortedData[i].lname);

                        strcpy(sortedData[i].lname, sortedData[j].lname);

                        strcpy(sortedData[j].lname, tempLastName);

                        strcpy(tempFirstName, sortedData[i].fname);

                        strcpy(sortedData[i].fname, sortedData[j].fname);

                        strcpy(sortedData[j].fname, tempFirstName);

                        tempBirthmonth = sortedData[i].birthmonth;

                        sortedData[i].birthmonth = sortedData[j].birthmonth;

                        sortedData[j].birthmonth = tempBirthmonth;

                        tempBirthday = sortedData[i].birthday;

                        sortedData[i].birthday = sortedData[j].birthday;

                        sortedData[j].birthday = tempBirthday;

                        tempBirthyear = sortedData[i].birthyear;

                        sortedData[i].birthyear = sortedData[j].birthyear;

                        sortedData[j].birthyear = tempBirthyear;
                    }
                }
            }
            break;

        case 4:
            cout << "Sorted data: " << endl;

            for (int i = 0; i < 10; i++) {
                cout << sortedData[i].lname << " 
                                               " << sortedData[i].fname << "
                                               " << sortedData[i].birthmonth << "
                                               " 
                     << sortedData[i].birthday << " " << sortedData[i].birthyear << endl;
            }
            cout << endl;
            break;

        case 5:
            char searchString[20];
            while (true) {
                cout << "Enter one or more 
                        starting letters of the last name(enter '//' to quit this option)
                    : " << endl;
                    cin
                    >> searchString;

                if (strcmp(searchString, "//")
                    == 0)
                    break;
                else {
                    int length = strlen(searchString);

                    strcat(searchString, "xx");
                    bool notFound = true;

                    for (int i = 0; i < 10; i++) {
                        if (strncmp(players[i].lname, searchString, length) == 0) {
                            cout << players[i].lname << " " << players[i].fname << " " << players[i].birthmonth << " " << players[i].birthday << " " << players[i].birthyear << endl;

                            notFound = false;
                        }
                    }
                    if (notFound) {
                        cout << "Not 
                                found." << endl;
                    }
                }
            }
            break;

        case 6:
            cout << "Good Bye " << endl;
            break;

        default:
            cout << "Invalid Option , Try again" << endl;
        }
        if (choice == 6)
            break;
    }

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2019-07-14 21:45:53

将大问题分成几个小问题通常更好。我建议使用子函数。

而且,您应该使用C++的STL和算法。这非常有帮助。你会看到的。不要使用像char lname[20]sPlayer players[10];这样的普通数组。请使用STL容器。它们可以增长,也可以调整大小。它还可以极大地减少复制工作。

使用面向对象的方法。数据和方法应该在一个类中。sPlayer知道如何打印和阅读。因此,将这些方法添加到您的结构中。

你应该使用算法。比如std::copy。这让生活变得更容易。

这些错误已经在你的帖子下面的评论中提到了。

请看修改后的示例(一种可能):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

struct sPlayer {
    // Data
    std::string lname;
    std::string fname;
    unsigned int birthmonth;
    unsigned int birthday;
    unsigned int birthyear;

    // Extractor operator
    friend std::istream& operator >> (std::istream& is, sPlayer& sp) {
        return is >> sp.lname >> sp.fname >> sp.birthmonth >> sp.birthday >> sp.birthyear;
    }

    // Inserter operator
    friend std::ostream& operator << (std::ostream& os, const sPlayer& sp) {
        return os << sp.fname << ' ' << sp.lname << ' ' << sp.birthmonth << '/' << sp.birthday << '/' << sp.birthyear;
    }
};

constexpr int CmdInputData = 1;
constexpr int CmdDisplayOriginalData = 2;
constexpr int CmdSortByLastName = 3;
constexpr int CmdDisplaySortedData = 4;
constexpr int CmdSearchLastName = 5;
constexpr int CmdExit = 6;

// Read users choice. Check for valid data
int getMenuSelection()
{
    std::cout << "\n\nChoose an option:\n   1 - Input Data\n   2 - Display original data\n" <<
        "   3 - Sort data by last name\n   4 - Display sorted data\n   5 - Search by last name\n" <<
        "   6 - Exit the program\n\n --> ";

    // Here we will store the selection
    int selection{ 0 };
    // As long as there is no good selection, we will read a number
    bool noGoodSelection = true;
    while (noGoodSelection) {
        // Read selection
        std::cin >> selection;
        // Check if valid
        noGoodSelection = ((selection < CmdInputData) || (selection > CmdExit));
        // If not, show message and read again
        if (noGoodSelection) {
            std::cout << "Invalid Option , Try again" << '\n';
            std::cin.clear(); std::cin.ignore();
        }
    }
    return selection;
}


void enterSPlayerData(std::vector<sPlayer>& sp)
{
    // Ask, how many players we would like to register
    std::cout << "\n\nEnter soccer player data\n\nHow many player do you want to register: ";
    size_t numberOfPlayersToRegister{ 0 };
    std::cin >> numberOfPlayersToRegister;

    // Make space in vector for all the players
    sp.clear();
    sp.resize(numberOfPlayersToRegister);

    // Read all players
    for (size_t i = 0; i < numberOfPlayersToRegister; ++i) {
        std::cout << '\n' << (i+1) <<"  Enter --> Last Name --> First Name --> Birt Month --> Birth Day --> Birth Year\n";
        std::cin >> sp[i];
    }
}


int main()
{
    // This is our player vector
    std::vector<sPlayer> players{};

    // Andf here a copy with the sorted data
    std::vector<sPlayer> playersSorted{};

    // If we want zo search a name in the vector
    std::string searchString{};
    bool playerFound{ false };

    // Menu selection
    int selection{ CmdExit };
    do {
        selection = getMenuSelection();
        switch (selection)
        {
        case CmdInputData:
            // Read player vector
            enterSPlayerData(players);
            break;

        case CmdDisplayOriginalData:
            // Show all players
            std::cout << "\n\nPlayer List\n\n";
            std::copy(players.begin(), players.end(), std::ostream_iterator<sPlayer>(std::cout, "\n"));
            break;

        case CmdSortByLastName:
            // Copy player list and sort the copy
            playersSorted.clear();
            std::copy(players.begin(), players.end(), std::back_inserter(playersSorted));
            std::sort(playersSorted.begin(), playersSorted.end(), 
                [](const sPlayer & sp1, const sPlayer & sp2) { return sp1.lname < sp2.lname; });
            break;

        case CmdDisplaySortedData:
            // Show the sorted data
            std::cout << "\n\nPlayer List Sorted\n\n";
            std::copy(playersSorted.begin(), playersSorted.end(), std::ostream_iterator<sPlayer>(std::cout, "\n"));
            break;

        case CmdSearchLastName:
            // Sear for a part of a name
            std::cout << "\n\nSearch Player name\n\nEnter some starting characters of Name:  ";
            std::cin >> searchString;
            playerFound = false;
            std::for_each(players.begin(), players.end(),
                [&searchString, &playerFound](const sPlayer & sp) {
                    if (sp.lname.find(searchString) != std::string::npos) {
                        std::cout << "Found Player\n" << sp << '\n';
                        playerFound = true;
                    }
                }
            );
            if (!playerFound) std::cout << "\nNo player found\n\n";
            break;
        default:
            selection = CmdExit;
            break;
        }
    } while (selection != CmdExit);
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57030527

复制
相关文章
jQuery 之 $(this) 出了什么问题?
大家好,又见面了,我是全栈君。 近期在写jQuery的时候出了这样一个问题? <html> <head> <title></title> </head> <style type="text/css"
全栈程序员站长
2022/07/08
5930
排序算法之我观
笔者今年是xmu大一新生 9月初学编程 学到泡排的时候就对排序这一块深入了解 (也只是很粗浅地学习了一下) 写这篇文章的初衷就是复习一下之前所学,有不足之处请不吝赐教 所谓排序 就是将杂乱无章的数据变得有规律 这其中有五花八门的算法,时间复杂度相同的算法不一而足 目前笔者只给读者展示几种基础算法 (冒泡排序,选择排序,插入排序,快速排序,基数排序,希尔排序,归并排序) (之所以没有介绍堆排序的原因是笔者也不是很懂这方面,大一上还没学数据结构) 有低效但好用,高效但不好写之类的 1.冒泡排序(Bubble Sort) 相信大家对这个应该也不陌生吧 应该要熟到半分钟就能把模板打出来 具体运作过程如下: 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 分析: 平均时间复杂度:两重循环:o(n^2) 稳定的算法 上代码(笔者目前只学一门c,IDE是cb) 图源:https://blog.csdn.net/qq_39741605/article/details/80821595
glm233
2020/09/28
4040
排序算法之我观
我是如何击败Java自带排序算法的
Java 8 对自带的排序算法进行了很好的优化。对于整形和其他的基本类型, Arrays.sort() 综合利用了双枢轴快速排序、归并排序和启发式插入排序。这个算法是很强大的,可以在很多情况下通用。针对大规模的数组还支持更多变种。我拿自己仓促写的排序算法跟Java自带的算法进行了对比,看看能不能一较高下。这些实验包含了对特殊情况的处理。
哲洛不闹
2018/09/18
8610
我是如何击败Java自带排序算法的
我跳出了“舒适区”?
很多朋友都知道,我在这周一的时候,在哔哩哔哩发布了自己的第一个露脸视频。得益于各路朋友的支持,目前这个视频的播放已经达到 2.1w,点赞达到了 0.9k。我已经非常非常满意了!
Guide哥
2020/06/28
4640
我跳出了“舒适区”?
算法与数据结构在我眼中的样子(1)排序算法
今天和大家分享的是我系统学习的第一大类算法:排序算法,以前我在写博客的时候总会说:排序算法是我的初恋,所以我的印象很深。
用户9848496
2022/09/26
3250
算法-排序算法-选择排序
/** * 排序算法-选择排序 * 选择排序(Selection Sort)算法也是比较简单的排序算法,其思路比较直观。选择排序算法在每一步中选取最小值来重新排列,从而达到排序的目的。 * 选择排序算法通过选择和交换来实现排序,其排序流程如下: * (1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。 * (2)接着从剩下的n-1个数据中选择次小的1个数据,将其和第2个位置的数据交换。 * (3)然后不断重复上述过程,直到最后两个数据完成交换。至此,便完成了对原始数组的从小
joshua317
2021/03/11
1.5K0
java的几种排序算法(常用排序算法)
一次插入排序的操作过程: 将待插元素,依次与已排序好的子数列元素从后到前进行比较,如果当前元素值比待插元素值大,则将移位到与其相邻的后一个位置,否则直接将待插元素插入当前元素相邻的后一位置,因为说明已经找到插入点的最终位置
全栈程序员站长
2022/07/28
6410
java的几种排序算法(常用排序算法)
算法-排序算法-希尔排序
/** * 排序算法-希尔排序 * 冒泡排序算法、选择排序算法和插入排序算法,虽然思路比较直观,但是排序的效率比较低。 * 对于大量的数据需要排序时,往往需要寻求其他更为高效的排序算法。Shell排序算法便是其中一种 * Shell排序算法严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序,思路如下: * (1)将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对,…… * (2)一次循环使每一个序列对排好顺序。 * (3)然后,再变为n/4个序列,再次排序。
joshua317
2021/03/12
7460
算法-排序算法-快速排序
/** * 排序算法-快速排序 * 快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序思想的。快速排序算法对冒泡排序算法进行了改进,从而具有更高的执行效率。 * 快速排序算法通过多次比较和交换来实现排序,过程如下: * (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 * (2)将大于等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于等于分界值,而右边部分中各元素都大于等于分界值。 * (3)然后,左边和右边的数据可以
joshua317
2021/03/17
8830
算法-排序算法-冒泡排序
/** * 排序算法-冒泡排序 * 冒泡排序(Bubble Sort)算法是所有排序算法中最简单、最基本的一种。 * 冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的。 * 冒泡排序的思路: * (1)对数组中的各数据,依次比较相邻的两个元素的大小。 * (2)如果前面的数据大于后面的数据,就交换这两个数据。经过第一轮的多次比较排序后,便可将最小的数据排好。 * (3)再用同样的方法把剩下的数据逐个进行比较,最后便可按照从小到大的顺序排好数组各数据。 * 冒泡排序算法在对n
joshua317
2021/03/08
9470
常用链表排序算法_单链表的排序算法
转载自: http://blog.csdn.net/northplayboy/article/details/552388
全栈程序员站长
2022/11/10
6140
算法-排序算法-插入排序
/** * 排序算法-插入排序 * 插入排序(Insertion Sort)算法通过对未排序的数据执行逐个插入至合适的位置而完成排序工作。 * 插入排序算法的思路比较简单,应用比较多。 * 插入排序算法通过比较和插入来实现排序,其排序流程如下: * (1)首先对数组的前两个数据进行从小到大的排序。 * (2)接着将第3个数据与排好序的两个数据比较,将第3个数据插入合适的位置。 * (3)然后,将第4个数据插入已排好序的前3个数据中 * (4)不断重复上述过程,直到把最后一个数据插入合适的位置
joshua317
2021/03/11
5920
Js排序算法_js 排序算法
快速排序算法由 C. A. R. Hoare 在 1960 年提出。它的时间复杂度也是 O(nlogn),但它在时间复杂度为 O(nlogn) 级的几种排序算法中,大多数情况下效率更高,所以快速排序的应用非常广泛。 注意: 快速排序不一定是最快的排序方法,这取决于需要排序的数据结构、数据量。不过,大多数情况下,面试官和工作场所用它的概率也是相对较高的,所以我们应该花时间把它学透彻。
全栈程序员站长
2022/09/28
25.2K0
Js排序算法_js 排序算法
算法——排序算法
 基本思想:现在有一个数组arr= {12,35,99,18,76},需要将其从小到大排序
说故事的五公子
2022/05/09
6300
羊了个羊对我的伤害超出了我的意外
利用cocos creator 3d做了个3d版的羊了个羊,文末“阅读原文”可体验。
花叔
2022/09/26
3650
排序算法-选择排序
排序算法-选择排序 <?php /** * 选择排序. * * @param array $value 待排序数组 * * @return array */ function selec
guanguans
2018/05/09
1.4K0
排序算法 --- 希尔排序
欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新,且简书上的付费文章在公众号上将免费。
贪挽懒月
2020/10/10
4980
排序算法 --- 计数排序
前面说的那些排序算法,都是要通过比较来实现的。排序还能不通过比较来实现?是的,计数排序就是这么神奇。
贪挽懒月
2020/10/10
5590
【排序算法】堆排序
堆排序并不是直接对堆节点Node类型排序,而是通过建立索引之间的关系,对一维数组排序。 称之为堆排序,是因为节点索引值之间的关系与完全二叉树的非常类似,而树又称堆。 设根节点为i,i从0开始记,则:
WuShF
2023/07/08
1780
【排序算法】堆排序
我们的软件出了什么问题------《敏捷软件开发:原则、模式与实践》(一)
最近一直在读《敏捷软件开发:原则、模式与实践》,做做笔记。 第一篇 软件设计存在的问题 我们知道,系统的设计,是存在于头脑中的衣服至关重要的图像。 即使我们在一开始的设计阶段,就非常清晰的了解了需求,甚至于在发布的时候,依然清楚。但是在接下来,随着不断的使用,弊端、不足会一一的被暴露出来。系统变得越来越难以维护,最后,即使仅仅进行最简单的更改,也需要花费巨大的努力。 笔者提出了一下观点:当软件出现了下面任何一种气味时,就表明软件正在腐化: 1、僵化性:很难对系统进行改动。因为牵扯到其他太多部分的改动。 2、
小端
2018/04/16
7940

相似问题

我的算法出了什么问题?

40

我不确定我的vlookup代码出了什么问题

11

我的Minimax算法出了什么问题?

16

我的选择算法出了什么问题?

10

我不确定我的分区函数出了什么问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文