C语言程序设计(8)

高教版二级程序设计C语言

判断题

  1. short _auto = 100-1 ; √
  2. long do =1L;×
  3. 在C程序中,语句之间必须要用分号(;)分隔 ×预编译语句没有,函数名括号后也没有
  4. 在程序中#include行和#define行不是C语句 √
  5. 命令行不属于C程序√
  6. n1 =(n2/(n3=0)); 算术除零异常,赋值语句没有问题 x
  7. n1/=n2+n3=1; 赋值语句出问题,左边为表达式 x
  8. 已知定义语句:long a;int k;则能给a赋40000为:
    a = 20000 +20000; 若右边为int2B存储,直接溢出 x
    a = 400010; 同样若右边为int2B存储,直接溢出 x
    k =40;a =k
    100; 右边溢出 x
    a = 4000; a = a *10; 因为4000能保存,自动类型转换 √
  9. 定义语句 int N=80;int a[N]; ×
  10. char a[10] ; a =“stop”; ×
  11. char *a; scanf(“%s”,a) ; ×
  12. void fun(char *s); fun(‘t’) ×
  13. 字符串常量: “It’s” ×
  14. 字符串常量:“M = \abc” √
  15. char sz[2][20] ;sz[1]=“abc”;×
  16. char *ps = “12”;printf(“%c”,ps);×
  17. 使用函数或宏命令对C的源程序都没有影响× 宏展开,源程序变长
  18. 函数具有类型,宏无类型√函数有返回值类型,形参类型
  19. 函数调用和带参数的宏调用都是将实参的值传给形参 × 函数调用先计算实参表达式;宏调用直接字符串代入
  20. 使用函数比使用宏运行速度快×函数调用在程序运行期间,宏调用在预编译时完成,所以宏调用不会占用运行时间但占用编译时间。
  21. 申请8个字符的动态存储空间,ps = (char*)calloc (8,sizeof(char)); √
  22. 申请8个字符的动态存储空间,ps = (char*)malloc(8); √
  23. 宏替换不进行语法检查 √
  24. # include 命令行可以出现在任意行的起始位置 √
  25. 用# include所包含的头文件可以是目标文件 ×
  26. 在定义共用体时,不能对其成员进行初始化 × 可以初始化,但是规定只能用第一个成员类型一致的值去初始化。
  27. 构成C程序的基本单位是函数 √
  28. 参加位运算的数据可以是任何类型的数据 × 浮点数不能用二进制数精确表示
  29. C语言中没有boolean类型 √
  30. enum em1 {1,one=4,two,8}; ×
  31. enum em2 {A,B,C+1,D}; ×
  32. fclose函数,意味着该文件从磁盘上被删除了 × 避免缓冲区中数据的丢失,防止破坏暂时不用的文件,为了释放文件指针
  33. do {}while; 、struct st{}; 、for( ; ; ) 分号不能丢 √
  34. sqrt((double)16) =4.000000 √

填空题

  1. 在C语言中用 非0 表示逻辑真, 表示 0 逻辑假
  2. 汉字占用 2B,字符占用 1B
  3. char str[] =“\0”; strlen(str) = 0
  4. char *p=“abc\0808\\xff”,则strlen(p+4) = 7 (注意%%,\ 从左边尽可能匹配)
  5. char b[] =“abcde”; b[2]='0’和 b[2] =0,puts(b) 分别输出: ab0de ,ab
  6. char cc[] = “12345\0abcde\n”;sizeof(cc) = 13; strlen(cc) =5
  7. 设有定义:char str[10],写出将"string"赋值给数组的语句: strcpy(str,“string”);
  8. 若希望限制某个函数在其他编译单元中被引用,该函数的存储类说明为: static
  9. 函数原型可以简单的由函数的 首部,加上一个其后的一个“;”构成
  10. 在C语言中,简单变量为实参时,它和形参之间的数据传递方式为 单向值传递
  11. 程序设计中的沃斯公式:程序 = 算法+数据结构
  12. 已知函数fread的调用形式未fread(buffer,size,count,fp),其中buffer代表什么是存放读入数据的地址或指向此地址的指针
  13. 若有表达式(exp)?a++:b–;则以下表达式中能完全等价于表达式(exp)的是 exp!=0
  14. 算法的评价指标:时间复杂度、空间复杂度、正确性、健壮性、可读性
  15. 算法的特点:有效性、确定性、有限性、输入、输出
  16. 数据结构:包括数据和结构,指有关系的数据元素的集合
  17. 在数据处理领域,通常把两两数据元素之间的关系用 前后件关系(直接前驱、直接后继) 来描述
  18. 交换类排序:冒泡、快速;插入类排序:简单插入、希尔;选择类排序:简单选择、堆排序
  19. 当今主导的程序设计风格:清晰第一、效率第二,即首先考虑程序的清晰易读,再考虑提高程序的执行速度、节省系统资源。
  20. 结构化程序设计的原则:自顶向下、逐步求精、模块化、限制使用goto语句
  21. 程序设计的基本结构:顺序、选择、循环,共同特点就是严格地只有一个入口和一个出口
  22. 面向对象的优点:与人类思维方式一致、稳定性好、可重用性好、可维护性好、容易开发大型软件产品
  23. 绝对误差不超过0.001:while(fabs(n-m)>0.001)

程序结果题

  1. 预编译
设有一个文件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);
}
  1. 共用体
例一:
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);
}
输出:1314
原因: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'





  1. 格式输入输出
例一:
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 200unsigned 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;
原因:函数先定义再使用;数据类型;变量定义与初始化

简答题

  1. 面向对象的基本特点:
    抽象性:将具有相同属性和操作的对象抽象成类
    封装性:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
    继承性:一个子类可以直接继承其父类的全部描述(数据和操作),这些可以在子类中不必定义就可以使用。子类还可以自己定义它的属性和操作。继承具有传递性。
    多态性:是指一个相同方法在不同对象下有不同表现结果。多态机制使具有不同内部结构的对象可以共享相同的外部接口。

  2. 对象的基本特点:
    标识唯一性、分类性、多态性、封装性、模块独立性好

  3. 常量的类型:
    整型、实型、字符、字符串、符号常量(由#define定义)

  4. 从用户角度看函数分为?从函数的形式看分为?
    库函数、自定义函数;无参函数、有参函数

  5. 什么是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;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值