写在前面:
记录一些易混易错需要注意的题和涉及的基本知识点。
分类:
- 课下
- 课上
开始:
课下
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 1 )
int n = 4;
while(n--)
printf("%d",n--);
//这里是 while( n = n-1)
6.下面程序段输出的值为( 10 )
int 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=1;
scanf("%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
网络中心招新题
- 用你感觉最好的查找算法,在一个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!+ 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);
}
- 已知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;
}