高教版二级程序设计C语言
判断题
- short _auto = 100-1 ; √
- long do =1L;×
- 在C程序中,语句之间必须要用分号(;)分隔 ×预编译语句没有,函数名括号后也没有
- 在程序中#include行和#define行不是C语句 √
- 命令行不属于C程序√
- n1 =(n2/(n3=0)); 算术除零异常,赋值语句没有问题 x
- n1/=n2+n3=1; 赋值语句出问题,左边为表达式 x
- 已知定义语句:long a;int k;则能给a赋40000为:
a = 20000 +20000; 若右边为int2B存储,直接溢出 x
a = 400010; 同样若右边为int2B存储,直接溢出 x
k =40;a =k100; 右边溢出 x
a = 4000; a = a *10; 因为4000能保存,自动类型转换 √ - 定义语句 int N=80;int a[N]; ×
- char a[10] ; a =“stop”; ×
- char *a; scanf(“%s”,a) ; ×
- void fun(char *s); fun(‘t’) ×
- 字符串常量: “It’s” ×
- 字符串常量:“M = \abc” √
- char sz[2][20] ;sz[1]=“abc”;×
- char *ps = “12”;printf(“%c”,ps);×
- 使用函数或宏命令对C的源程序都没有影响× 宏展开,源程序变长
- 函数具有类型,宏无类型√函数有返回值类型,形参类型
- 函数调用和带参数的宏调用都是将实参的值传给形参 × 函数调用先计算实参表达式;宏调用直接字符串代入
- 使用函数比使用宏运行速度快×函数调用在程序运行期间,宏调用在预编译时完成,所以宏调用不会占用运行时间但占用编译时间。
- 申请8个字符的动态存储空间,ps = (char*)calloc (8,sizeof(char)); √
- 申请8个字符的动态存储空间,ps = (char*)malloc(8); √
- 宏替换不进行语法检查 √
- # include 命令行可以出现在任意行的起始位置 √
- 用# include所包含的头文件可以是目标文件 ×
- 在定义共用体时,不能对其成员进行初始化 × 可以初始化,但是规定只能用第一个成员类型一致的值去初始化。
- 构成C程序的基本单位是函数 √
- 参加位运算的数据可以是任何类型的数据 × 浮点数不能用二进制数精确表示
- C语言中没有boolean类型 √
- enum em1 {1,one=4,two,8}; ×
- enum em2 {A,B,C+1,D}; ×
- fclose函数,意味着该文件从磁盘上被删除了 × 避免缓冲区中数据的丢失,防止破坏暂时不用的文件,为了释放文件指针
- do {}while; 、struct st{}; 、for( ; ; ) 分号不能丢 √
- sqrt((double)16) =4.000000 √
填空题
- 在C语言中用 非0 表示逻辑真, 表示 0 逻辑假
- 汉字占用 2B,字符占用 1B
- char str[] =“\0”; strlen(str) = 0
- char *p=“abc\0808\\xff”,则strlen(p+4) = 7 (注意%%,\ 从左边尽可能匹配)
- char b[] =“abcde”; b[2]='0’和 b[2] =0,puts(b) 分别输出: ab0de ,ab
- char cc[] = “12345\0abcde\n”;sizeof(cc) = 13; strlen(cc) =5
- 设有定义:char str[10],写出将"string"赋值给数组的语句: strcpy(str,“string”);
- 若希望限制某个函数在其他编译单元中被引用,该函数的存储类说明为: static
- 函数原型可以简单的由函数的 首部,加上一个其后的一个“;”构成
- 在C语言中,简单变量为实参时,它和形参之间的数据传递方式为 单向值传递
- 程序设计中的沃斯公式:程序 = 算法+数据结构
- 已知函数fread的调用形式未fread(buffer,size,count,fp),其中buffer代表什么是存放读入数据的地址或指向此地址的指针
- 若有表达式(exp)?a++:b–;则以下表达式中能完全等价于表达式(exp)的是 exp!=0
- 算法的评价指标:时间复杂度、空间复杂度、正确性、健壮性、可读性
- 算法的特点:有效性、确定性、有限性、输入、输出
- 数据结构:包括数据和结构,指有关系的数据元素的集合
- 在数据处理领域,通常把两两数据元素之间的关系用 前后件关系(直接前驱、直接后继) 来描述
- 交换类排序:冒泡、快速;插入类排序:简单插入、希尔;选择类排序:简单选择、堆排序
- 当今主导的程序设计风格:清晰第一、效率第二,即首先考虑程序的清晰易读,再考虑提高程序的执行速度、节省系统资源。
- 结构化程序设计的原则:自顶向下、逐步求精、模块化、限制使用goto语句
- 程序设计的基本结构:顺序、选择、循环,共同特点就是严格地只有一个入口和一个出口
- 面向对象的优点:与人类思维方式一致、稳定性好、可重用性好、可维护性好、容易开发大型软件产品
- 绝对误差不超过0.001:while(fabs(n-m)>0.001)
程序结果题
- 预编译
设有一个文件init.a的源文件如下:
int a=2,b=2;
printf("%d,%d",a,++b);
有以下程序:
main(){
int a=10,b=2;
{
#include <init.a>
a++;
}
b+=5;
printf("%d,%d",a,b);
}
输出:2,1,10,8
原因:预编译时,将源文件的内容全部复制到命令行所在的位置,形成新的程序。
main(){
int a=10,b=2;
{
int a=2,b=2;
printf("%d,%d",a,++b);
a++;
}
b+=5;
printf("%d,%d",a,b);
}
- 共用体
例一:
union {char m[2];int k;}mk;
main(){
mk.m[0] = 0;
mk.m[1] =1;
printf("%d\n",mk.k);
输出:256
原因:占用相同的内存空间,导致[00000000][00000000][00000001][00000000],按整数输出则为2^8 =256
例二: 已知A的ASCII码为0x41
int main(){
union{unsigned int n;unsigned char c;}t;
t.n =0x4643+1;
printf("%c\n",t.c);
输出:D
原因:占用相同内存,[00000100][00000110][00000100][00000011]+1
=[00000100][00000110][00000100][00000100],取低位字节[00000100]即字符'D'
3.输出结果
例一:
int x=5;
do
printf("%d\n",x-=4);
while (!(--x));
输出:1 <换行> -4
原因:语句正确,但是只能包含一条语句!按照循环控制输出。
例二:
int x=1234;
printf("%3d",x);
输出:1234
原因:%d也是输出1234,因为X是确定的只是为它进行格式化处理。
例三:
int func(int x){
int y=0;
static int z=3;
x =z++,y++;
return x;
}
int main() {
int a=2,i,b;
for (i = 0; i < 2; ++i) {
b = func(a++);
}
printf("%d\n",b);
}
输出:4
原因:逗号表达式,逗号分割各个表达式,只有x = z++在修改值
例四:
int main() {
int i=0,j=0;
char ch;
while((ch =getchar())!='#'){
switch (ch) {
case 'a':case'A':
case 'e':case 'E':
case 'o':case 'O':
default:i++;
case 'i':
case 'I':
case 'u': case 'U':j++;
}
}
printf("%d %d",i,j);
}
输出:13,14
原因:switch后面的相当于指示,直接跳转到那对应的一句,default如果后面还有同样要执行,知道语句结束位置的( } ),所以这里的字符除了i,u外只执行j++外,其他都要执行i++,j++.所以全部都要统计。
例五:
int main() {
union data{
char c;
float f;
}a;
printf("%d",sizeof(union data)); // 说明联合union data是一种类型
int n;
printf("s:%d",a);
a = {1,'a',a.2}; //不能直接赋值,只能对成员赋值
a.i=5; //不能直接a = 5,类型不同
}
例六:
int main() {
int a[3][4] ,i,j,k,*p,(*pa)[4];
for(i=0;i<3;i++){
for(j=0;j<4;j++){
a[i][j] =i+j<<2;
}
}
k =a[1][4]+a[2][3];
printf("%d\n",k);
p =a[1]+2;
printf("%d\n",p[5]);
pa =a+2;
printf("%d\n",*pa -p);
}
输出: 28 20 2
原因:a[i][j]的赋值操作,算术>移位操作,所以矩阵为[0,4,8,12][4,8,12,16][8,12,16,20]
a[1][4]实际表示从a[1]开始移动4个存储单元,即a[2][0] =8 ,a[2][3]=20; p =a[1]+2 =a[1][2],再取p[5] =a[2][3] =20。 *pa =a+2 = &a[2][0]
例七:
int i;
for(i=2;i==0;)
printf("%d",i--);
输出:循环不执行
原因:先初始化,然后进入循环控制表达式,2 == 0 false,直接不进入循环体
例八:
sum = pad =5;
pad =sum++,pad++,++pad;
printf("%d",pad);
输出:7
原因:赋值表达式优先级低,逗号表达式,pad =pad++,++pad;第一个pad 赋值为1后,pad =6,然后++pad赋值,先赋值为7
例九:
void f(int *p){
*p=10;
}
main(){
int *p;
f(p);
pprintf("%d",(*p)++);
输出:因输出语句错误而不能执行
原因:p指针没有初始化,导致程序根本无法执行
例十:
void main(){
char s[5] ="hello";
s[5]='\0';
printf("%s",s);
}
输出:hello(如果没有s[5],则会继续输出直到找到'\0')
原因:长度等于字符数时,没有结束符,继续往下找;但是s[5]的意思就是指针偏移继续追加'\0'
- 格式输入输出
例一:
void main(){
char a,b,c;
scanf("%c%c%c",&a,&b,&c);
printf("%c,%c,%c ",a,b,c);
}
输入:1 23 45
输出:1, ,2
原因:格式输入时依次从缓冲区取数据,所以a =1,b=<空格>,c=2(char型只有一个字符,先取字符2
例二:
void main(){
char a,b,c;
a=getchar();
getchar();
b= getchar();
putchar(a);
putchar(b);
}
输入h<空格>i
输出:hi
原因:使用getchar()吸收多余的单个字符
程序修改题
例一:
#define max 500
void lmi(struct msg *pmsg) {
unsigned char uc;
for(uc=0;uc<max;uc++){
}
}
修改:#define max 200 或unsigned int uc
原因:因为1个字节无符号数最大为255,源程序溢出
例二:
#define SQUARE(a) ((a)*(a))
int a="5";
int b;
b ="SQUARE"(a++);
修改: a = 5; int c=a++; b =SQUARE(c);
原因:类型错误;与源程序目的不符合;宏定义直接替换
例三:
void main() {
int n;
fo/r (n = 1;; n <= 10;)
if (n % 2 != 0) {
printf("%d", n);
}
return 0;
}
修改:for循环增加n++; void修改为int;
原因:循环控制;函数返回值
例四 :
void main(){
char a[5] ={'A','B','C','D','E'},*p=a,**pa;
for ( p= 0; p <a+5 ; ++p) {
printf("%2c",*p);
}
printf("\n");
printf("%2c\n",**(pa =&p));
}
修改: for( p=a;) ; char *q=a; p=q;
原因:循环控制;指针溢出未重置
例五:
void main(){
float c,f;
scanf("%f",f);
c=5/9(f-32);
printf("f= %5.2f,c=%5.2f,f,c);
}
修改:&f;5.0/9*(f-32); ""
原因:输入地址,类型转化,输出格式
例六:
void main(){
char *p ="computer and c";
int count;
while(*p++='\0')count++;
printf("\n%s countis %D",p,count);
}
修改:count =0; p++!='\0';%d
原因:变量初始化(指针必须初始化);循环判断;输出格式
例七:
void main(){
float x,y,z;
x=3.5;y=-7.8;
z= max(x,y);
printf("%f\n",z);
}
float max(int x,int y){
return (z =x>y?a:y);
}
修改:main增加float max (float x,float y); 形参float x,float y; 函数局部变量 float z;
原因:函数先定义再使用;数据类型;变量定义与初始化
简答题
-
面向对象的基本特点:
抽象性:将具有相同属性和操作的对象抽象成类
封装性:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
继承性:一个子类可以直接继承其父类的全部描述(数据和操作),这些可以在子类中不必定义就可以使用。子类还可以自己定义它的属性和操作。继承具有传递性。
多态性:是指一个相同方法在不同对象下有不同表现结果。多态机制使具有不同内部结构的对象可以共享相同的外部接口。 -
对象的基本特点:
标识唯一性、分类性、多态性、封装性、模块独立性好 -
常量的类型:
整型、实型、字符、字符串、符号常量(由#define定义) -
从用户角度看函数分为?从函数的形式看分为?
库函数、自定义函数;无参函数、有参函数 -
什么是const?
const是一个C语言的常类型:所修饰的变量不能发生改变,只允许初始化的只读形式。const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点
程序设计
一:实现统计单词的个数
int func(char *s){
int cnt=0,f=0; //f标志初值为0
while(*s!='\0'){
if(*s ==' ')
f=0;
else if(f==0){
f=1;cnt++;
}
s++;
}
return cnt;
}
二:计算数组周边的数的平均值
double fun(int w[][N]){
int i,j,k=0;
double s;
for (i=0;i<N;i++) {
for (j = 0; j < N; j++) {
if(i==0||j==0||i==N-1||j==N-1)
{
s+=w[i][j];k++; // k计数
}
}
}
return s/k;
}
三:四舍五入算法
float fun(float a,int n){
//四舍五入算法:保留n位小数,就是处理n+1位+5的结果
//先放大10^(n+1)倍,计算+5后强转int进行舍入
//最后缩小10^(n)倍,强转为float
int tmp ;
tmp =(int)(a* pow(10,n+1)+5)/10;
printf("%f",(float)tmp/ pow(10,n));
return (float)tmp/ pow(10,n);
}
四:随机函数,产生20个互不相同的整数
void fun(int *a){
int i,x, n=0;
x = rand()%20;
while(n<20){ //产生20个数
for(i=0;i<n;i++){
if (x==a[i]) //判断是否与已生成的重复
break;
}
if (i==n){ //不重复,则插入新产生的数x
a[n] =x;n++;
}
x =rand()%20;
}
}
五:产生<=limit 的所有素数
int fun(int limit, int a[]){
int i,j,k=0;
for(i=2;i<=limit;i++){
for (j=2;j<i;j++)
if(i%j ==0)
break;
if (j>=i)
a[k++] = i;
}
return k;
}
六:删除字符串之间的空格
void fun(char *str) {
char *p; //工作指针,回退
while (*str != '\0') {
p = str;
if (*str == ' ') {
while (*str != '\0') { //每次处理一个空格,不断前移
*str = *(str + 1);
str++;
}
str=p;
}else{
str++;
}
}
}
七:在字符后面增加字符
void fun(char *str,char ch) {
int i,j,n;
for(i =0;str[i]!='\0';i++){
if(str[i] ==ch){
n=0; //以此为头,开始计算长度,并逐个后移
while (str[i+1+n]!='\0')
n++;
for(j=i+n+1;j>i;j--)
str[j+1] =str[j]; //这里多处理了个结束符,所以是j+1
str[j+1] =ch;
i++; //多插入一个,跳过
}
}
}
八:将矩阵右移一列
void func (int (*t)[N]){
int i,j,x;
for(i=0;i<N;i++){ // 推广到移动n列也是一样的,最外层再循环n次,三层循环
x = t[i][N-1];
for(j =N-1;j>0;j--)
t[i][j] =t[i][j-1];
t[i][0] =x;
}
}

被折叠的 条评论
为什么被折叠?



