c语言重点知识梳理

本文详细解析了计算机基础知识中的地址总线与存储容量计算,字符常量与数据类型转换,输入输出函数的使用,指针操作,字符串处理,宏定义以及编程题的解答,包括冒泡排序,学习优良奖的条件判断,二维矩阵的转置和最大值查找,结构体的应用等知识点。
摘要由CSDN通过智能技术生成

计算机基础知识

1、若计算机有 32 根地址总线,则其存储器的最大存储容量可达(C )。
				A、32MB      B、32GB    C、4GB     D、8G

结题思路:232先从bit位开始计算,首先1024即210等于1kb,类似的计算出1MB需要220,1GB需要230bit,那么232=230*4 - >4GB

2、下列数据表达的数值与十进制 77 不相等的是(B )。
					A、0x4D		 B、0x4B			 C、0115			 D、1001101

本题纯计算,第一、二个代表的是十六进制数,既然同是十六进制位数,那么答案一定出现这两个之间。第一个值:4 * 16 + 13 *1 = 77 ,那么直接选B

3、以下选项中不属于字符常量的是( B)。
					A、’C’      B、”C”       C、’\x0C’      D、’\072’

这道题直接先看符号,只有一个不同选不同的。(题感法)
先说一下字符常量的表示:只能用单引号且有转义字符 \ 时才能写入多个字符,双引号表示的字符串。

程序题

1、如有下列程序,输入数据:12345 678后,程序输出的结果是B
#include<stdio.h>
int main( )
{ 
		int x;
		double y;
		scanf(%3d%f”,&x,&y);
		printf(%d,%f\n”,x,y);
		return 0;
}
A、12345,678.000000 			B、123,45.000000
C、123,不确定的随机数 			D、345,678.000000

这道题考察的是对于scanf输入方法的使用,%3d表示的是限制了输入的数据的长度不超过3,
所以第一个输入的数据是123,输出也是一样。
第二个不同的是它接受的是浮点数,浮点数即是小数,首先我们要知道scanf在遇到空格时会对上一个输入过程进行终止,其次是上一次的数据还未输入完成,仅仅只输入了三个,所以对于下一个输入剩余数字,但是在3后面出现了空格所以终止了输入,第二个输出也是浮点类型,所以选带小数的。

2、若 d 是 double 型变量,表达式”d=1,d=5,d++”的值是==( C)==。
				A、1.0	 		B、2.0 			C、5.0				 D、6.0

本题的表达式是从左边往右计算当计算到d++时,先不计算所以还是5
扩展:d++先赋值再运算,++d先计算再赋值。

3、阅读下面的程序
#include<stdio.h>
void main()
{
	char ch;
	scanf("%3c",&ch);
	printf("%c",ch);
}
如果从键盘上输入
abc<回车>
则程序的运行结果是  A
A) a 	B) b 	C) c		 D) 程序语法出

这里考察的是printf中的输出数据类型%c,它指定的是输出字符,字符只能有一个,所以不论它输入多少,都只返回第一个。

4、以下不能对二维数组 a 进行正确初始化的语句是C
A、int a[2][3]={0};
B、int a[][3]={{1,2}, {0}};
C、int a[2][3]={{1,2}, {3,4}, {5,6}};_//这个数组是两行三列的数组。它表示的是三行两列。_
D、int a[][3]={1,2,3,4,5,6};
5、表达式C的值不是 1。
			A、4<0?0:1      B、5>=1
			C、!EOF         D、!NULL

A选项是三目运算符:计算的逻辑是先判断<两边是否为正,正则赋值问号后的值,否则赋值冒号后面的值,所以A项为1
B项一眼就能看出来是对的,所以是1
C项EOF是打开文件时的一个标志,它代表的、是-1,非 -1 可以是0,所以直接错。选择C项。
D项NULL的值是0,非0则是1。

6、设 p1 和 p2 是指向同一个字符串的指针变量,c 为字符变量,则以下不能正确执行赋值语句的是 B
			A、c=*p1+*p2 			B、p2=c-5
			C、p1=p2 				D、c=*p1*(*p2)

这里考察的指针的知识,对于指针指向的是一个地址,指针通过地址获取数据。
例如:int * p = a 它表示的是一个整形指针指向a这个地址。那么从这可以看出 *p 就是a这个地址中存放的数。所以对数进行运算可以,但是地址不行。所以选择B项。

7、执行下面的程序段后,变量 ab 的值是(A)
int *var,ab=100;
var=&ab; 
*var+=10; 
var+=10;
	A.110 		B. 100 		C. 0 	D.120

这道题用来巩固上一问,首先var这个指针指向了ab这个地址,所以此时对指针的运算将影响到原来的地址,
*var是值,var是地址,所以只能对值进行计算,所以只有第三行的代码对当前指针指向的地址的值进行了运算使得ab加上了10变成了110,而第四行是改变了指针指向的地址,对值没有影响。

8、将两个字符串 s1 和 s2 连接起来,正确的函数是(B )
		A. strcpy(s1,s2) 				B. strcat(s1,s2) 			C. strcmp(s1,s2) 			D. strlen(s1,s2)

A项的函数方法是覆盖拷贝,是将第二个数据覆盖第一个数据。
B项是字符串的连接,将第二个连接到第一个字符串之后。
C项是字符串长度的比较方法,如果第一个大于第二个则放回大于0的数,等于则0,小于则返回小于0的数。
D是判断字符串长度,只能传一个参数,所以D直接排除。

9、以下不能正确对字符串初始化的语句是(C )
		A. char str[]={"good!"}; 	B. char *str="good";
		C.char str[5]="good!"; 		D. char str[6]={'g','o','o','d','!','\0'};

用数组存入字符串时,数组长度永远要大于(不能等于)字符串元素的个数,因为要留一个空位给 ‘\0’

10、函数 f 定义如下,执行语句“sum=f(5)+f(3);”后,sum 的值应为C
int f(int m)
{ 
	static int i=0; int s=0;
	for(;i<=m;i++) s+=i; 
	return s;
}

这里考察的是static静态变量的使用,在它申明后只能被赋值一次,所以经过for循环后 i 的值一直是5,所以只有f(5)成功执行。而第二个因为刚开始 i 的值等于5,大于3所以直接返回。最后计算结果为15.

A、 21 			B、 16 			C、 15	 		D、8

宏定义

写出下面结果6,7
#include<stdio.h>
	#define P	2
	#define POWER(x)	P*x*x
int main()
{ 
		int x=1,y=2printf("%d,%d"POWER(x+y)POWER(y+x))return 0;
}

本题注意不要先算POWER()中的值,先将它放入宏定义内
2 * 1 + 2 * 1 + 2 这是第一个计算的表达式结果为6
2 * 2 +1 * 2 + 1 这是第二个计算的表达式结果为7

举一反三
#include<stdio.h>
#define SUB(X,Y)	(X)*Y
int main()
{ 
	int a=3,b=4printf("%d\n"SUB(a+b,b++))return 0}

这里猜一下结果是多少?

A.	28		B.	19		C.23		D.35

答案是A你算对了吗。这里和上面不同的是宏定义中X外面加入了小括号,所以这里是先计算a+b的值再进行后续运算。而第二个传入的参数b++是先将b原来的值带入宏中计算,之后再赋值,所以这里的表达式是(3+4)* 4 = 28。

编程题

第一题:

(1) 定义函数 int fun(int a[], int m); 实现查找小于或者等于 m 的所有素数并放在数组中,函数返回所求出的素数的个数。
(2) 定义主函数,主函数中首先定义一个数组 array;接着从键盘输入任意一个整数 m (<1000),然后调用函数 fun 输入数组和整数 m,并将查找出的素数和素数个数打印出来。

#include <stdio.h>
#include <string.h>
#define N 1000
int fun(int a[],int m){
	int i,t;
	int j=0;
	for(i=2;i<m;i++){
		
		if(i%2!=0){
			a[j]=i;
			j++;
			}
		}
	for(t=0;t<j;t++){	
		printf("%5d",a[t]);
		}
	printf("\n");
	printf("%d",j);
}
int main(){
	int m;
	int a[N];
	scanf("%d",&m);
	fun(a,m);
	return 0;
} 
第二题

(1) 定义函数int BubbleSort(int a[],int n),用冒泡法将数组元素按照从大到小的顺序排序。(4分)。
(2) 定义输入函数void Input(int a[],int n); 实现从键盘输入数组a中的n个元素(3分)。
(3) 定义输入函数void Print(int a[],int n); 实现输出数组a中的n个元素(3分)。
(4) 定义主函数,主函数中首先定义一个含15个元素的数组;接着调用Input函数输入10 个数组元素;在主函数中调用BubbleSort函数对数组的元素进行排序,并将排序的结果使用Print函数打印输出(5分)。

#include <stdio.h>
#include <string.h>
//冒泡排序
int BubbleSort(int a[],int n){
	int t;
	int i,j;
	for(i=9;i>=0;i--){
		for(j=0;j<i;j++){
			if(a[j]<a[j+1]){
					t=a[j+1];
					a[j+1]=a[j];
					a[j]=t;
				}
			}
		}
	}
//数组的输入
void Input(int a[],int n){
	int i;
	for(i=0;i<n;i++){
		scanf("%d",&a[i]); 
	}
}
//数组的打印
void Print(int a[],int n){
	int i;
	for(i=0;i<n;i++){
		printf("%d",a[i]);
	}
}

int main(){
	int a[15];
	Input(a,10);
	BubbleSort(a,10);
	Print(a,10);
	return 0;
}
第三题

在考生文件夹下,给定程序 pingyou.c 的功能是:学习优良奖的条件如下:所考 5 门课的总成绩在 450 分(含)以上;或者每门课都在 88 分(含)以上。 输入某学生 5 门课的考试成绩,输出是否够学习优良奖的条件。

#include<stdio.h>
int main()
{
	int a[5];
	int i,j,count,sum;
	for(i=0;i<5;i++)
	scanf("%d",&a[i]);
	for(j=0;j<5;j++)
	{
 	if(a[j]>=88)
	{
		count++;
	}
	sum+=a[j];
	}
	if(count==5 || sum >=450)
	{
		printf("优秀");
	}
	else
	{
		printf("不够优秀");
	}
	return 0;
 } 
第四题

输入一个 3×4 的二维整数矩阵,要求实现两个功能:(1)实现矩阵的转置;(2)遍历矩阵,输出矩阵中最大的数及其下标。

#include <stdio.h>
#include <string.h>
int main(){
	int a[3][4];
	int b[4][3];
	int i,j;
	//输入 
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			scanf("%d",&a[i][j]);
		}
	}
	//转置前 
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%d",a[i][j]);
		}
		printf("\n");
	}
	//开始转置 
	for(i=0;i<4;i++){
		for(j=0;j<3;j++){
			b[i][j]=a[j][i];
		}
	}
	for(i=0;i<4;i++){
		for(j=0;j<3;j++){
			printf("%d",b[i][j]);
		}
		printf("\n");
	}
	//遍历元素寻找最大值,并输出下标 
	int max;
	max=b[0][0];
	for(i=0;i<4;i++){
		for(j=0;j<3;j++){
			if(b[i][j]>max){
				max=b[i][j];
			}
		}
		printf("\n");
	}
	for(i=0;i<4;i++){
		for(j=0;j<3;j++){
			if(b[i][j]==max){
				printf("%d %d %d",max,i,j);
			}
		}
	}
	return 0;
}
第五题

5、 编写一个结构体类型的程序,定义一个结构体变量 struct student,其包含学号,姓名,三门课的成绩,成绩用数组保存,要求输入 10 个结构体变量学生的学号、姓名、3 门课程的成绩,求出总分最高的学生并输出。

#include <stdio.h>
struct student
{
    char num[20];
    char name[10];
    int score[3];
    int sum;
}st[10];
int main()
{
    int i,j,sum,max;
    for(i=0;i<10;i++)
    {
        printf("学号:");
        scanf("%d",&st[i].num);
        printf("\n姓名:");
        scanf("%s",&st[i].name);
        printf("\n语文:");
        scanf("%d",&st[i].score[0]);
        printf("\n数学:");
        scanf("%d",&st[i].score[1]);
        printf("\n英语:");
        scanf("%d",&st[i].score[2]);
    } 
    max=st[0].sum;
    for(i=0;i<10;i++)
    {
        st[i].sum=st[i].score[0]+st[i].score[1]+st[i].score[2];
        if(max<st[i].sum)
        max=st[i].sum;
        j=i;
    }
    printf("%d , %s  ",max,st[j].name);
    return 0;
}

    

第六题

6、 斐波那契数列(Fibonacci sequence),又称“黄金分割”数列,比如这样一个数列:1,1,
2,3,5,8,13,21,34,55,89… …数列从第 3 项开始,每一项都等于前两项之和。试用递归函数来实现斐波那契数列的求解。

#include <stdio.h>
#define N 1000
int fs(int n);
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d",fs(n));
    return 0;
}
int fs(int n)
{
	if(n==1)
	{
		return 1;
	}
	if(n==0)
	{
		return 0;
	}
	else
	{
		return fs(n-1)+fs(n-2);
	}
}

    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值