C语言专升本例题

  • 本篇内容适合对书中内容粗过一遍的读者进行深入了解,亦适合考前突击
  • 如有错漏,感谢指正
  • 有问题在下方留言

1.有下列代码,求最终s值

int s=0,k;
	for(k=7;k>=0;k--){
		printf("for循环进入k值为%d\n",k);
		switch(k){
			case 1:printf("k为%d,此时s为%d\n",k ,s);
			case 4:printf("k为%d,此时s为%d\n",k ,s );
			case 7:s++;printf("k为%d,此时s为%d\n",k ,s );break;
			case 2:printf("k为%d,此时s为%d\n",k ,s );
			case 3:printf("k为%d,此时s为%d\n",k ,s );
			case 6:printf("k为%d,此时s为%d\n",k ,s );break;
			case 0:printf("k为%d,此时s为%d\n",k ,s );
			case 5:s+=2;printf("k为%d,此时s为%d\n",k ,s );
			break;
		}
	}

输出如下
C语言专升本例题_第1张图片

  • 注意break,没有break跳出循环,往下执行了

2.输入一段英文,计算其中有多少单词,每个单词用空格隔开

	char str[255];
	char a;
	int num;
	gets(str);
	for (int i = 0; (a=str[i])!='\0' ; i++)
	{
		if(a==' '){
			num++;
		}
		//计算有哪些单词
		
		
	}
	num++;

	printf("word amount %d\n",num);

3.在内存中存储一个字符 ‘a’ 占用 1 个字节,而存储字符串"abcde"则占用 6 个字节

//char字节长度1,字符串字节长度要算上末尾的\0

4.

	char a,b;
	int c,d;
	scanf("%c%d%d%c",&a,&c,&d,&b);
	printf("%c,%d,%d,%c",a,c,d,b );

5.printf数值格式控制

	int x=38;
	double y=8.57; 

	printf("%1d\n",x);//38
	printf("%2d\n",x);//38
	printf("%3d\n",x);// 38

	printf("%3.2f\n",y);//8.57
	printf("%3.1f\n",y);//8.6
	printf("%3.0f\n",y);//  9
	printf("%2.2f\n",y);//8.57
	printf("%3.3f\n",y);//8.570
	printf("%4.2f\n",y);//8.57
	printf("%-4.2f\n",y);//8.57
  • d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。
    %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。

  • f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法: %f:不指定宽度,整数部分全部输出并输出6位小数。
    %m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
    %-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。

  • 其中,小数点也占一位

6.比较两数组大小

	char aa[]={'1','2','3'};
	char bb[]={"123"};
	printf("%d\n",sizeof(aa) );//3
	printf("%d\n",sizeof(bb) );//4
	char aa[3]={'1','2','3'};
	char bb[3]={"123"};
	printf("%d\n",sizeof(aa) );//3
	printf("%d\n",sizeof(bb) );//3

7.#define的带参计算

#include 
#define P 2
#define power(x) P*x*x

int main(){
    int x=1,y=2;
    printf("%d\n%d\n",power(x+y),power(y+x) );
    //输出6,7
	return 0;
}
  • x+y,x=1+2=>P * 1+2 * 1+2

8.去除字符串中的指定字符

#include 

int main(){
    char s[]="**abc*d****";
    char a='a';
    int x,y;
    //外层遍历字符串
    for(x=y=0;s[x]!='\0';x++){
    	//内层重新赋值字符串
    	if(s[x]!=a){
    		s[y]=s[x];
    		y++;
    	}
	}
	//添上结束标识符
	s[y]='\0';
	printf("%s\n", s);
	//输出**bc*d****
	return 0;
}

9.( * b)++与*b++

#include 
int main(){
    int a=1,*b=&a;
    printf("%d\n",*b );//1
    printf("%d\n",b);//6422036
    printf("%d\n",*b++ );//1
    printf("%d\n",*b );//6422040
    printf("%d\n",b);//6422040
	return 0;
}
#include 
int main(){
    int a=1,*b=&a;
    printf("%d\n",*b );//1
    printf("%d\n",b);//6422036
    printf("%d\n",(*b)++ );//1
    printf("%d\n",*b );//2
    printf("%d\n",b);//6422036
	return 0;
}
  • (*b)++将指针b中所存放的值++
  • *b++将指针所指向的地址++,原理:++与 *同优先级,自右向左,右结合性,等价于 *(b++)

10.二级指针

#include 
int main(){
    int a=1;
    int *b=&a;
    int **c;
    *c=b;
    printf("%d\n", *b);//1
    printf("%d\n", *c);//b的地址
    printf("%d\n", **c);//1
	return 0;
}

11.求数字长度

//随机输入一个数字,得出其长度
//常用于编程题,例如回文数
#include 

int main()
{	
	int a;
	scanf("%d",&a);

	int b=10,c=1;
	for (int i=0; ; i++)
	{
		if (a/b != 0)
		{
			b*=10;
			c++;//计算位数
		}
		else
		{
			break;
		}
	}
	printf("变量a位数为:%d\n", c);

	return 0;
}

12.逗号表达式与逗号运算符

#include 

int main()
{
	int a;

	printf("%d\n",a=(a+1,a+2,a+5) );//5
	a=3,a++,a+1;
	printf("%d\n",a );//4
	printf("%d\n",(a=3,a++,a+1) );
	//5,a赋值为3,中间a++,按a+1输出

	return 0;
}
  • 逗号运算符与逗号表达式(哪个是哪个我忘了)
  • 写法一:a=式1,式2,式3;等于优先级大于逗号,a=式1
  • 写法二:如果需要返回值,添上括号,为(a=式1,式2,式3),a=式1,按式3返回
  • 写法三:a=(式1,式2,式3,),返回式3
  • 如果等号后面有赋值情况出现,等号优先级大于逗号

13.数组升序排列(冒泡排序,降序同理)

#include

int main()
{
	int a[10]={1,2,3,1,2,31,1,4,9,11};

	for (int i = 0; i < 10; i++)
	{
		int b;
		for (int j = 1; j < 10; j++)
		{
			if (a[j-1]>a[j])
			{
				b=a[j];
				a[j]=a[j-1];
				a[j-1]=b;
			}
		}
	}

	for (int i = 0; i < 10; ++i)
	{
		printf("%d\n",a[i] );
	}

	return 0;
}

14.同上,使用指针方法实现数组排序

#include 

int main()
{
	void change(int *a);
	int a[10]={1,2,3,4,5,6,7,8,9,0};
	int i;

	change(a);

	for (i = 0; i < 10; ++i)
	{
		printf("%d\n",a[i] );
	}

	return 0;
}


void change(int *a){

	int x;//中间值
	for (int i = 0; i < 10; ++i)
	{
		for (int j = 1; j < 10; ++j)
		{
			if (*(a+j-1)<*(a+j))
			{
				x=*(a+j-1);
				*(a+j-1)=*(a+j);
				*(a+j)=x;
			}	
		}
	}
}

15.使用指针方法打印二维数组

#include 
#include 

int main()
{
	void average(int (*a)[4]);

	int a[3][4]={55,43,65,0,35,65,91,0,54,64,23,0};
	//传参数组指针指向二维数组只写列数
	average(a);
	//数组指针=&a;而非=a;两者地址相同类型不同

	return 0;
}

void average(int (*a)[4]){
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 4; ++j)
		{
			printf("%d\n",(*(a+i))[j] );
			//优先级*小于[],错误写法*(a+i)[j]
			//等价printf("%d\n",*(*(a+i)+j) );
		}
	}
}

16.打印乘法口诀表

#include 

int main()
{
	//乘法口诀表
	int i,j;
	for (int i = 1; i < 10; ++i)
	{
		for (int j = 1; j <=i ; ++j)
		{
			printf("%d*%d=%d ",j,i,i*j );
		}
		printf("\n");
	}

	return 0;
}

17.判断回文数

#include 
#include 

int main()
{
	int num,a=0,b;
	scanf("%d",&num);
	//思路:反向赋值给另一个数,对比来判断是否一致
	b=num;//b替num给a赋值
	while(b>0){
		a=a*10+b%10;//a最高位存b最低位,a*10
		b/=10;//略去最低位,十位变个位,b/10
	}

	if (a==num)
	{
		printf("为回文数");
	}
	else{
		printf("不为回文数");
	}

	return 0;
}

18.

#include 

int a,b;

void fun(){
	a=100;
	b=200;
}

int main()
{
	int a=1,b=2;
	fun();
	printf("%d\n",a+b );//输出3

	return 0;
}

19.C语言对嵌套if语句的规定是: else总是与【D】配对

  • A)最近的if
  • B)第一个if
  • C)缩进位置相同的if
  • D) 其之前最近的尚未配对的if

20.求素数

#include 
int main(){

	int a=1;
	for(int i=100;i<=200;i++){
		a=1;
		for(int j=2;j<i;j++){
			if(i%j!=0) ;
			else a=0;
		}
		if(a){
			printf("%d\n",i );
		}
	}

	return 0;
}

21.求数组最大值索引

#include 

int main(){
	int x[3][3]={11,22,33,44,55,44,33,22,11};
	int a=0,b=0;
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			if(x[i][j]<x[i][j+1]){
				a=i;
				b=j+1;
			}
		}
	}
	printf("%d,%d",a,b);
	
	return 0;
}

22.

#include 

int main(){
	struct Data{
		char a[5];
		int b;
		float c;
		double d;
	}num;
	printf("%d\n",sizeof(num));

	return 0;
}
  • C语言一个存储单元是4字节,理论上,该题所占字节为,1*5+4+4+8=22,实际输出却为24,原因在于char数组存储时,前四位存放在同一存储单元(4字节),最后一位存放在下一个存储单元(4字节),在计算大小过程中,算上了这一存储单元的整个大小,即24

23.

#include 

int main(){
	union{
		char a[2];
		int b;
	}num;
	num.b=0x4321;//0100 0011 0010 0001
	printf("%x,%x",num.a[0],num.a[1]);
	//输出21,43

	return 0;
}

24.

#include 

int main(){
	
	int a[5]={1,2,3,4,5};
	int *str=(a+1);
	printf("%d\n", *(str-1));//1

	str=(int *)(&a+1);
	printf("%d\n%d", *(a+1),*(str-1));//2,5
	
	return 0;
}

25.

#include
void fun(int *a,int *b,int *c){
    int *t;
    t=a;a=b;b=t;
    *t=*b;*b=*c;*c=*t;
    printf("%d %d %d",*a,*b,*c);//733
}
int main(){
    int a=5,b=7,c=3;
    int *p1=&a,*p2=&b,*p3=&c;
    fun(p1,p2,p3);
    printf(" %d %d %d",a,b,c);//373
}
  • fun(a5,b7,c3)传入
  • t存放地址a,a存放地址b,b存放地址t,t存a,即b存放地址a
  • 上一条的基础上
  • *t=*b => *(&a)= *(&a)=5
  • *b=*c => * (&t)= *(&a)=3
  • *c=*t => *(&c)= * (&t)= *(&a)=3
  • *(&b)未变,即为7
  • a为b,b为a,输出733
  • ab调换,输出373

26.strlen

int main(){
	
	char str1[]={'1','2','3'};
	printf("%d\n", strlen(str1));

	char str2[]="123";
	printf("%d\n", strlen(str2));

	char str3[3]={'1','2','3'};
	printf("%d\n", strlen(str3));

	char str4[3]="123";
	printf("%d\n", strlen(str4));

	printf("%d\n",strlen("abcd") );
	printf("%d\n",strlen("\t\"\xff\065\n") );
	printf("%d\n",strlen("\141\\141abc\t") );
	printf("%d\n",strlen("hello\0\t\'\\") );

	return 0;
}
  • 6369(前四项)
  • 4595(后四项)
  • 多观察转义字符,\0直接计算长度不会录入(后四项)

27.

	int a,b,c;
	a=b=c=1;
	++a || ++b && ++c;
	printf("%d%d%d\n",a,b,c );//211短路现象

28.最大公约数与最小公倍数(两数)

#include 

//最小公倍数
int minint(int a,int b){
int i =a*b;
return i;
}

//最大公约数
int maxint(int a,int b){
int i;
for(i=1;i<a ;i++){
if((i%a==0)&&(i%b==0)){
break;
}
}
return  i;
}

int main(){
//最大公约数,最小公倍数
int a,b,maxx,miny,sizez;
scanf("%d,%d",&a,&b);

int minint(int a,int b);
int maxint(int a,int b);

//最小公倍数
if(a>b){
miny=minint(a,b);
maxx=maxint(b,a);
}
else{
miny=minint(b,a);
maxx=maxint(a,b);
}

printf("最小公倍数为:%d\n",miny);
printf("最大公约数为:%d",maxx);

}
  • 三数或以上略难,道理基本相同

29.

	int a,b;
	printf("%d",',');//键值44
	scanf("%d%d",&a,&b);//输入1,2
	printf("%d%d\n",a,b );
  • 输出116,格式控制内无逗号,实际输入有逗号

30.

#include 

int main(){

	char a='\xfa',b='\123';
	printf("%c\n%d\n", a,a);
	printf("%c\n%d", b,b);

	return 0;

}
  • ?
  • -6
  • S
  • 83

31.

#include 
#include 

int main(){
	void fun(char *s);
	char *s;
	fun(s);
	puts(s);//空

	return 0;
}

void fun(char *s){
	char t[10]="12";
	s=t;
	strcpy(t,"example");
}
  • 调用函数,传递实参地址s
  • fun函数中,形参s接收实参s
  • s=t,形参s指向t,跟实参s无关

32.删除数组指定字符

#include 

int main(){
	int a[10]={1,2,3,4,5,6,7,8,9,0},b[10],c;
	void fun(int a[10],int b[10],int c);
	scanf("%d",&c);
	fun(a,b,c);
	a[9]='\0';
	for (int i = 0; i < 9; ++i)
	{
		a[i]=b[i];
		printf("%d\n",a[i] );
	}
	return 0;
}

void fun(int x[10],int y[10],int z){
	int i,j;
	for (i = 0, j = 0; i < 10; ++i)
	{
		if (x[i]==z)
		{
			continue;
		}
		y[j++]=x[i];
	}
}
  • 整形数组,注意不能使用strcpy()

33.
数组在内存中占一片(连续)的存储区,由(数组名)代表它的首地址
数组名是一个(地址)常量,不能对它进行赋值运算

34.指针数组与二维指针

#include 

int main(){
	int a[]={5,4,3,2,1};
	int *p[]={a+3,a+2,a+1,a};
	int **q=p;
	printf("%d\n",*(p[0]+1) );
	printf("%d\n",**(q+2));

}
  • *(p[0]+1) => * (a+3+1) => 1
  • **(q+2) => **( ( p ) +2) => ** ( ((a+3)+ 2) ) => ( ( a + 1 ) ) => 4
  • 注意指针数组与二维数组的套路

35.指针复杂使用

#include 

int main(){
    int a[12]={0,1,2,3,4,5,6,7,8,9,10,11},*p[3],**pp,i;
    for (int i = 0; i < 3; ++i)
    {
    	p[i]=&a[i*2];
    }
    pp=p;
    printf("%d\n",pp[0][11] );//11
    printf("%d\n",*(*(p+2) + 2));//6
    printf("%d\n",*( (p[0]+1) + 2));//3
    printf("%d\n",p[0]+1 + 2);//地址
    printf("%d\n",p[3][1]);//无
}

36.用递归方法求阶乘

#include 

int main(){
	int fun(int x);
	int a;
	scanf("%d",&a);
	printf("%d\n", fun(a+1));

	return 0;
}

int fun(int x){
	static int z = 1;
	x--;
	if (x!=0)
	{
		z*=x;
		fun(x);
	}

	return z;
}

37.变量作用域

int main(){
	int fun(int n);
	int s=0,i=0;
	for (; i < 2; ++i)
	{
		s+=fun(i);	
	}
	printf("%d\n",s );

	return 0;
}

int fun(int n){
	int t=0,a=5;
	if (n/2){
		int a=6;
		t += a++;
	}
	else{
		int a=7; 
		t += a++;
	}
	return t +a++;
}
  • 24
  • 在局部,局部变量与更大的局部变量冲突时,优先局部变量

38.打印菱形四边形

#include 

int main(){
	int i,j,k,z;
	for (i = 0 , z = 1 ; i < 4; i++ , z++)
	{ 
		for (j = 3 ; j > i ; j--)
		{
			printf(" " );
		}
		for (k = 0 ; k < i+z ;  k++ )
		{
			printf("*");
		}
		printf("\n");
	}

	for (i = 3 , z = 2; i > 0 ; i-- , z--)
	{
		for (j = 4; j > i ; j--)
		{
			printf(" ");
		}
		for (k = 0; k < i+z; k++)
		{
			printf("*");
		}
		printf("\n");
	}
	
	return 0;
}
  • k打印*
  • j打印空格
  • i为行数
  • i,z联合控制 * 打印个数

39. 表达式 !(x>0 || y>0) 等价于

  • A.!x>0||!y>0
  • B.!(x>0)||!(y>0)
  • C.!x>0&&!y>0
  • D.!(x>0)&&!(y>0) //此项

40.

union myun{
	struct 
	{
		int x,y,z;
	} u;
	int k;
}a;

int main(){
	a.u.x=4;
	a.u.y=5;
	a.u.z=6;
	a.k=0;
	printf("%3d\n",a.k );

	return 0;
}
  • 输出4
  • 共用体,不断覆盖上一个值

本篇全部为我手打且运行过,专升本成功,目前在准备考研,这篇文章应该不会再更新,专升本考试内容基本都差不多,希望对你有所帮助
灵魂与肉体至少总要有一个在前行,加油

你可能感兴趣的:(C语言程序设计,c语言)