按要求进行排序
//给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。//此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
//示例:
//输入:
//输出:
#include<stdio.h>
int main()
{
int sort(int *p,int n);
int i,k,n,*p,a;
scanf("%d",&n);
getchar();
for(i = 0;i < n;i++)
{
scanf("%d",&a);
}
p = a;
k = sort(p,n);
printf("\n");
return 0;
}
int sort(int *p,int n)
{
int i,j,k = 0,count1 = 0,count2 = 0,count3 = 0;
int temp;
for(i = 0;i < n;i++)
{
if(*(p + i) == 0)
{
temp = 0;
count1 += 1;
}
else if(*(p + i) == 1)
{
temp = 1;
count2 += 1;
}
else
{
temp = 2;
count3 += 1;
}
}
temp = 88; // 设置元素终止符为数字88
temp = 88;
temp = 88;
for(j = 0;j < 3;j++)
{
for(i = 0;temp != 88;i++)
{
if(temp != 88)
{
*(p + k) = temp;
printf("%d ",*(p + k));
k++;
}
}
}
printf("\n");
return 0;
}
此程序 DEV_C++5.11 编译通过,却又不能执行,但将第6行定义数组的 n 改为12,整个程序运行正常,请问该如何修改?
神奇,p = a;后数组长度变了!
#include<stdio.h>
int sort(int *p,int n);
int main()
{
int i,k,n,*p,a;
scanf("%d",&n);
getchar();
printf("p = a 前,n = %d\n", n);
for(i = 0;i < n;i++)
{
scanf("%d",&a);
}
p = a;
printf("p = a 后,n = %d\n", n);
k = sort(p,n);
printf("\n");
return 0;
}
int sort(int *p,int n)
{
int i,j,k = 0,count1 = 0,count2 = 0,count3 = 0;
int temp;
printf("n = %d\n", n);
for(i = 0;i < n;i++)
{
if(*(p + i) == 0)
{
temp = 0;
count1 += 1;
}
else if(*(p + i) == 1)
{
temp = 1;
count2 += 1;
}
else
{
temp = 2;
count3 += 1;
}
}
printf("count1 = %d\n", count1);
printf("count2 = %d\n", count2);
printf("count3 = %d\n", count3);
temp = 88; // 设置元素终止符为数字88
temp = 88;
temp = 88;
for(j = 0;j < 3;j++)
{
for(i = 0;temp != 88;i++)
{
// if(temp != 88)
//{
//*(p + k) = temp;
printf("%d ",temp);
// k++;
//}
}
}
printf("\n");
return 0;
} 这样就可以了,不知道是不是变长数组的bug
这样用不太行
#include<stdio.h>
#define MAXSIZE 100
int sort(int *p,int n);
int main()
{
int i,k,n,*p,a;
scanf("%d",&n);
getchar();
printf("p = a 前,n = %d\n", n);
for(i = 0;i < n;i++)
{
scanf("%d",&a);
}
p = a;
printf("p = a 后,n = %d\n", n);
k = sort(p,n);
printf("\n");
return 0;
}
int sort(int *p,int n)
{
int i,j,k = 0,count1 = 0,count2 = 0,count3 = 0;
int temp;
printf("n = %d\n", n);
for(i = 0;i < n;i++)
{
if(*(p + i) == 0)
{
temp = 0;
}
else if(*(p + i) == 1)
{
temp = 1;
}
else
{
temp = 2;
}
}
temp = 88; // 设置元素终止符为数字88
temp = 88;
temp = 88;
for(j = 0;j < 3;j++)
{
for(i = 0;temp != 88;i++)
{
// if(temp != 88) 这个if判断有些啰嗦了
//{
*(p + k) = temp;
printf("%d ",temp);
k++;
//}
}
}
printf("\n");
return 0;
} 本帖最后由 风过无痕1989 于 2020-10-27 19:30 编辑
受楼上巴巴鲁朋友的启发,修改一下数组 a 的定义位置,程序运行正常。其实在此位置的 a 数组已经不是一个彻头彻尾的变长数组了,它有了具体的元素个数
#include<stdio.h>
int main()
{
int sort(int *p,int n);
int i,k,n,*p;
scanf("%d",&n);
getchar();
int a;
for(i = 0;i < n;i++)
{
scanf("%d",&a);
}
p = a;
k = sort(p,n);
printf("\n");
return 0;
}
int sort(int *p,int n)
{
int i,j,k = 0,count1 = 0,count2 = 0,count3 = 0;
int temp; // 这里有一个不算大的错误,原定义为 temp,还是改成 n 好,与主数组长度保持一致
for(i = 0;i < n;i++)
{
if(*(p + i) == 0)
{
temp = 0;
count1 += 1;
}
else if(*(p + i) == 1)
{
temp = 1;
count2 += 1;
}
else
{
temp = 2;
count3 += 1;
}
}
temp = 88; // 设置元素终止符为数字88
temp = 88;
temp = 88;
for(j = 0;j < 3;j++)
{
for(i = 0;temp != 88;i++)
{
if(temp != 88)
{
*(p + k) = temp;
printf("%d ",*(p + k));
k++;
}
}
}
printf("\n");
return 0;
}
风过无痕1989 发表于 2020-10-27 19:18
受楼上巴巴鲁朋友的启发,修改一下数组 a 的定义位置,程序运行正常。其实在此位置的 a 数组已经不是 ...
我还以为我已经算有基础了,连为啥这样都不知道 巴巴鲁 发表于 2020-10-27 19:46
我还以为我已经算有基础了,连为啥这样都不知道
这可能还编译软件的问题,DEV_C++ 并不完全支持C99,只是部份支持,可悲的是,已经没有人对它进行更新了 风过无痕1989 发表于 2020-10-27 19:50
这可能还编译软件的问题,DEV_C++ 并不完全支持C99,只是部份支持,可悲的是,已经没有人对它进行更新了
以后想走得更远还得用VS, 巴巴鲁 发表于 2020-10-27 19:57
以后想走得更远还得用VS,
是的,我今天买回一个西部数据500G固态硬盘,明天安装8.1系统,先玩玩VS2015看看,不行再升级 感谢两位的指导!
页:
[1]