期末复习_C、C++部分练习题

写在前面:

记录一些易混易错需要注意的题和涉及的基本知识点。

分类:

- 课下

- 课上

开始:


课下

1.已知 a = 12 ,则表达式 a  += a -= a *=a的值是( 0 )
2.设 int a = 12,则执行完语句 a += a -= a*a 后,a的值为( -264 )

涉及知识点:运算符的优先级

第一个是:a = a+[ a = a - (a = a*a)]
第二个是:a = a + [a = a - (a * a) ]

3.若 d 为double行变量,则表达式 d = 1,d+5,d++的值为( 1.0 )

涉及知识点:不同类型变量赋值

d+5 并没有接收

4.下面程序段输出结果为( 死循环)

x = 3;
do{  y=x--;
		if(!y) {printf(" * ");continue;
		printf("#");
	}while(x = 2 );//这里是赋值语句,不是判断等于
	

5.下面程序段输出的结果为( 3 1int n = 4;
while(n--)
	printf("%d",n--);
	//这里是 while( n = n-1) 
	

6.下面程序段输出的值为( 10int n = 9;
if(n++ < 10)//9 < 10进入,然后 9++
	printf("%d",n);
else
	printf("%d",n--);



涉及知识点:n–的执行步骤、赋值符号与判断等于符号的区分

n - -与n++ 和 - -n与++n 并不完全相同,在不是立刻使用变量的时候效果相同

若是在立即执行语句,n - - 是先使用n,在执行 n = n - 1;

见图:

在这里插入图片描述

Mooc_北理_期末题

涉及知识点:文件操作、结构体、指针、链表、部分动态数据结构

选择题

7.若有函数max(a,b),并且已使函数指针变量p指向函数max,当调用该函数时,正确的调用方法是(B

A.*p(a,b);
B. (*p)(a,b);
C. *pmax(a,b);
D. (*p)max(a,b);

8.设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是(B

A.for(p=a;a<(p+10);a++);

B. for(p=a;p<(a+10);p++);

C.for(p=a,a=a+10;p<a;p++);

D.for(p=a;a<p+10; ++a);

a+10是指向a[10];的 p<(a+10)就是p的地址通过p+=1;
依次往后加,但要小于a[10]的地址


a是字符数组名,是个常量,不能执行++a操作

整型数组
在这里插入图片描述
字符型数组
在这里插入图片描述

9.若一个局部变量的定义形式为static int x;,那么,其中static的作用应该是(D)

A.函数调用结束x重新赋值

B.将x存储在动态存储区

C.x只能在本文件内引用

D.使x的值可以永久保留

10.若函数调用时参数为基本数据类型的变量,以下叙述正确的是(A

A.实参与对应的形参分别占用不同的存储单元

B.实参将数据传递给形参后,立即释放原先占用的存储单元

C.实参与其对应的形参共占存储单元

D.只有当实参与其对应的形参同名时才共占存储单元

实参和形参是各占独立存储空间,函数调用过程中,实参向形参拷贝复制值。实参是个变量,形参也是个变量。

如果占用同一片空间的话,编译时候就不存在实参形参类型不匹配的报错

参数传递中,形参值的改变不影响实参的值。

11.设已有定义: char *st=“how are you”; 下列程序段中正确的是( C )

A.char a[ ], *p; strcpy(p=&a[1],st+2);

B.char a[11]; strcpy(++a, st);

C.char a[11], *p; strcpy(p=a+1,&st[4]);

D.char a[11]; strcpy(a, st);

C.strcpy(p=a+1,&st[4]);
从st[4]开始复制给p,最终p="are you"

B.a是字符数组名,是个常量,不能执行++a操作

D.因为*st="how are you";有11个字符,包括\0就有12个字符.
所以a[11]没有把\0复制过去.放不下

A.a[]没有声明多大的数组.

12.当定义一个结构体变量时,系统为它分配的内存空间是(B)

A.结构中当前使用成员所需的内存容量

B.结构中各成员所需内存容量之和

C.结构体中占内存容量最大者所需的容量

D.结构中第一个成员所需的内存容量

13.设有如下定义:

struct jan

{    

int a;

float b;

}  c2,*p;

若有p=&c2;则对c2中的成员a的正确引用是(B)

A.p->c2.a

B.(*p).a

C.(*p).c2.a

D.jan.a

14.以下结构体定义错误的是(B)

A.struct ord {int x; int y} ; struct ord a;

B.struct ord {int x; int y} struct ord a;

C.struct ord {int x; int y} a;

D.struct {int x; int y} a;

定义结构体类型变量三种形式:

先声明结构体类型,在后面 struct 结构体名 变量名 ;类似A,要注意和上面声明的结构体用“;”隔开.

在声明的同时定义变量,像C这种.

直接定义结构体类型变量,不出现结构体名,像D这种.

15.若有以下说明和语句,则值为6的表达式是(B)

struct st 

       { int n;

         struct st *next;

        };

    struct st a[3],*p;

    a[0].n=5; a[0].next=&a[1];

    a[1].n=7; a[1].next=&a[2];

    a[2].n=9; a[0].next='\0';

    p=&a[0];

A.p+±>n

B.++p->n

C.(*p).n++

D. p->n++

提示:运算符->的优先级高于++

16.文本文件file.txt中的内容是字符串“Today is Monday”,若定义FILE fp; char str[80];指向如下语句fp=fopen(“file.txt”,”r”); fscanf(fp,”%s”, str); 之后, 数组str中的内容是(D)

A.T

B.Today is Monday

C.Today is

D.Today

fscanf 是可以读入空格的, fscanf(fp,"%c",&c)  就可以读入空格。
 
fscanf(fp,"%s",str ) , %s 是以空格为分隔单位的, abc def 会被看成两个字符串。

若要读入一行 可以使用 fgets(fp,str)

17.要打开一个已存在的非空文件“file”用于修改,选择正确的语句是(C)

A.fp=fopen(“file”,“r”);

B.fp=fopen(“file”,“w”);

C.fp=fopen(“file”,“r+”);

D.fp=fopen(“file”,“a+”);

方式“a+”为以读/写方式打开一个文本文件,保留文件中原有的数据;

18.若需要将文件指针在一个打开的文件file.txt移动到文件首,则正确的函数是(C)

A.feof

B.ftell

C.rewind

D.fseek

填空

19.下面程序的功能是由键盘输入n,求满足下述条件的x、y:nx和ny的末3位数字相同,且x≠y,x、y、n均为自然数,并使x+y为最小。

pow3(int  n,int  x)

{int i,last;

for(last=1,i=1;i<=x;i++)

last=3】  ;

return(last)}

main()

{int  x,n,min,flag=1scanf("%d",&n)for(min=2;flag;min++)

for(x=1;x<min&&flag;x++)

if(4&&pow3(n,x)==pow3(n, min-x))

{printf("x=%d, y=%d\n",x,min-x);

  【5】   ;

}

}

【3】中应该填写:last*n%1000

【4】中应该填写:x!=min-x

【5】中应该填写:flag=0

网络中心招新题
  1. 用你感觉最好的查找算法,在一个10个整数的数组(34,91,83,56,29,93,56,12,88,72)中找出最小数和其下标。
#include<stdio.h>
int main()
{
	
	int arr[10] = {34,91,83,56,29,93,56,12,88,72};
	int t = 0,i,j;
	int min = arr[0];
	
	for(i=1;i<10;i++){
		if(arr[i]<min){
			min = arr[i];
			j = i;
			
		}
	}
	
	printf("最小的数:%d\t下标为:%d",min,j);
} 



在这里插入图片描述

  1. 编程求1!+ 2!+ 3!+ 4!+ …+ 12!
#include<stdio.h>
#define N 12
int jiecheng(int n){
		int i,s = 1;
		for(i=1;i<=n;i++){
			s *= i;
		}
		return s;
}
int main()
{
	
	int S,i,t;
	for(i=1;i<=12;i++){
		t = jiecheng(i);
		S += t;
	}
	printf("%d",S);
	
}

在这里插入图片描述

  1. 已知X为整数,且[X] 补 = 10011011,则X的十进制数值是__-101____。

一、正整数的原码、反码、补码完全一样,即符号位固定为0,数值位相同

二、负整数的符号位固定为1,由原码变为补码时,规则如下:

1、原码符号位1不变,整数的每一位二进制数位求反,得到反码

2、反码符号位1不变,反码数值位最低位加1,得到补码

解析如下: 第一位代表符号,1表示是负数,

将X的补码除符号位以外,其他每位取反,末位加一,可以得到X的原码:

[X] 补 = 10011011---->以1开头,为负---->去1----->0011011

[X] 反= 0011011 + 000 0001 = 001 1010

[X] 原 = 取反+ 符号位1 :1110 0101

X = -( 64 + 32 + 4 + 1) = -101

待续…


课上

验证数组定义是否可以用括号

#include<iostream>
using namespace std;
int main()
{
	float my(12);
	cout<<my; 
//	char ch[7] = "hello!" ;如果为6就报错 
	char ch[6] = {'h','e','l','l','o','!'} ;
	cout<<ch;
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scl、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值