C语言经典题目(某校复试真题)

2017:

1. 顺序存储的n个整数,编程输出最大的前k个

#include
#define N 10
void sort(int *a,int n)
{
	int i,j,t;
	for(i=0;i<n-1;i++)
		for(j=0;j<n-i-1;j++)
			if(a[j]<a[j+1])
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
}
void main()
{
	int i,a[N],k;
	printf("input 10 numbers:");
	for(i=0;i<N;i++)
		scanf("%d",&a[i]);
	printf("input k:");
	scanf("%d",&k);
	sort(a,N);
	for(i=0;i<k;i++)
		printf("%3d",a[i]);
}

2. 用递归函数求1到n的和:

#include
int sum(int n)
{
	int result;
	if(n==1)
		result=1;
	else
		result=sum(n-1)+n;
	return result;
}
void main()
{
	int n;
	printf("input n:");
	scanf("%d",&n);
	printf("%d\n",sum(n));

}

3. 利用swap(int a,int b)函数实现参数交换:

#include
void swap(int *a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}
void main()
{
	int a,b;
	printf("input a,b:");
	scanf("%d%d",&a,&b);
	swap(&a,&b);
	printf("a=%d,b=%d\n",a,b);
}

4. 编函数求字符串中数字个数:

#include 
int main()
{
    int sum=0;
    char c;
    printf("Please input some characters!\n");
    while((c=getchar())!='\n')
    {
        if(c>='0'&&c<='9')
            sum++;
    }
    printf("Including %d numbers\n",sum);
    return 0;
}

5.求字符串中字符ASCII的总和:

#include
#include
#define N 100
void main()
{
    char s[N];
    int len,i,sum=0;
    gets(s);
    len=strlen(s);
    for(i=0;i<len;i++)
		sum=sum+s[i];
    printf("%d\n",sum);
}

6.学生信息、姓名、学号、英语、数学、政治成绩, a:写出学生结构体信息 b:finput输入每个学生信息 c:求单科和总分最高的学生信息

#include
#define N 3
struct student
{
	char name[50];
	char ID[20];
	double English;
	double 	Math;
	double political;
};
student finput(struct student std)
{
	printf("请输入学生的姓名,学号,成绩(英语,数学,政治):\n");
	printf("姓名:");
	scanf("%s", std.name);
	printf("学号:");
	scanf("%s", std.ID);
	printf("英语:");
	scanf("%lf", &std.English);
	printf("数学:");
	scanf("%lf", &std.Math);
	printf("政治:");
	scanf("%lf", &std.political);
	return std;
}
int maxScore(double a[])
{
	int i,j;
	double max = 0;
	for (i = 0; i < N; i++)
	{
		if (a[i]>max)
		{
			max = a[i];
			j = i;
		}
	}
	return j;
}
void main()
{
	struct student std[N];
	int i;
	for (i = 0; i < N; i++)
	{
		std[i] = finput(std[i]);
		printf("\n");
	}
	double sum[N],math[N],english[N],political[N];  //定义数组
	for (i = 0; i < N; i++)
	{
		sum[i] = std[i].English + std[i].Math + std[i].political;
		printf("%lf \t %lf \t %lf \n",std[i].English, std[i].Math, std[i].political);
		printf("%lf\n", sum[i]);
		math[i] = std[i].Math;  //将对应成绩存入数组
		english[i] = std[i].English;
		political[i] = std[i].political;
	}
	int s = maxScore(sum);  //求最大元素的下标
	int m = maxScore(math);
	int e = maxScore(english);
	int p = maxScore(political);
	printf("总分成绩最高的学生成绩%lf,学生名为%s\n", sum[s], std[s].name);
	printf("英语成绩最高的学生成绩%lf,学生名为%s\n", english[e], std[e].name);
	printf("数学成绩最高的学生成绩%lf,学生名为%s\n", math[m], std[m].name);
	printf("政治成绩最高的学生成绩%lf,学生名为%s\n", political[p], std[p].name);
 }

2018:
(选择题八道:)

  1. 已知后序和中序求先序:
  2. 知道一向量组,构造有序单链表时间复杂度:
  3. 快速排序一趟结果:
  4. 单插入节点过程:
  5. 希尔排序,取步长特点,递减:
  6. 循环队列长度:

综合题(画图为主):

  1. 给出图的邻接矩阵,最小生成树:
  2. 冒泡排序过程:
  3. 8皇后,写算法:
  4. 周游遍历代价最小:
  5. 堆调整算法:
  6. 拓扑排序:

问答环节:自我介绍3分钟,中英文均可,了解基本情况,有问过跨考的数组指针与指针数组的区别,有可能会针对自我介绍来提问。
2019:
1.简答题:
1.1 什么是递归函数?什么是嵌套函数?请举例说明。
递归函数指的是:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

如:求n的阶乘。

#include
int fac(int n)         
{
    if(n<0)            
        printf("n<0,data error!");
    else if(n==0||n==1) 
        return 1;
    else
		return fac(n-1)*n;
}
int main()
{
    
    int n,t;
    printf("input an interger number:");
    scanf("%d",&n);     
    t=fac(n);
    printf("%d!=%d\n",n,t);
    return 0;
}

嵌套函数:在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。
如:
fun1()
{
fun2();
}
fun2()
{
fun3();
}
fun3()
{
printf(“Hello”);
}
1.2谈谈你对全局变量的理解,说说全局变量的优缺点。
• 在函数外部定义的变量叫做全局变量
• 全局变量能够在所有的函数中进行访问
• 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的。
优点:
1)全局可见,任何 一个函数或线程都可以读写全局变量-同步操作简单。2)内存地址固定,读写效率比较高。
缺点:
1)全局变量存放在静态存储区,系统需要为其分配内存,一直到程序结束, 才会释放内存,这一点就局部变量的动态分配,随用随从栈中申请,用完(函数调用完毕)就释放。
2)影响函数的封装性能:我们肯定是希望我们写的函数具有重入性,就如一个黑盒子一般,只 通过函数参数就能得到返回,内部 实现要独立,但是如果函数中使用了全局变量,这势必就破坏了函数的封装性,会造成对全局变量的依赖。
3)降低函数的移值性,原因同上。
4)降低代码的可读性,这也意味着系统维护会不方便,因为一个全局变量可能会出现程序中的各个环节,函数的 执行也会根据环境变化而变化,所以调试会不太方便。
5)全局变量的读写,可能会延迟,这主要是体现在“写”操作上,由于写操作,一般需要2个周期操作,所以有可能会出现,这边没写完时,那边已经读了,结果 读到的不是最终值,这个是一个概率事件,概率 很小,但是并不代表没有。

2.代码填空:
2.1 基础语句的理解(for,switch)
给一段C语言基础的代码。代码结构由(for,switch语句组成)。写出程序运行结果。
2.2 排序算法
给出一段选择排序算法,从中扣除两段代码(留空)。代码补充(填空)。

3.编程题:

3.1 一个盒子中放有12个球,其中3个红的,3个白的,6个黑的,从中任取8个球,编程求出共有多少种不同的颜色搭配。

#include
int main()
{
int m, n, number=0;
printf(" 红球 白球 黑球\n");
printf("......................\n");
for( m=0; m<=3; m++ ) //红球
	for( n=0; n<=3; n++ )  //白球
		if(8-m-n<=6) //黑球的个数小于等于6,即 8 - m - n ≤ 6。
			printf(" %2d: %d %d %d\n", ++number, m, n, 8-m-n);
				return 0;
}

3.2 给出一个预定义维数矩阵M,编程求出: 3.2.1 求出该矩阵M的主、副对角线上所有元素之和;

#include
#define M 3
void main()
{
	int i,j,a[M][M],sum=0;
	for(i=0;i<M;i++)
		for(j=0;j<M;j++)
			scanf("%d",&a[i][j]);
		for(i=0;i<M;i++)
			for(j=0;j<M;j++)
			{
				if(i==j||i+j==2)
					sum=sum+a[i][j];
			}
			printf("sum=%d\n",sum);
}

3.2.2 求出该矩阵M的主、副对角线上元素下标之和为偶数的所有元素之积:

#include
#define M 3
void main()
{
	int i,j,a[M][M],sum=1;
	for(i=0;i<M;i++)
		for(j=0;j<M;j++)
			scanf("%d",&a[i][j]);
		for(i=0;i<M;i++)
			for(j=0;j<M;j++)
			{
				if((i==j||i+j==2)&&(i+j)%2==0)
					sum=sum*a[i][j];
			}
			printf("sum=%d\n",sum);
}

3.3 编写一个函数StringTransfer(char *s,int n)。 该函数实现的功能为:输入一个字符串S,要求将元素左移n位,往左移位溢出的元素需要向字符串尾部填充。

#include
#define N 100
void StringTransfer(char *s, int n)
{
int i = 0;
char temp = s[i++];
if(sizeof(temp) == 0)
{
return;
}
while(s[i] != ‘\0’)
{
s[i-1] = s[i];
i++;
}
s[i-1] = temp;
if(n > 1)
{
StringTransfer(s, n-1);
}
}
int main()
{
char a[N];
int n;
printf(“input a string:”);
gets(a);
printf(“input move numbers n:”);
scanf("%d",&n);
StringTransfer(a, n);
printf("%s\n", a);
return 0;
}

你可能感兴趣的:(C语言经典题目(某校复试真题))