一、选择题
1、
C语言中,不合法的整型常量是__________。
A.88 B.018 C.-0xabcd D.2e5
2、
C语言中,定义常量指针p(p的值不变)的正确语法是__________。
A.char *const p; B.char const *p;
C.const *char p; D.const char *p;
3、
C语言中,一个2行3列矩阵M的值如图1所示,能得到M中数值5的表达式是__________。
3 8 9
2 5 6
图1
A.*(M+1)+1 B.*(*M+1)+1
C.*(*(M+1)+1) D.**((*M+1)+1)
4、
C语言中,关于函数正确的说法有__________。(多选)
A.实参可以是常量、变量或表达式
B.实参与其对应的形参各占用独立的存储单元
C.实参与形参不一致时,以形参类型为准
D.函数的类型与返回值的类型不一致时,以函数的类型为准
二、写程序结果
1、
#include <stdio.h>
int main()
{
enum Color{Red,Blue,Green,Yellow=6,Black,Purple,Pink};
printf("%d,%d",Blue,Purple);
}
运行结果是____________________。
2、
#include <stdio.h>
int main()
{
char a[]={'a','b','c','d'};
char *p=(char *)(&a+1);
printf("%c,%c",*(a+1),*(p-1));
}
运行结果是____________________。
3、
#include <stdio.h>
int bits_count(unsigned value)
{
int count=0;
for(count=0; value!=0; value>>=1)
if((value&1)!=0)
count++;
return count;
}
int main()
{
printf("%d",bits_count(14));
}
运行结果是____________________。
4、
#include <stdio.h>
int *fun(int *q)
{
static int a=2;
int *p=&a;
a+=*q;
return p;
}
int main()
{
int i=1;
for(; i<4; i++)
printf("%4d",*fun(&i));
}
运行结果是____________________。
三、程序填空
1、
会计记帐时通常要求大整数用逗号进行分隔,下列函数实现将以分为单位的数字字符串转变为以元为单位,具体输出格式如表1所示。
表1
输入
输出
输入
输出
空
¥0.00
12345
¥123.45
1
¥0.01
123456
¥1,234.56
12
¥0.12
1234567
¥12,345.67
1234
¥12.34
123456789
¥1,234,567.89
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* dollars(char const* src)
{
int len,lenl,i;
char *dst,*resultp;
if(NULL==src)
return NULL;
len=strlen(src);
lenl=len+len/3+2;
dst=(char*)malloc(lenl);
if(!dst)
{
return NULL;
}
_____________1______________
*dst++='¥';
if(len>=3)
{
int i;
for(i=len-2; i>0;)
{
*dst++=*src++;
if(_____________2______________)
*dst++=',';
}
}
else
{
*dst++='0';
}
*dst++='.';
_____________3______________
*dst++=len<1?'0':*src;
*dst=0;
return resultp;
}
2、
下列程序的功能是实现向head指向的链表中插入新结点s,如图17所示,使该链表按结点的id值保持升序排列。
图17
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int id;
char *name;
struct Node *next;
}Node;
void Innode(Node *head,int id,char *str)
{
int j=0;
Node *p,*q,*s;
p=head;
while (___________4______________)
{
q=p;
p=p->next;
}
s=(Node*)malloc(sizeof(Node));
s->id=id;
s->name=str;
_____________5______________
_____________6______________
}
main()
{
/*省略创建链表head的代码*/
Innode(head,3,"Jone"); /*head指向如图17所示的链表*/
}
四、改错
1、
以下函数的功能是:在指针数组表示的字符串列表中查找特定的字符,指针数组以NULL指针结束,如果找到返回TRUE,否则返回FALSE。程序中有两处错误,将错误的行号及正确语句填入答题卡相应位置,不得增行或删行。
#include <stdio.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
int find_string(char** strings,char value)
{
char* cur_str;
if(*strings==NULL)
return FALSE;
while((cur_str=*strings)!=NULL)
{
while(cur_str!="\0")
if(*cur_str++==value)
return TRUE;
}
return FALSE;
}
五、程序设计题
1、
一串数码是否构成合法的信用卡号,可以通过CheckCard算法来验证。CheckCard算法验证的过程如下:
①卡号的长度必须为16位。
②从卡号最后一位数字开始,将奇数位数字求和。
③从卡号最后一位数字开始,将偶数位数字乘以2(如果乘积为两位数,则减9),再求和。
④将②和③所得的和值相加,当结果能被10整除时,则校验通过。
例如,卡号是:5432123456788881
奇数位和等于35
偶数位乘以2(乘积为两位数的减去9)的结果:16261577,求和等于35。
35+35=70可以被10整除,校验通过。
编写函数实现CheckCard算法,判断输入的卡号是否能通过验证,通过则显示“成功”,否则显示“失败”。
六、程序方向
(一)、程序填空
下列程序采用快速排序算法对任意输入的10个整数排序。将正确的内容填入答题卡的相应位置,使程序完整。
快速排序算法是一种经典的排序方法,它是冒泡排序算法的改进。该算法的主要思想是在待排序的n个数据中取第一数据作为基准值,将所有的数据分为两组,使得第一组中各数据值均小于或等于基准值,第二组中各数据值均大于基准值,这便完成了第一趟排序,再分别对第一组和第二组重复上述方法,直到每组只有一个数据为止。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void qusort(int s[],int start,int end)
{
int i,j;
i=start; /*将每组首个元素赋给i*/
j=end; /*将每组末尾元素赋给j*/
s[0]=s[start]; /*设置基准值*/
while(i<j)
{
while(_____________1______________)
j--; /*位置左移*/
if(i<j)
s[i++]=s[j]; /*将s[j]放到s[i]的位置上,且i自增*/
while(i<j&&s[i]<=s[0])
i++; /*位置右移*/
if(i<j)
_____________2______________
}
s[i]=s[0]; /*将基准值放入指定位置*/
if(start<i)
qusort(s,start,i-1); /*对分割出的部分递归调用函数qusort()*/
if(i<end)
_____________3______________
}
main()
{
int a[11],i;
printf("please input 10 numbers:\n");
srand(time(0));
for(i=1;i<=10;i++)
a[i]=rand()%100;//scanf("%d",&a[i]);
_____________4______________
printf("the sorted numbers:\n");
for(i=1; i<=10; i++)
printf("%4d",a[i]);
}
(二)、程序设计
随着信息化进程的不断推进,数据的安全性越来越受到人们的重视,数据加密技术是保证数据安全的重要手段。编程实现对C盘根目录下名为“new.dat”文件的数据进行加密,加密方式是将“new.dat”文件中每个字符与字符A进行异或运算,运算后的加密数据存储到“new.dat”文件中。
参考答案:
一、选择题
1—4 B、A、C、ACD
二、写程序结果
1、 1,8 2、 b,d 3、 3 4、 □□□3□□□5□□□8
三、程序填空
1、 resultp=dst; 2、 ((i--)-3)%3==1 3、 *dst++=len<2?'0':*src++;
注:第2题网上答案--i%3==0有错误
第3题也可以是:*dst++=len<2?'0':*src++;
以下为补充main函数
int main()
{
char a[]={"456789"},*p;
p=dollars(a);
//printf("\n%s",p);
printf("\n¥%s",p+1);
}
程序中赋值¥有bug,因为¥为中文字符。故用上述方式输出。
4、 p!=NULL && p->id<id 5、 s->next=p; 6、 q->next=s;
注:第4题不能p->id<id && p!=NULL 因为插入最后一个节点时会溢出。
四、改错
L10 while((cur_str=*strings++)!=NULL)
L12 while(*cur_str!='\0')
注:L10不能修改为字符串复制。
int main()
{
char *aa[]={"abcd","xyz123","sadfg",""};
aa[3]=NULL;
if(find_string(aa,'1'))
printf("ok");
else printf("no");
}
五、程序设计题
1、参考代码
#include <stdio.h>
#include "string.h"
void CheckCard(char *p)
{
char *q;
int s1=0,s2,t;
if(strlen(p)!=16)
{
printf("失败,卡号长度不对");
return;
}
q=p+15;
while(q>=p)
{
s1=s1+*q-'0';
q--;
t=(*q-'0')*2;
if(t>9) t=t-9;
s2=s2+t;
q--;
}
if((s1+s2)%10==0)
printf("成功");
}
int main()
{
char ka[100]="5432123456788881";
int len;
//gets(ka);
CheckCard(ka);
return 0;
}
六、程序方向
(一)、程序填空
1、 i<j&&s[j]>=s[0]
2、 s[j--]=s[i];
3、 qusort(s,i+1,end);
4、 qusort(a,1,10);
(二)程序设计
注:为了方便性,将操作文件改名了。
假设 aaa.txt文件内容为 ABC三个字符
#include <stdio.h>
#include "string.h"
int main()
{
FILE *fp,*fp1;
char a[100],*p=a;
if((fp=fopen("aaa.txt","r"))==NULL)
{
printf("文件不存在或者打不开,退出!");
return 0;
}
if((fp1=fopen("aaa1.txt","w"))==NULL)
{
printf("文件不存在或者打不开,退出!");
return 0;
}
while(!feof(fp))
{
*p=fgetc(fp);
*p=*p^'A';
fputc(*p,fp1);
}
fclose(fp1);
fclose(fp);
if((fp1=fopen("aaa1.txt","r"))==NULL)
{
printf("文件不存在或者打不开,退出!");
return 0;
}
if((fp=fopen("aaa.txt","w"))==NULL)
{
printf("文件不存在或者打不开,退出!");
return 0;
}
while(!feof(fp1))
{
*p=fgetc(fp1);
fputc(*p,fp);
}
fclose(fp1);
fclose(fp);
return 0;
}