哈尔滨理工大学自动化学院研究生复试C语言编程题

考研经验贴等其他资料:哈尔滨理工大学自动化学院控制工程考研经验贴+初试资料+复试资料 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/625907961

2019真题:给定一个数判断其奇数还是偶数

#include<stdio.h>
int main()
{
	int num;
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d是奇数。\n", num);
	else if (num % 2 == 0)
		printf("%d是偶数。\n", num);
	return 0;
}

 2019真题:将一组数据放入数组中,逆序输出

#include<stdio.h>
int main()
{
	int arr[20];
	int num;
	int *p = arr;//指针指向数组arr的首元素地址
	scanf("%d", &num);//输入num个数据
	for (int i = 0; i < num; i++)
	{
		scanf("%d", &arr[i]);
	}

	//j=num-1,p+j是的指针指向了最后一个数据。
	for (int j = num-1; j >= 0; j--)
	{
		printf(" %d", *(p + j));
	}
}

//不通过指针实现

#include<stdio.h>
int main()
{
	int arr[20];
	int num;
	scanf("%d", &num);//输入num个数据
	for (int i = 0; i < num; i++)
	{
		scanf("%d", &arr[i]);
	}

	//j=num-1,p+j是的指针指向了最后一个数据。
	for (int j = num - 1; j >= 0; j--)
	{
		printf(" %d", arr[j]);
	}
}

 2019真题:定义一个结构体,存储学生信息,将学生信息按照成绩排序,再将排序后的学生信息以此输出

#include<stdio.h>

struct student
{
	char name[20];
	long long ID;
	int score;

}stu[1000],temp;//temp用于存放临时数据

int main()
{
	int num;
	scanf("%d", &num);//输入num个学生

	for (int i = 0; i < num; i++)
	{
		scanf("%s %d %d", stu[i].name, &stu[i].ID, &stu[i].score);
	}
	//类似于冒泡排序,讲stu数组从小到大按照成绩重新排序
	for (int j = 0; j < num-1; j++)
	{
		//趟数
		for (int k = 0; k < num -j- 1; k++)
		{
			//排序
			if (stu[k].score>stu[k+1].score)
			{
				temp = stu[k];
				stu[k] = stu[k+1];
				stu[k+1] = temp;
			}
		}
	}
	
	for (int w = 0; w < num; w++)
	{
		printf(" %s同学,  学号:%d,", stu[w].name,stu[w].ID);
		printf("成绩为%d\n ", stu[w].score);
	}
	return 0;
}

输出结果: 

2017真题 求和20!\sum_{n=1}^{20}20

#include<stdio.h>

int main()
{
	int n;
	int sum=0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)//从第i=1开始
	{   
		int factorial = 1;
		for (int j = 1; j <= i; j++)//求i的阶乘
		{
			factorial = j*factorial;
		}
		sum = sum + factorial;//讲i的阶乘求和放入sum中

	}
	printf("%d\n", sum);
	return 0;
}

 输出结果

如果二十的阶乘求和后很大超出int的最大值,结果可能就溢出,显示的值可能是溢出的值。

写成函数的方法

#include<stdio.h>
int  factorial(int n)
{
	int sum = 0;
	for (int i = 1; i <= n; i++)//从第i=1开始
	{
		int factorial = 1;
		for (int j = 1; j <= i; j++)//求i的阶乘
		{
			factorial = j*factorial;
		}
		sum = sum + factorial;//讲i的阶乘求和放入sum中
	}
	return sum;
}

int main()
{
	int n;
	scanf("%d", &n);
	int sum = factorial(n);
	printf("%d\n", sum);
	return 0;
}

2017真题:求三行四列行列式中最小值,并且显示最小元素的行和列

#include<stdio.h>
int main()
{
	int arr[3][4] = { { 9, 8, 7, 4 }, { 7, 8, 9, 5 }, { 4, 1, 2, 3 } };

	int min=arr[0][0], row, col;//定义最大元素值,以及行号和列号

	//查找行
	for (int i = 0; i < 3; i++)
	{
		//列
		for (int j = 0; j < 4; j++)
		{
			if (min > arr[i][j])//如果查找的一个值小于暂存的最小值
			{
				//保存最小元素信息
				min = arr[i][j];
				row = i+1;//因为数组下标与矩阵行列不一致 +1即可
				col = j+1;
			}
		}
	}
	printf("min=%d,row=%d,col=%d\n", min, row, col);

	return 0;
}

再试一试指针的方法

因为一个矩阵的数组在内存中存放是以为的按顺序存放的

#include<stdio.h>

int main()
{
	int arr[3][4] = { { 9, 8, 7, 4 }, { 7, 8, 9, 5 }, { 4, 1, 2, 3 } };
	int min = arr[0][0], row, col;//定义最大元素值,以及行号和列号

	int *p = &arr[0][0];

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (*(p + i*4 + j) < min)//  首元素地址+第i行*4,再加上j列,就指向要查找的元素
			{
				min = *(p + i * 4 + j);
				row = i+1;//因为数组下标与矩阵行列不一致 +1即可
				col = j+1;
			}
		}
	}
	printf("min=%d,row=%d,col=%d\n", min, row, col);
	return 0;
}

2017真题 输入一个字母判断是大写字母还是小写字母

#include<stdio.h>

int main()
{

	char letter;
	scanf("%c", &letter);

	if (letter >= 'A'&&letter <= 'Z')
		printf("%c是大写字母。", letter);
	else if (letter >= 'a'&&letter <= 'z')
		printf("%c是小写写字母。", letter);
	else
		printf("您输入的不是字母。");

	return 0;
}

2017真题将一个整型的第N位置1其他位不变

#include<stdio.h>
int main()
{
	int n, num;
	scanf("%d %d", &n,&num);
	//0000 0001 左移1位->0000 0010
	
	num = num | (1 << n);//0000 1101
	                     //0000 0010 或
	                     //0000 1111 
	printf("%d", num);
	
}

2017真题编写一个函数,交换两个实参的值

#include<stdio.h>

void swap(int*pa, int *pb)
{
	int temp =*pa;//保存pa的值
	*pa =*pb;//将pa指向的值改为pb
	*pb = temp;//pb放入pa最先保存的值

}
int main()
{
	int a = 1, b = 2;
	int*pa = &a, *pb = &b;
	swap(pa, pb);
	printf("a=%d,b=%d\n", a, b);//传值操作,最终改变了参数实参

	return 0;
}

2017写一个字符串的拷贝函数

#include<stdio.h>

void copy(char*str1, char*str2)//字符串的首地址
{
	while (*str2 != '\0')
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	*str1 = '\0';

}
int main()
{
	void copy(char*, char*);
	char str1[] = "abcdefgh";//copy完 str1内部 :ABCDE\0gh\0
	char str2[] = "ABCDE";

	copy(str1, str2);

	printf("%s\n", str1);

	return 0;
}

struct student
{
	char name[20];
	int num;
	int score[3];//code 0数学 1 语文 2 英语
}stu[40];


int CalculateAverage(int num)//输入的是学号
{
	int k;//保存学生的编号
	for (int j = 0; j < 3; j++)
	{
		if (stu[j].num == num)//查找到有学生的学号一致,保存学生数组的下标
			k = j;
	}

	int sum = 0;
	for (int i = 0; i < 3; i++)
	{
		sum = sum + stu[k].score[i];
	}
	return sum / 3;

}

int GetNum(char *name)//判断指针指向的内容与结构体里面定义的内容是否一致
{
	char *frist = name;//保存被查找字符的首地址
	for (int i = 0; i < 3; i++)
	{
		int j = 0; 
		int flag = 0;
		name = frist;
		while (*name!='\0')
		{
			if (stu[i].name[j] == *name)
				flag = 1;//一致
			else
			{
				flag = 0;//不一致
				break;
			}
			name++;
			j++;
		}

		if (flag == 1)//如果等于0就是没找到 ,进入下一个循环体
			return stu[i].num;
	}
}

int CalculateAllAverage(int code)
{
	int sum=0;
	for (int i = 0; i < 3; i++)
		sum = sum + stu[i].score[code];
	

	return sum / 3;

}

int main()
{
	for (int i = 0; i < 3; i++)
	{
		
		scanf("%s %d ", stu[i].name, &stu[i].num);
		for (int j = 0; j < 3; j++)
		{
			scanf("%d", &stu[i].score[j]);
		}

	}
	int num;
	printf("请输入学号查找学生平均分:");
	scanf("%d", &num);
	printf("%d\n", CalculateAverage(num));
	char name[20];
	printf("请输入学生名字查找学生学号:");
	scanf("%s", name);
	printf("%d\n", GetNum(name));//传递的是查找名字的首地址地址
	int code;
	printf("请输入学科代码输出学科平均分:");
	scanf("%d", &code);
	printf("%d\n", CalculateAllAverage(code));

	return 0;
}

-----------------------------------编程题完结--------------------------------------------------------------------------

问答题->

1.关键字static

答:static可以修饰局部变量,全局变量,函数。改变了生存周期和作用域。

当static修饰局部变量时,局部变量的生存周期到程序结束才结束,当再次调用函数时会保留上次的值。

当static修饰全局变量时,全局变量的作用域减少,只能在被定义该全局变量的.c文件中引用,其他文件也不能通过extern进行访问,保护了数据的安全。

当static修饰函数时,改变了函数的作用域,只能在本文件中被调用。

2.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答:

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;   

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

3.局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。要用全局变量,需要使用(域解析符) ":: "

  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

4.关键字const

答:const的本意就是不变的,不易改变的。

const修饰普通类型的变量时,编译器会认为这是一个常量,其值不允许修改。

Const修饰指针变量时,可以分为三种情况,const修饰指针指向的内容,则内容不被改变;const修饰指针,则指针不背改变,const修饰指针和指针指向的内容,则指针和指针指向的内容不被改变。

Const修饰函数参数,也可以分为三种情况,修饰传递参数,则在函数体内部,参数不可被改变;修饰传递参数为指针时,可以防止指针被意外篡改;自定义类型的参数传递,需要临时对象复制参数,对于临时对象的构造,需要调用构造函数,比较浪费时间,因此我们采取 const 外加引用传递的方法。

Const修饰函数的返回值,也可以分为三种情况:const 修饰内置类型的返回值,修饰与不修饰返回值作用一样;const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改;const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想让用户干什么。

5.c语言关键字以及常见函数的补充说明:

答:

由ANSI标准定义的C语言关键字共32个:

auto double int struct break else long switch

case enum register typedef char extern return union

const float short unsigned continue for signed void

default goto sizeof volatile do if while static

根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。

一、数据类型关键字

A基本数据类型(5个)

void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果

char:字符型类型数据,属于整型数据的一种

int:整型数据,通常为编译器指定的机器字长

float:单精度浮点型数据,属于浮点数据的一种

double:双精度浮点型数据,属于浮点数据的一种

B类型修饰关键字(4个)

short:修饰int,短整型数据,可省略被修饰的int。

long:修饰int,长整形数据,可省略被修饰的int。

signed:修饰整型数据,有符号数据类型

unsigned:修饰整型数据,无符号数据类型

C复杂类型关键字(5个)

struct:结构体声明

union:共用体声明

enum:枚举声明

typedef:声明类型别名

sizeof:得到特定类型或特定类型变量的大小

D存储级别关键字(6个)

auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配

static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部

register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数

extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用“

const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)

volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值

二、流程控制关键字

A跳转结构(4个)

return:用在函数体中,返回特定值(或者是void值,即不返回值)

continue:结束当前循环,开始下一轮循环

break:跳出当前循环或switch结构

goto:无条件跳转语句

B分支结构(5个)

if:条件语句

else:条件语句否定分支(与if连用)

switch:开关语句(多重分支语句)

case:开关语句中的分支标记

default:开关语句中的“其他”分治,可选。

C循环结构(3个)

for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件

do:do循环结构,do 1 while(2);的执行顺序是1->2->1...循环,2为循环条件

while:while循环结构,while(1) 2;的执行顺序是1->2->1...循环,1为循环条件

以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。

6.什么是形参,什么是实参?

答:实参就是真是传递给函数的参数叫做实参。而形参是指函数名后面中的变量,因为形式参数只有在函数被调用时才会被实例化,形参被实例化后相当于是对实参的一份临时拷贝。当函数被调用完成之后就会自动销毁。或者说实参是传址操作,而形参是传值操作,对形参的修改不会影响到实参。

7.作用域和及生命周期

答:通常来说一段代码所用到的名字并不是一直有效的,而限定这个名字可行性的代码范围就是这个名字的作用域。局部变量的作用域就是变量所在的局部范围,全局变量的作用域是整个工程。

生命周期指的是变量的创建到变量的销毁的一个时间段。局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期停止。全局变量的生命周期是整个程序的生命周期。

8.指针与指针变量的定义是什么?

答:一个变量的(内存)地址称为该变量的“指针”,通过指针能找到以它为地址的内存单元。

而指针变量是用来存放另一个变量的地址的(即指针)。

比如: int a=10;                               内存中:0x00ff23ff:00001010

       Int *p=&a;//p就是一个指针变量。

9.c语言的运算符有哪些?

答:c语言运算符有以下几个类型

算数运算符:+ - * / % ++ --

关系运算符:> < = != >= <=

逻辑运算符:逻辑与运算符&&(并且)、逻辑或运算符||(或者)、逻辑非运算符!(用来逆转操作数的状态)

位运算符 :与运算符&(有0得0)、或运算符 |(有1得1)、异或运算符^(相异出一,相同出零)、取反运算符~(按位取反)

赋值操作符:= += -= /= *= %=(进行完运算之后,再赋值给左边的操作数)、左移<<=,右移>>=,

以及与或异或也可完成上述操作。

10.c语言实现的选择语句有哪些,有什么区别?

答: c语言实现选择语句有if-else,Switch-case-break,三目操作符(表达式?表达式:表达式)。If-else:如果if括号里的表达式为真,则执行if里面的语句,如果为假则跳过,执行吓一条。如果遇到if-else if-else if-else的情况,则会一个一个判断,只要有一个为真就会执行为真的那条语句,前面的条件都为假,则会执行最后一条else指令。

Switch-case-break:一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。Switch括号里面必须是一个常量表达式,必须是一个整形或者枚举类型。每个case后面必须有一个break,如果不加break程序会顺序执行,直到遇到break才会停止。

三目操作符(表达式?表达式:表达式):问号前的表达式是否为真,为真执行第一个表达式,为假执行第二个表达式。

11.Break与continue的区别是什么?

答:break放在循环体内部是跳出当前循环,执行后面的指令。而continue是跳出当前循环,再次判断是否满足条件。或者说break是向下跳出,continue是向上跳出。

12.学生的姓名学号分数通过一个变量来描述,如何定义?关键字是什么?通过该变量对分数进行访问,需要用到什么运算符?

答:学生的信息我们可以用一个struct结构体来描述,姓名用char,学号可以用long int长整型,分数可以用float浮点型的数组。如果我们要访问学生成绩,一定会用到for循环进行查找。

13.c语言调用函数过程中,实参与形参之间进行数据传递,传递方式有两种,简述说明地址传递的方式?

答:c语言调用函数过程中会遇到传参的问题,实参指的是在内存地址中的内容,形参就是对内存地址中的内容进行了一次拷贝,改变形参并不影响实参,他们分别在不同地址中。传递方式有传值操作和传址操作,传值操作就是把形参传递给函数并不改变实参,而传址操作,就是把内存地址中存放的内容直接交给函数进行处理,这种情况会传递一个指针过去。

14.C语言中定义有返回类型的函数,在函数体内应该用return语句返回值,如果函数定义的返回值类型和return语句的返回值类型不一样,如何处理?

答:有两种解决方法,第一,从源头入手,把函数定义的类型改变与return返回类型一致。就是对return返回的值进行强制类型转换。

15.关于数据类型的阐述:

答:

整型

char

1字节

unsigned char

1字节

0-2^8

signed char

1字节

-2^7-2^7-1

int

4字节(4*8)

-2^32-2^32-1

unsigned int

4字节

0-2^32

short

2字节

-2^15-2^15-1

Unsigned short

2字节

0-2^16-1

long

4字节

-2^32-2^32-1

Unsigned long

4字节

0-2^32

浮点型

float

4字节

double

8字节

Long double

16字节

枚举类型

enum

空类型

void

派生类型

指针*

数组类型[]

结构体类型struct

共用体类型union

函数类型

16.定义宏以及条件预编译:

答:

 17.定义宏与函数的优缺点,区别?

18.#define的替换规则

答:

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值