gpt4 book ai didi

c++ - 在不使用临时变量进行交换时,swap(int&, int&) 函数不起作用?

转载 作者:行者123 更新时间:2023-11-30 18:44:24 25 4
gpt4 key购买 nike

当我发现这个时,我正在编写 quickSort() 函数来对 int[] 进行排序 - 好吧,我不知道我应该调用它什么 - 未定义的行为错误或一些我现在无法理解的事情。

快速排序程序:

// quick sort
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;

// constant
enum {MAX = 10};

// class
class A
{
private:
int arr[MAX];
public:
A() // constructor
{
srand(time(0));
for(int i = 0; i < MAX; i++)
arr[i] = rand() % 100;
}
// accessing array
int get(int i)
{
return arr[i];
}
// quick sort
int Partition(int left, int right);
void quickSort(int left, int right);
void Swap(int&, int&);
};

// member function definition
int A::Partition(int left, int right)
{
int pivot = arr[right], i = left - 1;
for(int j = left; j <= right-1; j++)
{
if(arr[j] < pivot)
{
i++;
Swap(arr[i], arr[j]);
}
}
Swap(arr[i+1], arr[right]);
return i+1;
}

void A::quickSort(int left, int right)
{
if(left < right)
{
int pi = Partition(left, right);
quickSort(left, pi-1);
quickSort(pi+1, right);
}
}

void A::Swap(int& a, int& b)
{
a = a+b;
b = a-b;
a = a-b;
}

// driver
int main(void)
{
A obj1;

//-------Array initialized--------
cout << "Before sorting:" << endl;
for(int i = 0; i < MAX; i++)
cout << setw(4) << obj1.get(i);

//--------Sorting Array-----------
obj1.quickSort(0, MAX-1);

//--------Sorted Array------------
cout << "\nAfter sorting:" << endl;
for(int i = 0; i < MAX; i++)
cout << setw(4) << obj1.get(i);

return 0;
}

问题出在 swap() 函数内部。当我使用 int temp 变量交换值时,值会被交换,并且数组会按升序排序。

但是当我在不使用临时 int 变量的情况下交换值时,我在排序数组中得到了 0。如下图:

输出:

Before sorting:
89 43 18 98 23 88 52 18 1 25
After sorting:
1 18 0 0 25 43 0 88 89 98

当我调试 swap() 时,参数 ab 引用相同的地址 this >.

最佳答案

您使用错误的格式来获取学生姓名。将 scanf("%d", &name); 更改为 scanf("%s", name);

另外intmarks[4]创建了4个元素。但在 for 循环中你读的是 5 分。当 i=4 marks[i] 是第 5 个元素时。所以你必须将 intmarks[4] 更改为 intmarks[5]

我认为将数组大小定义为常量值会更好。

#define MARKS_COUNT 5

int main()
{
// ...
int total = 0, i, marks[MARKS_COUNT];
// ...

for(i=0; i<MARKS_COUNT; i++){
scanf("%d", &marks[i]);
}
for(i=0; i<MARKS_COUNT; i++){
total += marks[i];
}

avr=(float)total/MARKS_COUNT;
// ...
}

另请阅读有关格式字符串的信息 http://www.cplusplus.com/reference/cstdio/scanf/

关于c++ - 在不使用临时变量进行交换时,swap(int&, int&) 函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58281477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com