#include<stdlib.h>
#define N 10
void main()
{
void suijifuzhi(int *temp[], int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta[], int x); //声明冒泡法排序,由小到大或由大到小
int num[N] = {0};
int *p = num;
suijifuzhi(num, N); ///调用随机数生成函数
maopaomaxtomin(p, N); //调用冒泡函数,实参用指针变量,形参用数组名
system("pause");
}
void suijifuzhi(int *temp[], int x) //随机数生成函数
{
time_t tms;
srand((unsigned int)time(&tms));
for (int i = 0; i < x; i++)
{
temp[i] = rand() % 100;
printf("%-4d", temp[i]);
}
}
void maopaomaxtomin(int *ta[], int x)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < x; j++)
{
if (ta[j]>ta[j + 1]) //大于就行,小于就不行,不知道为什么
{
int temp = ta[j];
ta[j] = ta[j + 1];
ta[j + 1] = temp;
}
}
}
printf("\n冒泡法排序后:\n");
for (int i = 0; i < x; i++)
{
printf("%-4d", ta[i]);
}
}
3 个解决方案
#1
两个问题,冒泡法的数组访问会越界,因为有ta[j + 1],所以双层for循环的终止条件是i和j小于x-1。内层循环的终止条件也可以为x-i-1,可以省去不必要的循环。
第二个问题,函数的形参接收数组时候要写成指针,而不是指针数组。在被调函数中这个指针有可以作为数组来用。
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
修改后的程序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
void main()
{
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
int num[N] = {0};
int *p = num;
suijifuzhi(num, N); ///调用随机数生成函数
maopaomaxtomin(p, N); //调用冒泡函数,实参用指针变量,形参用数组名
//system("pause");
}
void suijifuzhi(int *temp, int x) //随机数生成函数
{
time_t tms;
srand((unsigned int)time(&tms));
for (int i = 0; i < x; i++)
{
temp[i] = rand() % 100;
printf("%-4d", temp[i]);
}
}
void maopaomaxtomin(int *ta, int x)
{
for (int i = 0; i < x-1; i++)
{
for (int j = 0; j < x-i-1; j++)
{
if (ta[j]<ta[j + 1]) //大于就行,小于就不行,不知道为什么
{
int temp = ta[j];
ta[j] = ta[j + 1];
ta[j + 1] = temp;
}
}
}
printf("\n冒泡法排序后:\n");
for (int i = 0; i < x; i++)
{
printf("%-4d", ta[i]);
}
printf("\n");
}
第二个问题,函数的形参接收数组时候要写成指针,而不是指针数组。在被调函数中这个指针有可以作为数组来用。
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
修改后的程序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
void main()
{
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
int num[N] = {0};
int *p = num;
suijifuzhi(num, N); ///调用随机数生成函数
maopaomaxtomin(p, N); //调用冒泡函数,实参用指针变量,形参用数组名
//system("pause");
}
void suijifuzhi(int *temp, int x) //随机数生成函数
{
time_t tms;
srand((unsigned int)time(&tms));
for (int i = 0; i < x; i++)
{
temp[i] = rand() % 100;
printf("%-4d", temp[i]);
}
}
void maopaomaxtomin(int *ta, int x)
{
for (int i = 0; i < x-1; i++)
{
for (int j = 0; j < x-i-1; j++)
{
if (ta[j]<ta[j + 1]) //大于就行,小于就不行,不知道为什么
{
int temp = ta[j];
ta[j] = ta[j + 1];
ta[j + 1] = temp;
}
}
}
printf("\n冒泡法排序后:\n");
for (int i = 0; i < x; i++)
{
printf("%-4d", ta[i]);
}
printf("\n");
}
#2
ta的类型是int**
ta[j]的类型是int*,而不是int
ta[j]的类型是int*,而不是int
#3
非常感谢两位大神能给我解惑,跟据 kongming2liya 大神的指点并测试,实参是指针变量时,形参可以是指针变量或数组名,而我原来使用的是指针数组。如果实参是数组名,形参就可是指针数组(实测可行)!kongming2liya 大神提到的内层循环如果改成 x-i-1 ,改完后还是会出现越界问题,内外层都改成 x-1 就不会越界(已实测)。被这个问问题困了两天,非常感谢各位大神的帮助
#1
两个问题,冒泡法的数组访问会越界,因为有ta[j + 1],所以双层for循环的终止条件是i和j小于x-1。内层循环的终止条件也可以为x-i-1,可以省去不必要的循环。
第二个问题,函数的形参接收数组时候要写成指针,而不是指针数组。在被调函数中这个指针有可以作为数组来用。
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
修改后的程序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
void main()
{
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
int num[N] = {0};
int *p = num;
suijifuzhi(num, N); ///调用随机数生成函数
maopaomaxtomin(p, N); //调用冒泡函数,实参用指针变量,形参用数组名
//system("pause");
}
void suijifuzhi(int *temp, int x) //随机数生成函数
{
time_t tms;
srand((unsigned int)time(&tms));
for (int i = 0; i < x; i++)
{
temp[i] = rand() % 100;
printf("%-4d", temp[i]);
}
}
void maopaomaxtomin(int *ta, int x)
{
for (int i = 0; i < x-1; i++)
{
for (int j = 0; j < x-i-1; j++)
{
if (ta[j]<ta[j + 1]) //大于就行,小于就不行,不知道为什么
{
int temp = ta[j];
ta[j] = ta[j + 1];
ta[j + 1] = temp;
}
}
}
printf("\n冒泡法排序后:\n");
for (int i = 0; i < x; i++)
{
printf("%-4d", ta[i]);
}
printf("\n");
}
第二个问题,函数的形参接收数组时候要写成指针,而不是指针数组。在被调函数中这个指针有可以作为数组来用。
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
修改后的程序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
void main()
{
void suijifuzhi(int *temp, int x); //声明外部随机数生成函数
void maopaomaxtomin(int *ta, int x); //声明冒泡法排序,由小到大或由大到小
int num[N] = {0};
int *p = num;
suijifuzhi(num, N); ///调用随机数生成函数
maopaomaxtomin(p, N); //调用冒泡函数,实参用指针变量,形参用数组名
//system("pause");
}
void suijifuzhi(int *temp, int x) //随机数生成函数
{
time_t tms;
srand((unsigned int)time(&tms));
for (int i = 0; i < x; i++)
{
temp[i] = rand() % 100;
printf("%-4d", temp[i]);
}
}
void maopaomaxtomin(int *ta, int x)
{
for (int i = 0; i < x-1; i++)
{
for (int j = 0; j < x-i-1; j++)
{
if (ta[j]<ta[j + 1]) //大于就行,小于就不行,不知道为什么
{
int temp = ta[j];
ta[j] = ta[j + 1];
ta[j + 1] = temp;
}
}
}
printf("\n冒泡法排序后:\n");
for (int i = 0; i < x; i++)
{
printf("%-4d", ta[i]);
}
printf("\n");
}
#2
ta的类型是int**
ta[j]的类型是int*,而不是int
ta[j]的类型是int*,而不是int
#3
非常感谢两位大神能给我解惑,跟据 kongming2liya 大神的指点并测试,实参是指针变量时,形参可以是指针变量或数组名,而我原来使用的是指针数组。如果实参是数组名,形参就可是指针数组(实测可行)!kongming2liya 大神提到的内层循环如果改成 x-i-1 ,改完后还是会出现越界问题,内外层都改成 x-1 就不会越界(已实测)。被这个问问题困了两天,非常感谢各位大神的帮助