求解析这道c语言例题,被调函数里的循环是什么样的,每次循环的值都有什么变化
发布网友
发布时间:2022-05-20 03:56
我来回答
共2个回答
热心网友
时间:2023-10-23 19:24
首先说下fun函数的作用就是处理数组每个相邻的元素不重复,去掉重复的元素。
函数输入一个数组a,这个数组的长度为n,通过循环逐一判断每个元素,是否与前一个元素相等,相等不做任何事情,不相等就把这个不相等的值依然放在这个数组里,用pos作为下标,依次存放,直到遍历每个元素,这样这个新的数组a就没有相邻元素的值重复。
比如数组a中的元素为:2,2,3,3,4,4
循环开始cmp=2,pos=1
第一次循环:取出第一个2与cmp作比较,相等不做任何事。
第二次循环:取出第二个2与cmp比较相等也不做任何事。
第三次循环:取出第一个3与cmp比较不等,那么把3放到pos指定的位置,即第二个2的位置,第二个2为3,再把pos加1,新的cmp=3。
第四次循环:取出第二个3与cmp比较相等,不做任何事。
第五次循环:取出第一个4与cmp比较,不等,那就把4放到数组pos下标的位置,再pos加1,新的cmp=4。
第六次循环:取出第二个4与cmp比较,相等,不做事,并结束循环。
循环结束后函数返回pos值,即新的数组a有效元素长度,元素分别为2,3,4。
注意,这个函数只能处理相邻之间的元素不重复。比如数组a元素为:2,2,3,3,2,2那么输出新的数组a为:2,3,2。追问明白了 谢谢
热心网友
时间:2023-10-23 19:24
这个fun函数实现的功能相当于C++标准库中的unique
#include<stdio.h>
int fun(int a[], int n) //去重函数
{
int k = 0, pos = 1;
int cmp = a[0];//cmp记录的是前一个数的值
for (k = 0; k < n; k++) //遍历数组
{
//因为a数组是有序的,所以当与cmp不一样时一定是一个新的值
if (a[k] != cmp)
{
a[pos++] = a[k];//将不同的值前移,更新后的数组只存储不同的值
cmp = a[k];
}
}
return pos; //返回去重后数组的大小
}
int main(void)
{
int num[20] = { 2,2,2,3,5,5,5,5,5,6,6,8,10,13,13,14,14,15,15,15 };
int i = 0, j = 0, n;
printf("The original data is:");
for (i = 0; i < 20; i++)
printf("%d", num[i]);
printf("\nThe data after changing is:");
n = fun(num, 20);
for (j = 0; j < n; j++)
printf("%d", num[j]);
printf("\n");
return 0;
}