计算机二级C语言程序设计题

252 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

计算机二级C语言程序设计题

题目:

请编写函数fun(),该函数的功能是:删去一维数组中所有相同的数,使之只剩下一个。数组中的数已按由大到小的顺序排序,函数返回删除后数组中元素的个数.例如,一维数组中的数据是:2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10;删除后,数组中的内容应该是:2 3 4 5 6 7 8 9 10.

#include <stdio.h>
#include <stdlib.h>
#define N 60
int fun(int a[], int n)
{
?
}
main()
{
	int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10};
	int i, n=20;
	void NONO();
	printf("The original data :\n");
	for(i=0; i<n; i++)
	{
		printf("%3d",a[i]);
	}
	n=fun(a,n);
	printf("\n\nThe data after deleted :\n");
	for(i=0; i<n; i++)
	{
		printf("%3d",a[i]); 
	}
	printf("\n\n");
	NONO();
	system("pause");
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,
 调用函数,输出数据,关闭文件。 */
	FILE *rf, *wf; 
	int a[N], n, i, j;
	rf=fopen("in.dat","r");
	wf=fopen("out.dat","w");
	for(i=0; i<8; i++) 
	{
		fscanf(rf, "%d", &n);
		for(j=0; j<n; j++) 
		{
			fscanf(rf, "%d", &a[j]);
		}
		n=fun(a, n);
		for(j=0; j<n; j++) 
		{
			fprintf(wf, "%4d", a[j]);
		}
		fprintf(wf, "\n");
	}
	fclose(rf); 
	fclose(wf);
}

题目分析:

首先在函数中定义临时变量指向每一个元素,然后在循环过程中将临时值和其他元素进行比较,如果不同,则将临时变量的值赋值到数组的第一个元素,同时将此与临时变量不同的数组元素赋值给临时变量

解题思路:

i,j都从1开始其中j用于控制删除后剩下的数中的下标用于搜索原数组中的元素。j始终是新数组已有元素中最后一个元素的下一个元素的下标,所以if()中的条件是a[j-1]!=a[i]其中a[j-1]就是新数组中的最后一个元素若条件成立则表示出现了不同的值所以a[i]要留到新数组中。注本题中i,j的初值都要从1开始

参考答案:

int fun(int a[], int n)
{
	int i, t, j=0, *p=a;
	t=p[0];
	for(i=0;i<=n;i++)
	{
		if(t!=p[i])
		{
			a[j]=t;
			t=p[i];
			j++;
		}
		if(i>=n)
		{
			a[j]=t;
		}
	}
	return j;
}

结果如下:

5.png