[C语言]比特鹏哥

主页有博主其他上万字精品笔记,都在不断完善更新!

C语言

初识C语言

基本了解C语言的基础知识,对C语言有一个大概的认识。

每个知识点就是简单认识,不做详细讲解,后期课程都会细讲。

本章重点: 什么是C语言

第一个C语言程序

  • 数据类型

  • 变量、常量

  • 字符串+转义字符+注释

  • 选择语句

  • 循环语句

  • 函数

  • 数组

  • 操作符

  • 常见关键字

  • define 定义常量和宏

  • 指针

  • 结构体

1.什么是C语言?

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进 行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制 定了一套完整的美国国家标准语 法,称为ANSI C,作为C语言最初的标准。

[1] 目前2011年12月8日,国际标准化组织(ISO)和 国际电工委员会(IEC)发布的C11 标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字 标识符,一定程度上实现了汉 字编程。 C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。 其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等

2.第一个C语言程序

#include <stdio.h>
int main()
{
    printf("hello bit\n");
    printf("he he\n");
    return 0;
}
//解释:
//main函数是程序的入口
//一个工程中main函数有且仅有一个

3.数据类型

char //字符数据类型

short //短整型

int //整形

long //长整型

long long //更长的整形

float //单精度浮点数

double //双精度浮点数

//C语言有没有字符串类型?

为什么出现这么的类型?

每种类型的大小是多少?

#include  <stdio.h>
int main()
{   printf("%d\n", sizeof(char));  
 printf("%d\n", sizeof(short));  
 printf("%d\n", sizeof(int));   
 printf("%d\n", sizeof(long)); 
 printf("%d\n", sizeof(long long));  
 printf("%d\n", sizeof(float));  
 printf("%d\n", sizeof(double)); 
 printf("%d\n", sizeof(long double));  
 return 0; }

注意:存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。

类型的使用:

char ch='w';
int weight =120;
int salary=20000;

3.变量、常量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等) 有些值是可变的(比如:年龄,体重,薪资)

3.1定义变量的方法
int age=150;
float weight=45.5f;
char ch='w';
3.2变量的分类
  • 局部变量

  • 全局变量

#include <stdio.h>
int global=2019;//全局变量
int main(){
int local=2018;//局部变量
    //下面的global会不会有问题
int global=2020;//局部变量
printf("global=%d",global);

return 0;}

总结: 上面的局部变量global变量的定义其实没有什么问题的!

当局部变量和全局变量同名的时候,局部变量优先使用。

3.3变量的使用
#include<stdio.h>
int main()
{
    int num=0;
    int num=0;
    int sum=0;
    printf("请输入两个操作数:>");
    scanf("%d,%d",&num1,&num2);
    sum=num1+num2;
    printf("sum=%d\n",sum);
    return 0;
}
3.4变量的作用域和声明周期

作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的

而限定这个名字的可用性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围

  2. 全局变量的作用域是整个周期

生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

  1. 局部变量的生命周期是变量所在的局部范围

  2. 全局变量的作用域是整个工程

3.5常量

C语言中的常量和变量的定义的形式有所区别

C语言中的常量分为以下几种

  • 字面常量

  • const修饰的常变量

  • define定义的标识符常量'

  • 枚举常量

#include <stdio.h>
//举例
enum Sex
{MALE
    FEMALE
    UNKNOWN
}
//括号里的MALE,FEMALE,UNKNOWN是枚举常量
int main()
{
    
    //字面常量演示
    3.14
        1000
        //const修饰的常变量
        const float PI=3.14f;
    PI=5.14//这里的PI不能直接修改
        //#define的标识符常量演示
        #define MX=190
        printf("max=%d\n",max);
    //枚举常量演示
   printf("%d\n",MALE);
     printf("%d\n",FEMALE);
     printf("%d\n",UNKNOWN);
    //注 枚举常量的默认都是从零开始,依次向下递增一的
    return 0;
}

注: 上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了 变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量

4.字符串+转义字符+注释

4.1

"hello bit."\n

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。

#include <stdio.h>
//下面代码,打印结果是什么?为什么?
int main()
{
    char arr1[]="bit";
    char arr2[]={'b','i','t'};
    char arr3[]={'b','i','t';}
    printf("%s\n",arr1);
     printf("%s\n",arr2);
     printf("%s\n",arr3);
    
    return 0;
    
    
}

4.2转义字符

假如我们要在屏幕上打印一个目录: c:\code\test.c

我们该如何写代码?

#include <stdio.h>
int main()
{
    
    
    printf("c:\code\test.c\n");
    return 0;
}

#include <stdio.h>
int main()
{
    //问题1:在屏幕上打印一个单引号',怎么做?
    //问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?
    printf("%c\n", '\'');
    printf("%s\n", "\"");
    return 0;
}

5.注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉

  2. 代码中有些代码比较难懂,可以加一下注释文字

比如

#include <stdio.h>
int ADD(int x,int y,)
{
    return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{
    return x-y;
}
*/
int main()
{
    //C++注释风格
    //int a = 10;
    //调用Add函数,完成加法
    printf("%d\n", Add(1, 2));
    return 0;
}

注释有两种风格:

  • C语言风格的注释 /xxxxxx/

    • 缺陷:不能嵌套注释

  • C++风格的注释

    • //xxxxxxxx 可以注释一行也可以注释多行

6 选择语句

#includde <stdio.h>
int main()
{
    int codig =0;
    printf("你会去敲代码吗");
    scanf("%d",&coding);
    if (coding==1)
    {
        printf("keep it\n");
        
    }
        else
        {
            printf("maihongshu\n");
        }
    return 0;
}

7 循环语句

C语言中如何实现循环?

  • while

  • for

  • do while

//while 循环的实例
#include <stdio.h>
int main()
{
printf("加入比特\n");
int line=0;
while(line<=200)
{line++;
printf("我要继续努力敲代码\n");
}
    if(line>20000)
        printf("好offer");
    return 0;
    
}

8 函数

#include <stdio.h>
int main()
{
    int num1=0;
    int num2=0;
    int num3=0;
    printf("输入两个操作数:>");
    scanf("%d %d",&num1,&num2);
    sum =num1+num2;
    printf("sum=%d\n",sum);
}

//改写为函数如下
  #include<stdio.h>
int add(int x,int y)
{
    return x+y;
}
int main()
{
    int num1,num2,sum;
    printf("请输入两个操作数");
    scanf("%d %d",&num1,&num2);
    sum=add(num1,num2);
    printf("sum=%d\n",sum);
    return 0;
    
    
 
    
}



函数的特点就是简化代码,代码复用

9 数组

要存储1-10的数字,怎么存储?

C语言中给了数组的定义:一组相同类型元素的集合

9.1数组定义

‘int arr[10]={1,2,3,4,5,6};’//定义一个整形数组,最多放10个元素

9.2 数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。

数组可以通过下标来访问的。

int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
9.3数组的使用
#include <stdio.h>
int main()
{
 int i = 0;
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 for(i=0; i<10; i++)
 {
       printf("%d ", arr[i]);
 }
 printf("\n");
    return 0;
}

10 操作符

简单介绍为主,后面课件重点讲

算数操作符

‘+ - * / %’

移位操作符

>> <<

位操作符

& ^ |

赋值操作符

= += -= *= /= &= ^= |= >>= <<=

单目操作符

!`逻辑反操作

-负值

+正值

&取地址

sizeof操作数的类型长度(以字节为单位)

~对一个二进制位取反

--前置--,后置--

++前置++后置++

*间接访问操作符

(类型)强制类型转化

关系操作符

>

= <

<=

!= 用于测试“不相等”

== 用于测试“相等”

逻辑操作符

&&逻辑与

||逻辑或

条件操作符

exp1 ? exp2 : exp3

逗号表达式

exp1, exp2, exp3, …expN

下标引用、函数调用和结构成员

[] () . ->

11.常见关键字

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

11.1关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
    //观察num1和num2,这两个变量的类型是一样的
    unsigned int num1 = 0;
    uint_32 num2 = 0;
    return 0;
}
11.2 关键字static

在C语言中: static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量

  2. 修饰全局变量-称为静态全局变量

  3. 修饰函数-称为静态函数

11.2.1修饰局部变量
/代码1
#include <stdio.h>
void test()
{
    int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
 int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}
//代码2
#include <stdio.h>
void test()
{
    //static修饰局部变量
    static int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}
11.2.2修饰全局变量
 //代码1
 //add.c
 int g_val = 2018;
 //test.c
 int main()
 {
     printf("%d\n", g_val);
     return 0;
 }
 //代码2
 //add.c
 static int g_val = 2018;
 //test.c
 int main()
 {
     printf("%d\n", g_val);
     return 0;
 }
 ​

代码1正常,代码2在编译的时候会出现连接性错误。

结论:

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。

11.2.3修饰函数
 //代码1
 //add.c
 int Add(int x, int y)
 {
     return c+y;
 }
 //test.c
 int main()
 {
     printf("%d\n", Add(2, 3));
     return 0;
     }
 //代码2
 //add.c
 static int Add(int x, int y)
 {
     return c+y;
 }
 //test.c
 int main()
 {
     printf("%d\n", Add(2, 3));
     return 0;
 }
 ​

代码1正常,代码2在编译的时候会出现连接性错误.

一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用

12 #define定义常量和宏

 //define定义标识符常量
 #define MAX 1000
 //define定义宏
 #define ADD(x, y) ((x)+(y))
 #include <stdio.h>
 int main()
 {
     int sum = ADD(2, 3);
     printf("sum = %d\n", sum);
     
     sum = 10*ADD(2, 3);
     printf("sum = %d\n", sum);
     
     return 0;
 }
 ​

13.指针

13.1内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地 址。

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。 取出变量地址如下:

 #include <stdio.h>
 int main()
 {
  int num = 10;
  &num;//取出num的地址
     //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
  printf("%p\n", &num);//打印地址,%p是以地址的形式打印
  return 0;
 }
 ​
 #include <stdio.h>
 int main()
 {
  int num = 10;
  int *p = &num;
  *p = 20;
     return 0;
 }
 #include <stdio.h>
 int main()
 {
  char ch = 'w';
  char* pc = &ch;
  *pc = 'q';
  printf("%c\n", ch);
     return 0;
 }
13.2指针变量的大小
 #include <stdio.h>
 //指针变量的大小取决于地址的大小
 //32位平台下地址是32个bit位(即4个字节)
 //64位平台下地址是64个bit位(即8个字节)
 int main()
 {
     printf("%d\n", sizeof(char *));
     printf("%d\n", sizeof(short *));
     printf("%d\n", sizeof(int *));
     printf("%d\n", sizeof(double *));
     return 0;
 }
 ​

指针大小在32位平台是4个字节,64位平台是8个字节。

14.结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。 比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。 这里只能使用结构体来描述了。 例如:

 struct Stu
 {
     char name[20];//名字
     int age;      //年龄
     char sex[5];  //性别
     char id[15]; //学号
 };
 ​

结构体的初始化:

 //打印结构体信息
 struct Stu s = {"张三", 20, "男", "20180101"};
 //.为结构成员访问操作符
 printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
 //->操作符
 struct Stu *ps = &s;
 printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
 >id);
 ​

分支语句和循环语句

分支语句

  • if

  • switch

循环语句

  • while

  • for

  • do while

goto语句

1 什么是语句

C语句可分为以下五类:

  1. 表达式语句

  2. 函数调用语句

  3. 控制语句

  4. 复合语句

  5. 空语句

本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语 言有九种控制语句。

可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句;

  2. 循环执行语句:do while语句、while语句、for语句;

  3. 转向语句:break语句、goto语句、continue语句、return语句

2.分支语句(选择结构)

2.1 if语句

那if语句的语法结构是怎么样的呢?

语法结构:
if(表达式)
    语句;
if(表达式)
    语句1;
else
    语句2;
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;
#include <stdio.h>
//代码1
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
}
//代码2
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
    else
   {
        printf("成年\n");
   }
}
//代码3
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("少年\n");
   }
    else if(age>=18 && age<30)
   {
        printf("青年\n");
   }
    else if(age>=30 && age<50)
   {printf("中年\n");
   }
    else if(age>=50 && age<80)
   {
        printf("老年\n");
   }
    else
   {
        printf("老寿星\n");
   }
    
}

如果表达式的结果为真,则语句执行。

在C语言中如何表示真假?

0表示假,非0表示真。

2.1.1悬空else

当你写了这个代码:

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

else的匹配:else是和它离的最近的if匹配的

2.1.2 if书写形式的对比
//代码1
if (condition) {
    return x;
}
return y;
//代码2
if(condition)
{
    return x;
}
else
{  return y;
}
//代码3
int num = 1;
if(num == 5)
{
    printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)//疑问
{
    printf("hehe\n");
}

代码2和代码4更好,逻辑更加清晰,不容易出错。

2.2switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期日

那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。

这就是switch 语句。

switch(整型表达式) { 语句项; }

2.2.1在switch语句中的break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

#include <stdio.h>
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0;
}
  1. 输入1-5,输出的是“weekday”;

  2. 输入6-7,输出“weekend”

#include <stdio.h>
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1: 
            case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

break语句 的实际效果是把语句列表划分为不同的分支部分。

编程好习惯

在最后一个 case 语句的后面加上一条 break语句。 (之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。

2.2.3练习2
 #include <stdio.h>
 int main()
 {
     int n = 1;
 int m = 2;
     switch (n)
    {
     case 1:
             m++;
     case 2:
             n++;
     case 3:
             switch (n)
            {//switch允许嵌套使用
              case 1:
                     n++;
              case 2:
                     m++;
                     n++;
                     break;
            }
     case 4:
             m++;
             break;
     default:
             break;
    }
     printf("m = %d, n = %d\n", m, n);
     return 0;
 }
 ​

3.循环语句

  • while

  • for do

  • while

3.1while循环

我们已经掌握了if语句

当条件满足的情况下,if语句后的语句执行,否则不执行。

但是这个语句只会执行一次。

由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢?

C语言中给我们引入了: while 语句,可以实现循环。

 //while 语法结构
 while(表达式)
  循环语句;
 ​

在屏幕上打印1-10的数字。

 #include<iostream>
 int main()
 {
 int i=0;
 while(i=<10){
 printf("%d",i);
 i++;}
 return 0;//while忘记{}
 }

上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下:

3.1.1while语句中的break和continue

break介绍

 //break 代码实例
 #include <stdio.h>
 int main()
 {
  int i = 1;
  while(i<=10)
  {
  if(i == 5)
  break;
      printf("%d ", i);
  i = i+1;
  }
  return 0;
 }
 ​

这里代码输出的结果是什么?

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 9 10

1 2 3 4 6 7 8 9 10

总结: break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。

continue介绍

 //continue 代码实例2
 #include <stdio.h>
 int main()
 {
  int i = 1;
  while(i<=10)
  {
     i = i+1;
      if(i == 5)
  continue;
  printf("%d ", i);
  }
  return 0;
 }

总结:

continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断

 //代码是什么意思
 //代码一
 include<stdio.h>
 int ch=0;while ((ch=getchar())!=EOF)
 putchar(ch);
 return 0;
 }

再看几个代码:

BIT-3-函数

  1. 函数是什么

  2. 库函数

  3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声明和定义 8. 函数递归 正文开始@比特就业课 1. 函数是什么? 数学中我们常见到函数的概念。但是你了解C语言中的函数吗? 维基百科中对函数的定义:子程序 在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组 成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软 件库。 2. C语言中函数的分类: 1. 库函数 2. 自定义函数 2.1 库函数: 为什么会有库函数? 1. 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想 把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格 式打印到屏幕上(printf)。 2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。 3. 在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。 像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发。 那怎么学习库函数呢? 这里我们简单的看看:www.cplusplus.com 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 简单的总结,C语言常用的库函数都有: IO函数 字符串操作函数 字符操作函数 内存操作函数 时间/日期函数 数学函数 其他库函数 我们参照文档,学习几个库函数:(教会学生怎么使用文档来学习库函数)。 strcpy memset 注: 但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。 这里对照文档来学习上面几个库函数,目的是掌握库函数的使用方法。 char * strcpy ( char * destination, const char * source ); void * memset ( void * ptr, int value, size_t num ); 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 2.1.1 如何学会使用库函数? 需要全部记住吗?No 需要学会查询工具的使用: MSDN(Microsoft Developer Network) www.cplusplus.com http://en.cppreference.com(英文版) http://zh.cppreference.com(中文版) 英文很重要。最起码得看懂文献。 2.2 自定义函数 如果库函数能干所有的事情,那还要程序员干什么? 所有更加重要的是自定义函数。 自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。 函数的组成: 我们举一个例子: 写一个函数可以找出两个整数中的最大值。 ret_type fun_name(para1, * ) { statement;//语句项 } ret_type 返回类型 fun_name 函数名 para1 函数参数 #include //get_max函数的设计 int get_max(int x, int y) { return (x>y)?(x):(y); } int main() { int num1 = 10; int num2 = 20; int max = get_max(num1, num2); printf("max = %d\n", max); 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 再举个例子: 写一个函数可以交换两个整形变量的内容。 3. 函数的参数 3.1 实际参数(实参): 真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形 参。 3.2 形式参数(形参): 形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单 元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有 效。 return 0; } #include //实现成函数,但是不能完成任务 void Swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } //正确的版本 void Swap2(int *px, int *py) { int tmp = 0; tmp = *px; *px = *py; py = tmp; } int main() { int num1 = 1; int num2 = 2; Swap1(num1, num2); printf("Swap1::num1 = %d num2 = %d\n", num1, num2); Swap2(&num1, &num2); printf("Swap2::num1 = %d num2 = %d\n", num1, num2); return 0; } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 上面 Swap1 和 Swap2 函数中的参数 x,y,px,py 都是形式参数。在main函数中传给 Swap1 的 num1 , num2 和传 给 Swap2 函数的 &num1 , &num2 是实际参数。 这里我们对函数的实参和形参进行分析: 代码对应的内存分配如下: 这里可以看到 Swap1 函数在调用的时候, x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。 所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。 4. 函数的调用: 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 4.1 传值调用 函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。 4.2 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。 4.3 练习 1. 写一个函数可以判断一个数是不是素数。 2. 写一个函数判断一年是不是闰年。 3. 写一个函数,实现一个整形有序数组的二分查找。 4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。 5. 函数的嵌套调用和链式访问 函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。 5.1 嵌套调用 函数可以嵌套调用,但是不能嵌套定义。 int main() { int num = 0; //调用函数,使得num每次增加1 return 0; } #include void new_line() { printf("hehe\n"); } void three_line() { int i = 0; for(i=0; i<3; i++) { new_line(); } } int main() { three_line(); return 0; } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 5.2 链式访问 把一个函数的返回值作为另外一个函数的参数。 6. 函数的声明和定义 6.1 函数声明: 1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放在头文件中的。 6.2 函数定义: 函数的定义是指函数的具体实现,交待函数的功能实现。 test.h的内容 放置函数的声明 test.c的内容 放置函数的实现 #include #include int main() { char arr[20] = "hello"; int ret = strlen(strcat(arr,"bit"));//这里介绍一下strlen函数 printf("%d\n", ret); return 0; } #include int main() { printf("%d", printf("%d", printf("%d", 43))); //结果是啥? //注:printf函数的返回值是打印在屏幕上字符的个数 return 0; } #ifndef TEST_H #define TEST_H //函数的声明 int Add(int x, int y); #endif //TEST_H 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 这种分文件的书写形式,在三字棋和扫雷的时候,再教学生分模块来写。 7. 函数递归 7.1 什么是递归? 程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小 7.2 递归的两个必要条件 存在限制条件,当满足这个限制条件的时候,递归便不再继续。 每次递归调用之后越来越接近这个限制条件。 7.2.1 练习1:(画图讲解) 接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4. 参考代码: #include "test.h" //函数Add的实现 int Add(int x, int y) { return x+y; } #include void print(int n) { if(n>9) { print(n/10); } printf("%d ", n%10); } int main() { int num = 1234; print(num); return 0; } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 7.2.2 练习2:(画图讲解) 编写函数不允许创建临时变量,求字符串的长度。 参考代码: 7.3 递归与迭代 7.3.1 练习3: 求n的阶乘。(不考虑溢出) 参考代码: 7.3.2 练习4: 求第n个斐波那契数。(不考虑溢出) 参考代码: 但是我们发现有问题; 在使用 fib 这个函数的时候如果我们要计算第50个斐波那契数字的时候特别耗费时间。 使用 factorial 函数求10000的阶乘(不考虑结果的正确性),程序会崩溃。 #incude int Strlen(const charstr) { if(*str == '\0') return 0; else return 1+Strlen(str+1); } int main() { char *p = "abcdef"; int len = Strlen(p); printf("%d\n", len); return 0; } int factorial(int n) { if(n <= 1) return 1; else return n * factorial(n-1); } int fib(int n) { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 为什么呢? 我们发现 fib 函数在调用的过程中很多计算其实在一直重复。 如果我们把代码修改一下: 最后我们输出看看count,是一个很大很大的值。 那我们如何改进呢? 在调试 factorial 函数的时候,如果你的参数比较大,那就会报错: stack overflow(栈溢出) 这样的信息。 系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。 那如何解决上述的问题: 1. 将递归改写成非递归。 2. 使用static对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代 nonstatic 局部对象(即栈对象),这不 仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保 存递归调用的中间状态,并且可为 各个调用层所访问。 比如,下面代码就采用了,非递归的方式来实现: int count = 0;//全局变量 int fib(int n) { if(n == 3) count++; if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } //求n的阶乘 int factorial(int n) { int result = 1; while (n > 1) { result *= n ; n -= 1; } return result; } //求第n个斐波那契数 int fib(int n) { int result; int pre_result; int next_older_result; result = pre_result = 1; 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 提示: 1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。 2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。 3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开 销。 函数递归的几个经典题目(自主研究): 1. 汉诺塔问题 2. 青蛙跳台阶问题

学校题目

01 C语言概述习题

1.用C语言编写的C程序称之为( B)。

A.目标程序 B.源程序 C.汇编程序 D.命令程序

2.C语言源程序的基本单位为( B)。

A.过程 B.函数 C.子程序 D.标识符

3.一个C语言程序至少包含一个( A)。

A.函数 B.语句 C.命令 D.变量

4.以下四组用户标识符,其中合法的一组是( D)。

A.*A22,r12,st1 B.#my,&12x,studentN1

C.class,lotus1,2day D.Sb,sum,above

5.以下变量名称合法的是(D )。

A.$108 B.x1.1 C.3dx D.s_1

6.以下C语言标识符中,不正确的是(D )。

A.ABC B.abc C.a_bc D.ab.c

7.以下C语言标识符中,不正确的为(D )。

A.ABC B.abc C.a_bc D.ab%c

02 数据类型表达式

1.以下变量说明语句中,正确的是( C)。

A.int int; B.char a,b= 'AB';

C.char a=68,b='A'; D.int a=98.68,b="a";//不懂

2.C语言中运算对象必须是整型的运算符是( A)。

A.% B./ C.>= D.+

3.下列实型常数选项中,合法的是( C)。

A.5.8E6.0 B.E−10 C..6E0 D.98.6E

合法的实型常数应该符合浮点数的格式,即整数部分、小数点、小数部分、指数部分(可选),其格式为:

 <整数部分>.<小数部分>E<指数部分>

其中,整数部分可以省略,小数部分和指数部分至少要有一个。

根据这个格式,选项 A、B 和 D 都不符合合法的实型常数的格式。

选项 C 中的 .6E0 符合实型常数的格式,因为它的整数部分为空,小数部分是 6,指数部分是 0

因此,选项 C 是合法的实型常数。所以答案是 C..6E0。

4.在C语言类型说明中,char类型变量的长度为(D )字节。

A.2 B.4 C.8 D.1

5."A"和'A'在计算机内存中分别占用的字节数是(A )。

A.2和1 B.1和1 C.1和2 D.2和2

6.能正确定义整型变量a和b,并为它们赋初值5的语句是( D)。

A.a=b=5; B.int a,b=5; C.int a=b=5; //为什么不行 D.int a=5,b=5;

7.设int n=10,i=4,则赋值运算n%=i+1执行后,n的值为( )。

A.0 B.3 C.2 D.1

在这个表达式中,n%=i+1 是对 n 进行取模赋值运算,相当于 n = n % (i + 1)

首先,计算 i+1,得到5。然后,计算 n % 5,即10对5取模,结果是0。

因此,执行后,n 的值为0。所以答案是 A.0。

8.设int n=10,i=4,则赋值运算n%=i执行后,n的值为( C)。

A.0 B.3 C.2 D.1

9.设char ch;,则以下赋值语句中,正确的是(A )。

A.ch='123'; B.ch='\xff'; C.ch='\08'; D.ch="";

10.设有定义char ch;,则以下赋值语句中,不正确的是( D )。

A.ch=65; B.ch='\n'; C.ch='65'; D.ch='\x12';

11.设char ch; 则以下赋值语句中,正确的是( A)。

A.ch='123'; B.ch='\'; C.ch='\08'; D.ch="";

12.字符串常量"ab\ctd\376"的有效长度是( A )。

A.7 B.12 C.8 D.14

13.设有定义int a=5,b; ,则执行下列语句后,b的值不为2的是( )。

A.b=a/2 B.b=6−(− −a) C.b=a%2 D.b=a>3?2:4

14.设int n=3;,则++n的结果为( C)。

A.2 B.3 C.4 D.5

15.设int a=2,b=2;, 则a+++b的结果为(C/D )。

A.2 B.3 C.4 D.5

16.如果int i=3, j=4;,则k=i+++j执行之后,k、i和j的值分别为( )。

A.7,3,4 B.8,3,5 C.7,4,4 D.8,4,5

17.设int a=2,b=2;,则a - - - b的结果为( )。

A.0 B.1 C.2 D.4

18.设int n=2;,则++n+1= =4的结果为( C)。

A.true B.false C.1 D.0

19.设有定义int a=3,b=4;,则执行语句printf(" %d,%d",(a,b),(b,a));的输出是( B)。

A.3,4 B.4,3 C.3,3 D.4,4

20.设有定义int x=10,y=3;,则语句printf("%d",(x%y,x/y));的输出结果是( B)。

A.1 B.3 C.4 D.2

21.设有定义int x,a,b;,则执行语句x=(a=3,b=a− −);后,x、a、b的值依次是(A)。

A.3,2,3 B.3,2,2 C.3,3,2 D.2,3,2

22.设有定义int x=10,y=3;,则语句printf("%d",(x%y,x/y));的输出结果是(D)。

A.0 B.1 C.4 D.3

23.设所有变量均为整型,表达式r=(a=2,a=5,a++)执行后r的值是( B/c)。不懂

A.2 B.5 C.6 D.7

24.设有定义int x=10,y=3,z;,则语句printf(“%d\n”,z=(x%y,x/y));的输出结果是( B )。

A.0 B.3 C.4 D.1

25.设有定义int a=1,b=2,c=3,d=4;,则语句printf(″%d″,a>b?c:d);的输出结果是( D)。

A.3 B.1 C.2 D.4

26.设int a=1,b=2,c=3,d=4,则表达式a<b?a:c<d?c:d的值为( )。

A.1 B.2 C.3 D.4

表达式 a<b?a:c<d?c:d 中包含了条件运算符 ? :,它是一个三元运算符,根据条件的真假来返回两个可能的值之一。

首先,我们来分析这个表达式的执行顺序。根据运算符优先级,条件运算符的优先级较低,因此我们需要先进行比较运算。

  1. 首先进行 a < b 的比较,因为a是1,b是2,所以条件为真。

  2. 因此,整个表达式的值将是 a 对应的值,即1。

因此,表达式 a<b?a:c<d?c:d 的值为1。所以答案是 A.1。

27.设有float a=5.5,b=2.5;,则语句printf("%f",(int) a+b/b);的输出结果是(D )。

A.6.500000 B.6.5 C.5.500000 D.6.000000//不懂

28.设int i; char c; float f;,则以下结果为整型数的表达式的是(B )。

A.i+f B.i*c C.c+f D.i+c+f

29.设int a=2,b;,则执行b=a&&1; 后,b的结果为(B )。

A.0 B.1 C.2 D.3

30.若 int x=0,y=1;,则表达式(!x||y--)执行后,x、y的值分别为( A)。

A.0,0 B.0,1 C.1,0 D.1,1

根据给定的表达式 (!x||y--),我们首先来看一下逻辑非运算符 ! 和逻辑或运算符 || 的运算规则。

  • 逻辑非运算符 ! 用于取反,如果操作数为0,则结果为1;如果操作数为非0,则结果为0。

  • 逻辑或运算符 || 只要有一个操作数为真(非0),则结果为真;只有当两个操作数都为假(0)时,结果才为假。

现在我们来分析表达式 (!x||y--) 的执行过程:

  1. 首先计算 !x,因为 x 的值为0,所以 !x 的值为1。

  2. 接下来计算 y--,由于 y 的值为1,所以 y-- 的值为1,然后 y 的值减1,变为0。

  3. 最后计算 (!x||y--),根据逻辑或运算符的规则,因为有一个操作数为真(非0),所以结果为真,即1。

因此,执行完表达式 (!x||y--) 后,x 的值仍为0,y 的值变为0。

所以,x、y的值分别为 A.0,0。

31.设int a=2,b;,则执行b=a || 1; 后,b的结果为( )。

A.0 B.1 C.2 D.3

在这个问题中,|| 是逻辑或运算符。当使用逻辑或运算符时,如果其中一个操作数为真(非零),则结果为真;只有当两个操作数都为假(0)时,结果才为假。

在这个问题中,a的值是2,非零,因此被视为真。1也是真。因此,无论哪个操作数为真,结果都为真。

因此,执行b=a || 1; 后,b的结果为1。所以答案是 B.1

32.设int a=04,b;,则执行b=a<<1; 语句后,b的结果为( C)。

A.4 B.04 C.8 D.10

33.设有int b=4;,则语句printf("%d",b<<2);的输出结果是( D)。

A.2 B.8 C.4 D.16

34.设有定义char a=3,b=6,c;,则执行完语句c=(a^b)<<2;后,c的八进制值是(D )。

A.034 B.07 C.01 D.024

首先,我们需要了解位运算符。在这个问题中,我们使用的是异或运算符^和左移运算符<<

首先,我们执行异或运算:3的二进制表示是11,6的二进制表示是110。当我们对它们进行异或运算时,得到101,即5。

然后,我们对结果进行左移2位。5的二进制表示是101,当我们将它左移2位时,得到10100,即20。

最后,我们将结果转换为八进制。20的八进制表示是24。

因此,执行完语句c=(a^b)<<2;后,c的八进制值是24,选项D是正确答案。

异或运算是一种逻辑运算,其规则如下:

  • 如果两个对应的二进制位相同,则结果为0。

  • 如果两个对应的二进制位不同,则结果为1。

例如:

  0110 (6的二进制表示)
^ 0011 (3的二进制表示)
  ----
  0101 (5的二进制表示)

这是因为对应的二进制位有两个不同的位,所以结果是1。

35.设有int b=4;则语句printf("%d",b&4);的输出结果是( )。

A.8 B.4 C.16 D.2

根据位运算符的优先级,按位与运算符&的优先级低于格式化输出符号%。因此,b&4会先被计算,它的值为4。然后,printf("%d", 4)会输出4。因此,输出结果是4,选项B正确。

36.设int a=07,b;,则执行b=a>>1; 语句后,b的结果为( )。

A.3 B.4 C.8 D.7

在C语言中,以0开头的整数常量表示八进制数。因此,a的值为7,而不是十进制的7。执行a>>1时,相当于把a的二进制数向右移动一位,即0111(二进制表示)变成0011(二进制表示),即十进制的3。因此,b的值为3,选项A正确。

37.对以下程序段,要求给变量i赋值5,给变量j赋值20,则应该从键盘正确输入的是( A)。

{ int i,j;

scanf(″i=%d,j=%d″,&i,&j);

printf(″i=%d,j=%d″,i,j);

}

A.5,20 B.i=5,j=20 C.520 D.i=5j=20

38.使用读入语句scanf("a=%d,b=%f",&a,&b);,则以下从键盘输入数据的形式正确的是(A )。

A.30,5.5<回车> B.a=30,b=5.5<回车>

C.30 5.5<回车> D.a=30 b=5.5<回车>

39.逗号表达式(a=3 * 5,a*4),a+15的值为( C)。

A.15 B.60 C.30 D.不确定

逗号表达式会依次执行每个子表达式,但只有最后一个子表达式的值会作为整个表达式的值返回。因此,a的值为15,但它不会影响后面的表达式a+15,所以a+15的值为30。所以答案是C。

40.sizeof(double)是一个( A )表达式。

A.整型 B.实型 C.不合法 D.函数调用

41.程序设计的三种基本结构是( D)。

A.顺序结构、分支结构、选择结构 B.递归结构、循环结构、选择结构

C.顺序结构、循环结构、逻辑结构 D.顺序结构、循环结构、选择结构

03 程序结构习题

一、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ printf("%c,%d",'A'+5,'A'+5); }

F,72

2. #include <stdio.h>

void main()

{ char ch1='a',ch2;

ch2=ch1+5;

printf("%c",ch2);

}

f

3.#include <stdio.h>

void main()

{ float x,y;

x=1;

y=x+5/2;

printf("%f",y);

}//不懂

3.5

4. #include <stdio.h>

void main()

{ float x,y;

x=1/2,y=2;

printf("%.1f\n",x+y);

}

根据提供的代码,程序的运行结果将是:

2.0

这是因为在表达式1/2中,12都是整数,因此整数相除结果仍为整数,即0.5被截断为0。然后,x被赋值为0.0(因为1/2的结果是0),y被赋值为2.0。所以x+y的结果是2.0

5. #include <stdio.h>

void main()

{ float x,y;

x=1e−1;y=−12.9;

printf("x=%5.1f,y=%5.1f\n",x,y);

}

x=0.1,y=-12.9

6.#include <stdio.h>

void main()

{ int x=10,y;

y=x++;

printf("%d,%d",x,y);

}11,10 //注意

7.#include <stdio.h>

void main()

{ int a=3;

printf("%d",(a+=a−=a*a));

}

根据提供的代码,程序的运行结果将是:

3

这是因为代码中的表达式(a+=a−=a*a)包含了多个赋值运算符,而且这些赋值运算符在同一表达式中没有定义明确的优先级。根据C语言的运算符优先级规则,赋值运算符的优先级低于加减法运算符。因此,表达式的计算顺序如下:

  1. a * a,即3 * 3,得到9

  2. a -= 9,即a = a - 9a的值变为-6

  3. a += -6,即a = a + (-6)a的值变为-3

所以,printf语句输出的值是-3

8.#include <stdio.h>

void main()

{ int x=3,y=3,z=1;

printf("%d,%d\n",(++x,y++),z+2);

}5

9. #include <stdio.h>

void main()

{ int a=2,b=5,c=7;

a=a>b?a:b;

a=a>c?a:c;

printf("%d",a);

}7

10.#include <stdio.h>

void main()

{ char str[30];

scanf("%s",str);

printf("%s\n",str);

}

输入 Language Programming

根据提供的代码,程序的运行结果将是:

Language

这是因为scanf函数在遇到空格、制表符或换行符时会停止读取输入,因此只会读取"Language"中的"Language"。然后,printf函数将输出这个字符串。

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.已知函数,,输入任意一个x的值,输出对应的函数值y。

#include <math.h>

#include <stdio.h>

void main()

{ float x,y;

scanf("%f",&x);

y=______;sqrt(x*x-5*x )

printf(" y=%f\n ",y);

}

2.从键盘输入一个大写字母,改用小写字母输出。

#include <stdio.h>

void main()

{ char c1,c2;

printf("Please input a character:\n");

c1=____;%c

c2=c1+32;

printf("%c,%c",c1,c2);

}

3.以下程序的功能是求任意两点(x1,y1)与(x2,y2)之间的距离。

#include <math.h>

#include <stdio.h>

void main()

{ float x1,y1,x2,y2,dist;

printf("Input the point:\n");

scanf("%f %f %f %f",&x1,&y1,&x2,&y2);

dist= ;sqrt(y2*y2-y1*y1+x2*x2-x1*x1)*

sqrt(y2*y2-y1*y1)*

printf("dist=%f",dist);

}

4.输入两个浮点数,求它们的平方根之和。

#include <math.h>

#include <stdio.h>

void main()

{ float x,y,w;

scanf("%f,%f",_____);&x,&y

w=sqrt(x)+sqrt(y);

printf("%f",w);

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.计算两个数平方和的平方根。

(1)#include <math.h>

(2)#include <stdio.h>

(3) void main()

(4) {  float x=3.0,y=4.0,z; 

(5)   z=sqrt(x*x+y*y);//z = sqrt(x * x + y * y);

(6)    printf("%d\n",z); }

2.计算两个实数之和,并按小数形式输出。

(1)#include <stdio.h>

(2) void main()

(3)  { int a=12,b=2,c; 

(4)   c=a+b; 

(5)   printf("a=%5.2f,b=%5.2f,a+b=%5.2f\n",a,b,c); }
//变量 a、b 和 c 被声明为整数类型,但 printf 语句中的格式说明符使用了 %5.2f,这是用于浮点数的格式说明符,应该使用 %d 来打印整数。

3.输入能构成三角形的三边长x、y、z,求三角形的面积。

(1)#include <math.h>

(2)#include <stdio.h>   

(3)void main()

(4) {  float x,y,z,s,area;

(5)      scanf("%f,%f,%f",&x,&y,&z);

(6)      s=(x+y+z)/2;

(7)      area=sqrt(s(s−x)(s−y)(s−z));   

(8)      printf("area=%f",area); }
可以使用海伦公式(Heron's formula)计算三角形的面积,该公式如下:

$$area = \sqrt{s(s-a)(s-b)(s-c)}$$

其中,$a$、$b$ 和 $c$ 分别是三角形的三条边的长度,$s$ 是半周长,计算公式为:

$$s = \frac{a+b+c}{2}$$

因此,要计算三角形的面积,可以按照以下步骤进行:

1. 从用户处读取三角形的三条边的长度 $a$、$b$ 和 $c$。
2. 计算半周长 $s$。
3. 使用海伦公式计算面积 $area$。
4. 将结果输出给用户。

以下是一个使用 C 语言实现的示例代码:

```c
#include <math.h>
#include <stdio.h>

int main() {
    float a, b, c, s, area;
    printf("Enter the lengths of the three sides of the triangle: ");
    scanf("%f %f %f", &a, &b, &c);
    s = (a + b + c) / 2;
    area = sqrt(s * (s - a) * (s - b) * (s - c));
    printf("The area of the triangle is: %f\n", area);
    return 0;
}
```

运行程序后,用户将被提示输入三角形的三条边的长度,程序将计算并输出三角形的面积。

4.输出整型变量a、b的值。

(1)#include <stdio.h>

(2)void main()

(3){  int x,y;    

(4)      printf("please enter x,y:\n");

(5)      scanf("%d%d",x,y);//&&

(6)      printf("%d%d\n",x,y); }

5.输入能构成三角形的三边长x、y、z,求三角形的面积。

(1)#include <math.h>

(2)#include <stdio.h>

(3)void main()

(4){  float x,y,z,s,area;  

(5)      scanf("%f,%f,%f",x,y,z);//&&&

(6)      s=(x+y+z)/2;

(7)      area=sqrt(s*(s−x)*(s−y)*(s−z));

(8)      printf("area=%f",area); }

 

四、编程题

1.输入一个学生的3门课成绩,计算并输出其总成绩sum和平均成绩ave。

 #include<stdio.h>
 int main()
 {int a=0,b=0,c=0,sum=0;
  float ave=0;
  scanf("%f,%f,%f",&a,&b,&c)
      sum=a+b+c;
  ave=sum/3;
  printf("总成绩为%d\n",sum);
       printf("平均分为%f\n",ave);
    
     return 0;
 }
 //&遗忘
 //scanf遗忘 
 //scanf 行末尾缺少分号
 //使用 %d 格式说明符来读取整数。
 //printf 语句末尾缺少换行符,导致输出在同一行上。
 ​
 ​

04 选择结构习题

一、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ int x=1,a=0,b=0;

switch(x)

{ case 0: b++;

case 1: a++;

case 2: a++;b++;

}//不懂 a=2,b=1 或a=1 b=1

printf("a=%d,b=%d\n",a,b);01

}

2.#include <stdio.h>

void main()

{ int a=1,b=0;

switch(a)

{ case 1:

switch(b)

{ case 0: printf("$$$\n"); break;

case 1: printf("***\n"); break; }

break;

case 2: printf("%%%\n");

}

}$$$

3.#include <stdio.h>

void main()

{int a,b,c;

a=2, b=3,c=1;

if (a>b)

if(a>c)

printf("%d\n",a);

else

printf("%d\n",b);

printf("end\n");

}

本练习中要注意的是

if (a>b)

if(a>c)

printf("%d\n",a);

else

printf("%d\n",b);

是一条语句,当条件a>b为假时不执行内层的if else 语句,执行最后一条语句printf("end\n");,因此输出结果为end

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.从键盘输入3个整数分别给整型变量x、y、z,并输出3个数中的最大者。

#include <stdio.h>

void main()

{ int x,y,z,u;

scanf("%d %d %d",&x,&y,&z);

if(x>=y && x>=z) u=x;

else if( )

else u=z;

printf("max=%d\n",u);

}

2.将输入的百分制的分数转换为相应的等级并输出,100~90分为A,89~80分为B,79~70分为C,69~60分为D,小于60分为E。

#include <stdio.h>

void main()

{ int score,i;

scanf("%d",&score);

i=score/10;

switch(i)

{ case 10:

case 9: printf("A"); break;

case 8: printf("B"); break;

case 7: printf("C"); break;

case 6: printf("D"); break;

___ printf("E"); }default

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.以下程序的功能是输出x、y、z中的最大者。

(1) #include <stdio.h>

(2) void main()

(3) { int x=13,y=6,z=9;

(4) int u,v;

(5) if(x<y) u=x;(x > y)

(6) else u=y;

(7) if(u>z) v=u;

(8) else v=z;

(9) printf(" v=%d ",v); }

2.从键盘上输入两个数,输出它们之间较大的数。

(1) #include <stdio.h>

(2) void main()

(3) { float x1,x2,max;

(4) scanf("%f,%f",&x1,&x2);

(5) if(x1>=x2)

(6) max=x1;

(7) else

(8) max=x2;

(9) printf("%d",max); }//%f

3.以下程序的功能是将阿拉伯数字改写成中文数字,然后显示在屏幕上。

(1)#include <stdio.h>

(2)void main( )

(3){ char cd[23]="零一二三四五六七八九十";

(4) int figure;

(5) scanf("%d",&figure);

(6) if(figure>=0&figure<=10)

(7) { putchar(cd[figure*2]);

(8) putchar(cd[figure*2+1]);

(9) }

(10)}&&逻辑与与按位与

4.根据学生成绩的等级打印出分数段。

(1) #include <stdio.h>

(2) void main()

(3) { char grade;

(4) printf("input the grade :\n");

(5) scanf("%c",&grade);

(6) switch(grade)

(7) { case 'A' :printf("90−100\n"); break;

(8) case 'B' :printf("80−89\n"); break;

(9) case 'C' :printf("70−79\n"); break;

(10) case 'D' :printf("60−69\n"); break;

(11) case 'E' :printf("0−59\n"); break;

(12) else if :printf("error\n");

(13) }(1) #include <stdio.h>

(2) void main()

(3) { char grade;

(4) printf("input the grade :\n");

(5) scanf("%c",&grade);

(6) switch(grade)

(7) { case 'A' :printf("90−100\n"); break;

(8) case 'B' :printf("80−89\n"); break;

(9) case 'C' :printf("70−79\n"); break;

(10) case 'D' :printf("60−69\n"); break;

(11) case 'E' :printf("0−59\n"); break;

(12) else if :printf("error\n");

(13) }default: printf("error\n");

(14) }

四、编程题

1.有如下函数,请编写程序从键盘上输入任意一个x的值,输出对应y的值。

#include <stdio.h>
void main()
{ float  x,y;			
      scanf(" %f",&x);
      if(x<0) 
          y=x−8;
      else  if(x<99)
                    y=2*x-6;
          else 
                    y=x/9.0;
      printf (" %f",y);
}

2.有如下函数,请编写程序从键盘上输入任意一个x的值,输出对应y的值。

#include <stdio.h>
void main()
{	float  x,y;
		scanf("%f",&x);
		if(x<0)	 y=x;
		else  if(x<1)  y=2*x+6;
			  else  y=8*x−9;
		printf("%f\n",y);
	 }

3.判断一元二次方程是否有实根,若有实根显示根的值,否则显示“无实根”。

 #include <stdio.h>
#include <math.h>
void main()
{	float a,b,c,d,x1,x2;
		scanf("%f  %f  %f",&a,&b,&c);
   	d=b*b−4*a*c;
    	if (d>=0)
         {x1=(−b+sqrt(b*b−4*a*c))/(2*a);
          x2=(−b−sqrt(b*b−4*a*c))/(2*a);
          printf("x1=%f,x2=%f\n",x1,x2);}
   	else
          printf("无实根!");
}

4.任意输入三个数a、b、c,按从小到大的顺序输出。

 #include <stdio.h>
void main()
{  int  a,b,c,temp;
   scanf("%d%d%d",&a,&b,&c);
   if (a>b)  { temp=a;   a=b;   b=temp; }
   if (a>c)  { temp=a;   a=c;   c=temp; }
   if (b>c)  { temp=b;   b=c;   c=temp; }
   printf(" %d, %d, %d \n",a,b,c );
}

5.从键盘任意输入3个数,输出其中最小值。

#include <stdio.h>
void main( )
{  float  a,b,c,min;
scanf("%f%f%f",&a,&b,&c);
min=a;
if(b<min)  min=b;
if(c<min)   min=c;
printf("min=%f",min);}

6.编写程序,计算y=|x|。

#include <stdio.h>

void main()

{float x,y;

scanf("%f",&x);

if(x>0) y=x;

else if(x<0)

​       y=-x;

   else

​       y=0;

printf("%f\n",y);

}

05 循环结构习题

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.语句while(!G);中循环体能执行的条件!G等价于( )。

A.G = = 0 B.G! = 1 C.G! = 0 D.~ G

在C语言中,!G通常是用来表示逻辑非操作符,表示取反的意思。当!G用于一个表达式时,它会返回该表达式的相反值,如果表达式为真,则返回假,如果表达式为假,则返回真。例如,如果x为真,则!x为假,如果y为假,则!y为真。这在逻辑判断和条件语句中经常会用到。

2.设n为整型变量,则循环语句for(n=10;n>0;n− −)的循环次数是(C )。

A.9 B.11 C.10 D.12

3.设有程序段int k=8;while(k = = '8') {k−−;},则下面描述中正确的是( )。

A.循环体语句k− −;执行10次 B.循环体语句k− −;执行无限次

C.循环体语句k− −;一次也不执行 D.循环体语句k− −;执行一次

4.设有程序段

int k=’0’;

while(k==0) k=k−1;

则以下描述中,正确的是( 从从c\d)。

A.while循环体执行10次 B.循环是无限循环

C.循环体语句一次也不执行 D.循环体语句执行一次

二、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ int m=21,n=14,temp;

while(m!=0)

{ temp=m%n;

n=m/n;

m=temp;

}

printf("%d",n);

}

2.#include <stdio.h>

void main()

{ int i;

for(i=1;i<=5;i++)

{ if(i%2)

printf("*");

else

continue;

}

printf("$\n");

}

**$

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是在两位数中统计所有能被3整除的数的个数。

#include <stdio.h>

void main()

{ int i,num=0;

for(i=10;i<100;i++)

if(__i%3==0___)

num++;

printf("%d\n",num);

}

2.以下程序的功能是统计一个字符串中大写字母的个数,以回车符作为输入结束标志。

#include <stdio.h>

void main()

{ int alph=0;

char ch;

while((ch=getchar())!='\n')

if( ch>=A&&ch<=Z )

alph++;

printf("%d",alph);

}

3.以下程序的功能是统计一个字符串中大小写英文字母的个数,以回车符作为输入结束标志。

#include <stdio.h>

void main()

{ int ph=0;

char ch;

while((ch=getchar())!='\n')

if(ch>='A'&&ch<='Z'|| ch>='a'&&ch<='z')

_ph++__;

printf("%d",ph) ;

}

4.将从键盘上输入的大写字母转换成小写字母,其他字符不变,直到输入回车符为止。

#include <stdio.h>

void main()

{ char ch;

while ((ch=getchar())!='\n')

{ if(ch>='A'&&ch<='Z')

__ch=ch+32___

printf("%c",ch);

}

}

5.以下程序的功能是输出100以内个位数为6且能够被3整除的所有数。

#include <stdio.h>

void main()

{ int i,j;

for(i=0;i<10;i++)

{ j=i*10+6;

if(j%3!=0)

_____continue _;

printf("%d",j);

}

printf("\n ");

}

6.以下程序的功能是将1~500中的能被6整除的数输出。

#include <stdio.h>

void main()

{ int n;

for (n=1;n<=500;n++ )

{ if(n%6! =0 )

__continue + ;

printf("%d",n);

}

}

7.以下程序的功能是将50~500中的不能被8整除的数输出。

#include <stdio.h>

void main()

{ int n;

for(n=50;n<=500;n++)

{ if(n%8==0)

continue ;

printf(″%d″,n);

}

}

8.输出100以内且能被7整除的所有整数。

#include <stdio.h>

void main()

{ int i;

for (i=1; i<100**或i<=100**

;i++)

{ if(i%7) continue;

printf("%d",i);

}

printf("\n");

}

9.输入若干字符数据,分别统计其中A、B、C的个数。

#include <stdio.h>

void main()

{ char c;

inr k1=0,k2=0,k3=0;

while((c=getchar())!='\n')

{ i<100**或i<=100**

9. switch(c)

{ case 'A': k1++; break;

case 'B': k2++; break;

case 'C': k3++; break;

default:

}

}

printf("A=%d,B=%d\n,C=%d\n",k1,k2,k3);

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.变量a、b的初值是3。

(1)#include <stdio.h>

(2) void main()

(3) { int a=b=3,j; a=3,kb=3

(4) for(j=0;j<a;a−−,b++)

(5) printf("a+b=%d\n",a+b); }

2.求1+2+3+…+100的值。

(1)#include <stdio.h>

(2) void main()

(3) { int i=1,sum=0;

(4) do

(5) { sum+=i;i++;

(6) } while(i>100);i<100**或i<=100)

(7) printf("%d\n",sum);

(8) }

五、编程题

1.输入10个整数,统计并输出正数、负数和零的个数。

#include <stdio.h>

int main() {
    int num, positive=0, negative=0, zero=0;
    
    for (int i = 0; i < 10; i++) {
        printf("请输入第%d个整数: ", i+1);
        scanf("%d", &num);
        
        if (num > 0) {
            positive++;
        } 
        else if (num < 0) {
            negative++;
        } 
        else {
            zero++;
        }
    }
    
    printf("正数个数: %d\n", positive);
    printf("负数个数: %d\n", negative);
    printf("零的个数: %d\n", zero);
    
    return 0;
}

2.请编写程序求出1/1+1/2+1/3+1/4+1/5+…+1/99+1/100的值。

#include <stdio.h>

int main() {
    double sum = 0.0;
    
    for (int i = 1; i <= 100; i++) {
        sum += 1.0 / i;
    }
    
    printf("1/1 + 1/2 + 1/3 + ... + 1/99 + 1/100 的值为: %f\n", sum);
    
    return 0;
}

3.编程求1!+2!+…+10!。

#include <stdio.h>

int main() {
    int i, j;
    long long sum = 0;
    long long fact = 1;

    for (i = 1; i <= 10; i++) {
        fact = 1;
        for (j = 1; j <= i; j++) {
            fact *= j;
        }
        sum += fact;
    }
    
    printf("1! + 2! + ... + 10! 的值为: %lld\n", sum);
    
    return 0;
}

4.输入一串字符(按Enter键结束),分别统计并输出其中小写字母和大写字母的个数。

#include <stdio.h>

int main() {
    char ch;
    int uppercase = 0, lowercase = 0;

    printf("请输入一串字符,按Enter键结束:\n");

    while ((ch = getchar()) != '\n') {
        if (ch >= 'A' && ch <= 'Z') {
            uppercase++;
        } else if (ch >= 'a' && ch <= 'z') {
            lowercase++;
        }
    }

    printf("大写字母个数: %d\n", uppercase);
    printf("小写字母个数: %d\n", lowercase);

    return 0;
}

5.请编写程序求出1到100之间的偶数和。

#include <stdio.h>

int main() {
    int sum = 0;

    for (int i = 2; i <= 100; i += 2) {
        sum += i;
    }

    printf("1到100之间的偶数和为: %d\n", sum);

    return 0;
}

6.输入100个学生成绩,计算并输出平均成绩。

#include <stdio.h>

int main() {
    int numStudents = 100;
    int scores[numStudents];
    int sum = 0;

    printf("请输入100个学生成绩:\n");

    for (int i = 0; i < numStudents; i++) {
        scanf("%d", &scores[i]);
        sum += scores[i];
    }

    double average = (double)sum / numStudents;
    printf("平均成绩为: %.2f\n", average);

    return 0;
}

7.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() {
    int i, j, k;

    for (i = 1; i <= 5; i++) {
        for (j = 5; j > i; j--) {
            printf(" ");
        }
        for (k = 1; k <= 2 * i - 1; k++) {
            printf("#");
        }
        printf("\n");
    }

    return 0;
}

8.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() {
    int i, j;

    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= 2 * i - 1; j++) {
            printf("#");
        }
        printf("\n");
    }

    return 0;
}

9.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() { int i, j;

for (i = 1; i <= 3; i++) {
    for (j = 1; j <= 9; j++) {
        printf("#");
    }
    printf("\n");
}

return 0;

}

10.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() { int i, j;

for (i = 1; i <= 9; i++) {
    for (j = 1; j <= 10 - i; j++) {
        printf("#");
    }
    printf("\n");
}

return 0;

}

使用循环嵌套方法编程,输出下列图形。 ######### ########

#######

######

####

###

##

#

06 数组习题

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.以下数组的定义中,错误的是( D)。

A.int a[10]={'L','I','A','O','N','I','N','G'};

B.char b[10]={65,98,67,56,108,66};

C.char s[100]="TURBO C LANGUAGE";

D.int n=5,d[n];

2.以下数组的定义中,错误的是( A/B)。

A.int a[10]={'L','I','A','O','N','I','N','G'};

B.char a[5]="HELLO";

C.char b[10]={65,98,67,56,108,66};

D.char d[ ]="HELLO";

3.若有如下定义,则以下叙述中,正确的是( D)。

char x[ ]= "abcdefg";

char y[ ]={'a','b','c','d','e','f','g'};

A.数组x和数组y等价 B.数组x和数组y的长度相同

C.数组y的长度大于数组x的长度 D.数组x的长度大于数组y的长度

4.简单变量作为实参时,它和对应形参间的数据传递方式是(B )。

A.地址传递 B.单向值传递

C.由实参传给形参,再由形参传回给实参 D.由用户指定传递方式

5.若数组名作函数的实参,则实参传递给形参的是( C )。

A.数组元素的个数 B.数组元素的字节数

C.数组的首地址 D.数组的第一个元素的值

6.若已定义char s[10];,则下面的表达式中不能表示s[1]地址的是( A)。

A.s++ B.s+1 C.&s[0]+1 D.&s[1]

7.已定义int a[10]; ,以下对a的引用正确的是( D)。

A.a[10] B.a(6) C.a{6} D.a[10−10]

8.执行char str[10]="China\0"; 后,strlen(str)的结果是( A )。

A.5 B.6 C.10 D.9

执行char str[10]="China\0";后,字符串str中有5个字符,但是它们之间只有4个非空字符,因为字符串以空字符'\0'结尾。因此,strlen(str)的结果是:

A.5

9.若有定义int a[3][4];,则对a数组元素的非法引用是( D )。

A.a[0][2*1] B.a[1][3] C.a[4−2][0] D.a[0][4]

10.在执行int a[ ][3]={1,2,3,4,5,6}; 语句后,a[1][0]的值为( A)。

A.4 B.1 C.2 D.5

11.在执行char str[10]="China";语句后, strlen(str)的结果为( A )。

A.5 B.6 C.7 D.9

二、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ int i,k,a[10],p[3];

k=5;

for(i=0;i<10;i++) a[i]=i;

for(i=0;i<3;i++) p[i]=a[i*(i+1)];

for(i=0;i<3;i++) k+=p[i]*2;

printf("%d\n",k);

}29

2. #include <math.h>

#include <stdio.h>

void main()

{ int i,j;

static int s[11];

for (i=2;i<=10;i++) s[i]=i;

for(i=2;i<=sqrt(10);i++)

if(s[i])

for(j=i+i;j<=10;j+=i)

s[j]=0;

for(i=2;i<=10;i++)

if(s[i]) printf("%3d",i);

}

3.#include <stdio.h>

void main()

{ char a[10],i=0,sum;

printf("Please input a data string:\n");

scanf("%s",a);

sum=a[i]−'0';

while(a[i+1]!='\0')

{ sum=sum*8+a[i+1]−'0';

i=i+1;

}

printf("%d",sum);

}

运行时输入数据:142

4.#include <stdio.h>

void main()

{ char a[10];

int i=0,sum;

printf("Please input a binary data string:\n");

scanf("%s",a);

sum=a[i]−'0';

while(a[i+1]!='\0')

{ sum=sum*2+a[i+1]−'0';

i=i+1;

}

printf("%d",sum);

}

运行时输入数据:1010

5.#include <stdio.h>

void main()

{ int b3={0,1,2,0,1,2,0,1,2},i,j,t=0;

for(i=0;i<3;i++)

for(j=0;j<=i;j++)

t=t+bi[j]];

printf("%d",t);

}

6.#include <stdio.h>

void main()

{ int a3={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int i,j,sum=0;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(j>i)

sum+=ai;

printf(″%d″,sum);

}

7. #include <stdio.h>

void main()

{ static int a3={3,2,1,4,5,6,−2,9,1};

int i,j,sum=0;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{ if (i==j)

sum=sum+ai;

}

printf("sum=%d",sum);

}

8. #include <stdio.h>

void main()

{ int i,c;

static char num ={"CDEF","ACBD"};

for(i=0;i<4,i++)

{ c=num0+num1−2*'A';

printf("%3d ",c);

}

}

9. #include <stdio.h>

#include <string.h>

void main()

{ char p1[50],str[20]="abc";

strcpy(p1,"mnk");

strcat(p1,str);

printf("%s",p1);

}

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是输出字符串中的英文字符。

#include <stdio.h>

void main()

{ char a[80];

int i=0;

gets(a);

while(a[i]!=’\0’)

{ if(_____)

putchar(a[i]);

i++;

}

}A<=ch<=Z||z<=ch<=a

#include <stdio.h> 

void main()

{ 
    char a[80];
    int i=0;
    gets(a);

    while(a[i]!='\0')
    { 
        if((a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z'))
            putchar(a[i]);
        i++;
    }
}

2.以下程序的功能是输出数组a中的最大元素的下标。

#include <stdio.h>

void main()

{ int k,i;

int a[10];

for(i=0;i<10;i++) scanf(" %d ",&a[i]);

for(i=0,k=i;i<10;i++)

if(a[i]>a[k]) k=i ___;

printf("k=%d\n ",k);

}

3.以下程序的功能是对数组中的元素按由小到大顺序排序。

#include <stdio.h>

void main()

{int a[12]={34,56,7,−77,97,−35,−6,87,696,868,286,−586};int i,j,k;

for(k=11;k>=1;k−−)

for(i=0;i<k;i++)

if(a[i]>a[i+1])

{ j=a[i];

a[i]= a[i+1];

a[i+1]=j ;

}

for(i=0;i<12;i++ )

printf("%d",a[i]); }

4.以下程序的功能是将字符串s1复制到字符串s2中。

#include <string.h>

#include <stdio.h>

void main()

{ char s1[80],s2[80];

int i;

gets(s1);

for(i=0;i<=strlen(s1);i++)

__s2[i]=s1[i];

printf("%s",s2);

}

5.以下程序的功能是将输入的十进制数以八进制形式输出。

#include <stdio.h>

void main()

{ int n,c[8],i=0;

printf("Please input a number:\n");

scanf("%d",&n);

do{__c[i]=n%8;

i++;

n=n/8;

}while (n!=0);

for(−−i;i>=0;−−i)

printf("%d",c[i]);

}

6.以下程序的功能是用起泡法对数组中的元素值按由大到小顺序排序。

#include <stdio.h>

void main()

{ int a[10],i,j,k;

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(k=0;k<9;k++)

for(i=0;i<9−k;i++)

if( )

{ j=a[i] a[i]=a[i+1]; a[i+1]=j;}

for(i=0;i<10;i++)

printf("%d",a[i]);

}

7.以下程序的功能是在数组中顺序查找输入值为x的元素,如果找到该元素,输出其下标。

#include <stdio.h>

void main()

{ int a[10]={25,74,32,50,6,1,5,6,9,10};

int i,x;

printf("Input x:\n");

scanf("%d",&x);

for(i=0;i<10;i++)

if( a[i]==x )

{ printf("Found! The index is %d \n",i);

break;

}

if(i>=10) printf("Can't found!");

}

8.以下程序的功能是将输入的十进制数以二进制数形式输出。

#include <stdio.h>

void main()

{ int n,c[8],i=0;

printf("Please input a number:\n");

scanf("%d",&n);

do

{ c[i]=n%2;

i++;

n=n/2;

}while( n!=0 );

for(−−i;i>=0;−−i)

printf(″%d″,c[i]);

}

9.统计字符串的长度。

#include <stdio.h>

void main()

{ char string[30]="abcd123";

int i=0 _________;

while (string[i]!='\0')

{ i++; }

printf("%d\n",i);

}

10.将数组中的10个整数按逆序存放。

#include <stdio.h>

void main()

{ int a[10]={0,1,2,3,4,5,6,7,8,9},i,j,t;

for (i=0,j=9; _____; i++, j− −)

{ t=a[i];

a[i]=a[j];

a[j]=t;

}

for (i=0;i<10;i++)

printf("%d\n",a[i]);

}

11.将数组中最大的数与最后一个数交换位置。

#include <stdio.h>

void main()

{ static int a[5]={2,9,−1,6,3};

int max=a[0],i,k;

for(i=1;i<5;i++)

if(max<a[i])

{ max=a[i];

k=i;

}


a[4]=a[k];

a[k]=max;

for(i=0; i<5; i++)

printf("%4d",a[i]);

}

12.将一个有20个元素的数组,输入数据并在屏幕显示出来,每行5个数。

#include <stdio.h>

void main()

{ static int a[20];

int i,j;

for(i=0;i<20;i++)

scanf("%d",&a[i]);

for(i=0;i<20;i++)

{ printf("%6d",a[i]);

if( )

printf("\n");

}

}

13.将数组a的元素按行求和并且存储到数组s中,形式如下。

s[i]= (i=0,1,2)

#include <stdio.h>

void main()

{ static int s[3]={0,0,0},a3={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int i,j;

for(i=0;i<3;i++)

{ for (j=0;j<4;j++)

s[i]+= _____;

printf("%d",s[i]);

}

printf("\n");

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.将数组a中的9个元素输出。

(1)#include <stdio.h>

(2)void main()

(3){ static int a[9]={1,2,3,4,5,6,7,8,9};

(4) int i;

(5) for(i=1;i<=9;i++) i<9

(6) printf("%5d",a[i]); }

2.用“地址法”输出数组中的各个元素。

(1)#include <stdio.h>

(2)void main()

(3) { static int st[5]={9,8,7,6,5},i;

(4) for(i=0; i<5; i++)

(5) printf("%4d\n",*st); }

3.统计字符串中大写字符的个数。

(1)#include <stdio.h>

(2)void main()

(3){ char str[20];

(4) int i,n=0;

(5) gets(str);

(6) for(i=0; str[i]!='\n'; i++)

(7) if(str[i]>='A' && str[i]<='Z') n++;

(8) printf("%d\n",n); }

4.以下程序的功能是计算3×3阶矩阵的主对角线元素之和。

(1) #include <stdio.h>

(2) void main()

(3) { int i,sum=0,a3={1,2,3,4,5,6,7,8,9};

(4) for(i=0;i<=3;i++)

(5) sum+=ai;

(6) printf(" sum=%d\n ",sum); }

5.从键盘输入一个字符串,复制到另一个字符数组后输出。

(1)#include <stdio.h>

(2)void main()

(3){ char str1[80],str2[80];

(4) int i;

(5) printf("Input a string:");

(6) scanf("%s",str1);

(7) i=0;

(8) while(str1[i]!='\0')

(9) { str2[i]=str1[i];

(10) i++;}

(11) str2[i−1]='\0';

(12) printf("%s",str2);}

(13)}

6.从键盘上输入两个字符串,比较两个字符串是否相等。

(1)#include <stdio.h>

(2)void main( )

(3){ char str1[80],str2[80];

(4) int i,flag;

(5) gets(str1);

(6) gets(str2);

(7) i=0;

(8) while(str1[i]=str2[i])

(9) i++;

(10) if(str1[i]'\0'&&str2[i]'\0')

(11) flag=1;

(12) else

(13) flag=0;

(14) if (flag)

(15) printf("The two strings are equal.");

(16) else

(17) printf("The two strings are not equal.");

(18)}

7.从键盘输入一个字符串,复制到另一个字符数组后输出。

(1)#include <stdio.h>

(2)void main()

(3){ char str1[80],str2[80];

(4) int i;

(5) printf("Input a string:");

(6) scanf("%s",str1);

(7) i=0;

(8) while(str1[i]< >'\0')

(9) { str2[i]= str1[i];

(10) i++; }

(11) str2[i]='\0';

(12) printf("%s",str2);

(13)}

8.求二维数组中所有为负数的元素之和。

(1)#include <stdio.h>

(2)void main()

(3) { int a3={{1,4,−6,7},{−1,8,21,12},{3,9,−2,10}};

(4) int i,j,sum;

(5) for(i=0;i<3;i++)

(6) for(j=0;j<4;j++)

(7) if(ai<0) sum+=ai;

(8) printf("%d",sum);

(9)}

9.以下程序的功能是输出3个字符串中的最大字符串。

(1)#include <stdio.h>

(2)#include <string.h>

(3)void main()

(4) { char s[80],str3;

(5) int i;

(6) for(i=0;i<3;i++)

(7) gets(str);

(8) if(strcmp(str[0],str[1])>0)

(9) strcpy(s,str[0]);

(10) else

(11) strcpy(s,str[1]);

(12) if(strcmp(str[2],s)>0)

(13) strcpy(s,str[2]);

(14) printf("%s\n",s);

(15) }

10.以下程序的功能是删除字符串s中的所有数字字符。

(1) #include <stdio.h>

(2) void main()

(3) { char s[100];

(4) int n=0,i;

(5) gets(s);

(6) for(i=0; s[i]; i++)

(7) if(s[i]>=0&&s[i]<=9)

(8) s[n++]=s[i];

(9) s[n]='\0';

(10) puts(s);

(11)}

11.求二维数组中所有为正数的元素之和。

(1)#include <stdio.h>

(2)void main( )

(3){int a[3][4]={{1,4,−6,7},{−1,8,21,12},{3,9,−2,10}};

(4) int i,j,sum=0;

(5) for(i=0;i<3;i++)

(6) for(j=0;j<4;j++)

(7) if(a[i][j]<0) sum+=a[i][j];

(8) printf("%d",sum);

(9)}

// if(ai>0) sum+=ai;

07 函数习题

一、阅读程序题(写出程序的运行结果)

1. #include <stdio.h>

float max(float x,float y)

{

float z=x;

if(z<y)z=y;

return (z);

}

void main()

{ float a=3.5, b=8.7;

int c;

c=max(a,b);

printf("%d\n",c);

}

2.#include <stdio.h>

unsigned fun(unsigned num)

{ unsigned k=1;

do

{ k*=num%10;num/=10;} while(num);

return k;

}

void main()

{ unsigned n=26;

printf("%d\n",fun(n));

}

3.#include <stdio.h>

int ff(int n)

{ if(n==1)

return 1;

else

return ff(n−1)+1;

}

void main()

{ int i,j=0;

for(i=1;i<3;i++)

j+=ff(i);

printf("%d",j);

}

4. #include <stdio.h>

int fib(int g)

{ switch(g)

{ case 1:

case 2: return 1;

}

return(fib(g−1)+fib(g−2));

}

void main()

{ int k;

k=fib(5);

printf(″%d\n″,k);

}

5.#include <stdio.h>

int fun( int x)

{ static int a=3;

a=a+x;

return a;

}

void main()

{ int k=2,m=1,n;

n=fun(k);

n=fun(m);

printf("%d\n",n);

}

6.#include <stdio.h>

int fun(int a)

{ static int c=3;

int b=0;

b++;

c++;

return (a+b+c);

}

void main()

{ int a=2,i;

for(i=0;i<3;i++)

printf("%d,",fun(a));

}

7. #include <stdio.h>

int fun(int x,int y)

{ static int m=0;

int i=2;

i+=m+1;

m=i+x+y;

return(m);

}

void main()

{ int a=5,b=6;

printf(″%d,″,fun(a,b));

printf(″%d″,fun(b,a));

}

8. #include <stdio.h>

int sub(int n)

{ static int f=0;

f+=n;

return(f);

}

void main()

{ int i;

for(i=1;i<=4;i++)

printf("%3d",sub(5));

}

9. #include <stdio.h>

int f(int a )

{ auto int b=0;

static int c=3;

b=b+1;c=c+1;

return(a+b+c);

}

void main()

{ int a=1,i;

for(i=0;i<3;i++)

printf("%3d",f(a));

}

10.#include <stdio.h>

int fun(int p)

{int k=1;

static t=2;

k=k+1;

t=t+1;

return(pkt);

}

void main()

{int x=4;

fun(x);

printf("%d\n",fun(x));

}

11. #include <stdio.h>

int a=3,b=5;

void main()

{ void fun(void);

fun();

printf("a=%3d,b=%3d\n",a,b);

}

void fun(void)

{ int c;

c=a;a=b;b=c;

}

12.#include <stdio.h>

int a=63,b=52;

int max(int a,int b)

{ int c;

c=a>b?a:b;

return(c);

}

void main()

{ int a=28;

printf("%d\n",max(a,b));

}

13.#include <stdio.h>

int a=1,k=10;

int sub(int x,int y)

{ int n=0;

static int m=1;

m=m+a;

return(m+x*y);

}

void main()

{ int a=5,b;

b=sub(a,k);

b=sub(a,k);

printf("%d",b);

}

14.#include <stdio.h>

int m=4,n=6;

int max(int x, int y)

{ int max;

max=x>y?x : y;

return (max);

}

void main()

{ int m=10;

printf("%d\n",max(m,n));

}

15.#include <stdio.h>

int fib(int n)

{ if(n>2) return (fib(n−1));

else return 2;

}

void main()

{ printf("%d\n″,fib(4));}

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.Factorial( )函数的功能是计算n的阶乘(n!)。

float Factorial(int n)

{ int i;

float c=1.0;

for(i=1;i<=n;i++)

____;

return c;

}

2.以下程序的功能是输入一个ASCII码值,输出从该ASCII码开始的连续10个字符。

#include <stdio.h>

void put(char n)

{ int i,a;

for(i=0;i<=9;i++)

{ a=n+i;

putchar(a);

}

return;

}

void main( )

{ int ascii;

scanf("%c",&ascii);

;

}

3.strlength( )函数的功能是计算字符串str的长度,并作为函数值返回。

int strlength(char str[ ])

{ int i;

for(i=0;str[i]!='\0';i++);

return( );

}

4.以下函数的功能是将两个字符串s1和s2连接起来。

void con(char s1[ ],char s2[ ])

{ int i=0,j=0;

while(s1[i]!='\0') i++;

while(s2[j]!='\0')

s1[i++]=_____;

s1[i]='\0';

}

5.以下函数的功能是求数组中前n个数的平均值。

float average(float p[ ],int n)

{ float sum=0,aver;

int i;

for(i=0;i<n;i++)

sum+=__;

aver=sum/n;

return aver;

}

6.以下函数的功能是用选择法将数组中的n个元素按由小到大的顺序排序。

void sort(int s[ ],int n)

{ int i,j,k,t;

for(i=0;i<n−1;i++)

{ k=i;

for(j=i+1;j<n;j++)

if(__) k=j;

if(k!=i)

{ t=s[i]; s[i]=s[k]; s[k]=t; }

}

}

7. Numeral( ) 函数的功能是求6×6矩阵的元素值大于0的元素的个数。

void Numeral(int a6)

{ int i,j,num=0;

for(i=0;i<6;i++)

for(j=0;j<6;j++)

scanf("%d",&ai);

for(i=0;i<6;i++)

for(j=0;j<6;j++)

if( )

num=num+1;

printf("%d",num);

}

8. minimal( ) 函数的功能是求5×4矩阵中的最小元素。

int minimal(int a5)

{ int i,j,min;

min=a0;

for(i=0;i<5;i++)

for(j=0;j<4;j++)

if( )

min=ai;

return min;

}

9.计算当n=5时下面递归公式的值。

#include <stdio.h>

int tz(int n)

{ int c;

if(n==1) c=3;

else c= ;

return(c);

}

void main()

{ printf("tz(5)=%d\n",tz(5));

}

10.用递归的方法求整数n的阶乘(假设1<n<8)。

#include <stdio.h>

int fact(int n)

{ int ans;

if( n==1) ans=1;

else

ans=____;

return(ans);

}

void main()

{ int n;

scanf("%d",&n);

printf("\n%d\n",fact(n));

}

11.以下函数的功能是将若干给定的整数按由小到大排序。

void sort(int *s,int n)

{ int i,j,k,t;

for(i=0;i<=n−1;i++)

{ k=i;

for(j=i+1;j<n;j++)

if ( ) k=j; /比较两个元素/

if(k!=i)

{ t=(s+i);(s+i)=(s+k);(s+k)=t;}

}

}

12. inv( ) 函数的功能是交换a和b两个变量的值。

#include <stdio.h>

void inv(int *m,int *n )

{ int p;

p=*m;


*n=p;

}

void main()

{ int a=3,b=6;

inv(&a,&b);

printf("%d,%d",a,b);

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.以下fun( ) 函数的功能是求两个参数的和,并将和的值返回给调用函数。

(1) #include <stdio.h>

(2) int fun( int x ,y)

(3) { int c;

(4) c=x+y;

(5) return c; }

(6) void main()

(7) { int x=8,y=10;

(8) printf(" %d ",fun(x,y));

(9) }

2.求两个整数的和。

(1)#include <stdio.h>

(2)sum(int x, y)

(3){ return x+y;

(4)}

(5)void main()

(6){ int a=1,b=2;

(7) printf("%d\n",sum(a,b)); }

3.以下area( ) 函数的功能是求圆的面积。

(1) #define pi 3.1416

(2) float area(float r)

(3) { float aa;

(4) aa=pi×r×r;

(5) return aa;

(6) }

4.下列给定程序中fun( ) 函数的功能是计算正整数num各位上的数字之平方和。

(1)#include <stdio.h>

(2)int fun(int num)

(3){ int k=1;

(4) do

(5) { k+=(num%10)*(num%10);

(6) num/=10;

(7) }while(num);

(8) return (k);

(9) }

(10)void main( )

(11){ int n;

(12) scanf("%d",&n);

(13) printf("\n%d\n",fun(n));

(14)}

5. fun( ) 函数的功能是用递归调用的方法求mn。

(1)#include <stdio.h>

(2)fun( float m,float n)

(3) { float answer;

(4) if(n==0)

(5) answer=1;

(6) else

(7) answer=m*fun(m,n−1);

(8) return answer; }

(9)void main( )

(10){ printf("%f",fun(5,5));

(11)}

6.以下程序中fact( ) 函数的功能是用递归调用的方法求m的n次方。

(1)#include <stdio.h>

(2)int fact(int m,int n)

(3) { int answer;

(4) if(n==0) answer=1;

(5) eles

(6) answer=fact(m,n)*m;

(7) return answer; }

(8)void main()

(9){ printf("%d",fact(2,5));

(10)}

7. len( ) 函数的功能是求字符串的长度。

(1) int len(char s[100])

(2) { int i=−1,num=−1;

(3) do

(4) { i++;

(5) num++;

(6) }while(s[i]!='\0')

(7) return num;

(8) }

8.以下函数的功能是将字符串str按逆序存放。

(1) void fun(char str[ ])

(2) { char m;

(3) int i,j;

(4) j=strlen(str);

(5) for(i=0;i<j;i++,j−−)

(6) { m=str[i];

(7) str[i]=str[j];

(8) str[j]=m;

(9) }

(10) printf("%s",str);

(11)}

9.以下程序的功能是交换变量a、b的值。

(1)#include <stdio.h>

(2)void swap( int *p1,int *p2)

(3) { int p;

(4) p=*p1;

(5) p1=p2;

(6) *p2=p;

(7) }

(8) void main( )

(9) { int a,b;

(10) scanf("%d %d",&a,&b);

(11) swap (a,b);

(12) printf("a=%d,b=%d",a,b); }

10. average()函数的功能是求n名同学的平均成绩。

(1)#include <stdio.h>

(2)float average(int *a,int n)

(3) { int i;

(4) float av=0;

(5) for(i=0;i<n;i++)

(6) av=av+a[i];

(7) av=av/n;

(8) return av; }

(9)void main()

(10){ int a[]={45,76,89,78,76,73,91,65,70,50};

(11) float aver;

(12) average(a,10);

(13) printf("aver=%f",aver);

(14)}

11.函数sum的功能是求n名同学的总成绩。

(1)#include <stdio.h>

(2)float sum(int *a,int n)

(3){ int i;float av=0;

(4) for(i=0;i<n;i++)

(5) av=av+a[i];

(6) return av; }

(7) void main()

(8) { int a[]={45,76,89,78,76,73,91,65,70,50};

(9) float s;

(10) s=sum(a,10);

(11) printf("s=%f",sum);

(12)}

四、编程题

1.编写程序,通过函数调用方式计算y=|x|。

2.通过调用函数计算任意3个整数的和。

3.通过调用函数求任意两个整数的平方和。

4.通过调用函数求任意两个数的最大值。

5.通过调用函数求圆柱体体积。

6.通过调用函数求圆的面积。

08预处理习题

一、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

#define S(x) x*x

void main()

{ int a,k=3;

a=S(k+4);

printf("%d\n",a);

}

2.#include <stdio.h>

#define M(x,y,z) x*y−z

void main()

{ int a=1,b=2,c=3;

printf("%d",M(a+b,b+c,c+a));

}

3. #include <stdio.h>

#define M(x,y) x/y

void main()

{ int a=20,b=16,c=5;

printf(″%d″,M(a+b,c−b));

}

4. #define PI 3.14

#define R 3.0

#define S PIRR

#include <stdio.h>

void main()

{ printf("S=%.2f\n",S); }

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是通过带参的宏定义求圆的面积。

#include <stdio.h>

#define PI 3.1415926

#define AREA(r) ______#define AREA(r) (PI * (r) * (r))

void main()

{ float r=5;

printf("%f",AREA(r));

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.求圆的面积和周长。

(1)#include <stdio.h>

(2)#define PI=3.14159

(3) void main()

(4) { float r=5.0,s,z;

(5) s=PIrr;

(6) z=2PIr;

(7) printf("s=%6.2f,z=%6.2f\n",s,z); }

09 指针习题

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.已定义a为int型变量,则以下说明和初始化指针变量p的语句中,正确的是( D )。

A.int *p=a; B.int p=a;

C.int p=&a; D.int *p=&a;

2.在定义int a[10]; 之后,以下对a元素的引用中,不正确的为( B)。

A.a[1] B.*a C.*(a+6) D.a

3.设char s[10]; int j=3;,则以下表达式中,正确的是( )。

A.s(j+2) B.*(s+j) C.*(&s+j) D.*((s++)+j)

在这个情况下,正确的表达式是:

B. *(s+j)

这将对内存位置s+j进行解引用,有效地访问数组s的第(j+1)个元素。

4.设char s[10],*p=s;,则以下表达式不正确的是( B)。

A.p=s+5 B.s=p+s C.s[2]=*(p+4) D.*p=s[0]

5.设char s[10], *p; p=s;,则以下表达式中,正确的为( )。

A.p(2) B.(p+2) C.(&p+2) D.*((s++)+2)

6.设char s[4],*p=s+3;,则以下表达式中,正确的是( )。

A.p=s+5 B.s=p−s C.s[2]=p[3] D.*p=s[0]

7.设有定义char a[10]= "ABCD",p=a;,则(p+4)的值是( )。

A." ABCD" B.'D' C.'\0' D.不确定

8.在执行int a ={1,2,3,4,5,6}; 语句后,((a+1)+1)的值为( )。

A.4 B.1 C.2 D.5

9.定义一个指向一维数组的指针p,则以下正确的为( )。

A.int (*p)( ); B.int (*p)[4 ];

C.int *p( ); D.int *p[4 ];

10.定义一个指向函数的指针,以下正确的是( )。

A.int (p)( ); B.int (p)[ ];

C.int *p( ); D.int *p[ ];

11.设int **s; int *a; int k; k=10; a=&k; s=&a; 则以下值为10的语句是( C)。

A.a; B.s; C.**s; D.k;

在给定的代码中,s是一个指向指针的指针,a是一个指向整数的指针,k是一个整数。

因此,以下值为10的语句是:

C.**s;

这是因为*s将给出指向k的指针a的值,然后**s将解引用这个指针,得到k的值,即10。

12.设char **s;,则以下语句中,正确的是( )。

A.s="computer"; B.*s="computer";

C.**s="computer"; D.*s='c';

A. s="computer"; 这是错误的。因为s是一个指向指针的指针,所以它应该指向一个指针,而不是一个字符串常量。

C. s="computer"; 这也是错误的。因为s表示对指向指针的指针的解引用,然后尝试将字符串"computer"赋值给解引用的结果,这是不合法的操作。

D. s='c'; 这也是错误的。因为s是一个指向指针的指针,所以它应该指向一个指针,而不是一个字符常量。

二、阅读程序题(写出程序的运行结果)

1. #include <stdio.h>

void main()

{ int p1,p2,*p,a,b;

a=3;b=5;

p1=&a; p2=&b;

if(a<b)

{ p=p1; p1=p2; p2=p;}

printf("%3d %3d\n",p1,p2);

}

2.#include <stdio.h>

int A[ ]={2,4,6,8};

void main()

{ int i;

int *p=A;

for(i=0;i<4;i++,p++) A[i]=*p;

printf(" %d\n",A[2]);

}

3.#include <stdio.h>

void main()

{ int a[ ]={1,2,3,4,5,6},*p;

p=a;

*(p+3)+=2;

printf(″%d,%d\n″,p,(p+3));

}

4. #include <stdio.h>

void main()

{ static int a[10]={0,1,2,3,4,5,6,7,8,9};

int *p=a,s=0;

for(; p<a+10: p=p+2)

s=s+*p;

printf("%d",s);

}

5. #include <stdio.h>

void main()

{ char a[]="abcdefg",*b="china";

int i;

for(i=0;b[i]!='\0';i++)

a[i]=b[i];

a[i]='\0';

puts(a);

}

6.#include <stdio.h>

char *fun(char *s,char ch)

{ while(s&&s!=ch){s++;}

return s ;

}

void main()

{ char *s="abcdefg",ch=’c’;

printf(" %s",fun(s,ch));

}

7.#include <string.h>

#include <stdio.h>

void main()

{ char p1,p2,str[50]="ABCDEFG";

p1="abcd";

p2="efgh";

strcpy(str+1,p2+1);

strcpy(str+3,p1+3);

printf("%s",str);

}

8.#include <stdio.h>

#include <string.h>

void main()

{ char *s1="AbcDeG";

char *s2="CdEg";

s1+=2;

s2+=2;

printf("%d\n",strlen(s1)−strlen(s2));

}

9.#include <stdio.h>

void main()

{ int a=2,*p,**pp;

p=&a;

pp=&p;

a++;

printf("%d,%d,%d\n",a,*p,**pp);

}

10. #include <stdio.h>

void fun(int *a)

{ a=a+3;

}

void main()

{ int a=3;

fun(&a);

printf("%d\n",a);

}

一、单项选择题:

1.D 2.D 3.B 4.B 5.B 6.D 7.C 8.D 9.B 10.A

11.C 12.B

二、阅读程序题

1. 5 3 2. 6 3. 1,6 4. 20

5. china 6. cdefg 7. Afgd 8. 2

9. 3,3,3 10. 6

三、完善程序题

1. p=a 2. swap(&a,&b)

3. &a,&b 4. p=s 或p=&s[0]

5. p=a**或p=&a0**

四、程序改错题

1. (5) { if(*ch>='a'&&*ch<='z')

2. (9) if(*r=='\0') n++;

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.利用指针p输 出数组a的每个元素。

#include <stdio.h>

void main()

{ static int a[6]={2,4,6,3,5,7}; 47

int *p;

;

for(i=0;i<6;i++,p++)

printf("%d",*p);

}

2.以下程序的功能是调用swap( ) 函数,交换a,b的值。

#include <stdio.h>

void swap( int *p1,int *p2)

{ int p;

p=*p1; p1=p2; *p2=p;

}

void main()

{ int a,b;

scanf(" %d%d ",&a,&b);

_____;

printf(" a=%d,b=%d ",a,b);

}

3. swap( ) 函数的功能是交换变量a和b的值。

#include <stdio.h>

void swap(int *p1,int *p2)

{ int p;

p=*p1;

p1=p2;

*p2=p;

}

void main()

{ int a=3,b=5;

swap(____);

printf("a=%d,b=%d\n",a,b);

}

4.以下程序的功能是把终端读入的一行字符作为字符串放在字符数组中,然后输出。

#include <stdio.h>

void main()

{ int i;

char s[80],*p;

for(i=0;i<79;i++)

{ s[i]=getchar();

if(s[i]=='\n') break;

}

s[i]='\0';

____;

while(*p)

putchar(*p++);

}

5.以下程序的功能是用指针变量输出数组元素的值。

#include <stdio.h>

void main()

{ int a3={{9,8,7},{6,5,4},{3,2,1}};

int *p;

for(__;p<&a0+9;p++ )

printf("%d",*p);

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.把从键盘输入的小写字母变成大写字母并输出。

(1)#include <stdio.h>

(2)void main()

(3){ char c,*ch=&c;

(4) while((c=getchar( ))!='\n')

(5) { if(ch>='a'&ch<='z')

(6) putchar(*ch−'a'+'A');

(7) else

(8) putchar(*ch);

(9) }

(10) }

2.以下fun( ) 函数的功能是在字符串s中查找子串t的个数。

(1) int fun(char *s,char *t)

(2) { int n;char p,r;

(3) n=0;

(4) while(*s)

(5) { p=s;r=t;

(6) while(*r)

(7) if(r==p) { r++;p++;}

(8) else break;

(9) if(r=='\0') n++;

(10) s++;

(11) }

(12) return n;

(13) }

10 结构体公用体

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.C语言中,可用来定义包含多个不同类型独立属性值变量的类型是(A )。

A.结构体 B.数组 C.联合体 D.枚举

2.C语言中,可用来定义多个不同数据类型变量的数据类型是(A )。

A.结构体 B.文件型 C.数组 D.枚举

3.定义如下结构体,则表达式sizeof(stu1)的值是(B )。

struct student

{ char name[8];

int age;

struct

{ int year;

int month;

int day; } birth;

} stu1;

A.15 B.24 C.10 D.13

4.若有如下定义,则sizeof(struct PRG)的值是( )。

struct PRG

{ int c;

union

{ char st[4];

int i;

int j;

}test;

};

A.7 B.8 C.5 D.6

结构体和联合体的大小取决于其最大的成员的大小。

在C语言中,结构体的大小通常等于其所有成员的大小之和,加上编译器可能添加的一些填充字节以确保对齐要求。这意味着结构体的大小取决于其所有成员的大小,而不仅仅是最大的成员的大小。

对于联合体,它的大小等于其最大成员的大小,因为联合体中的所有成员共享同一块内存空间,因此大小取决于最大的成员。

5.下列程序段的输出结果是( )。

struct abc{ int a,b,c;};

void main()

{ struct abc s[2]={{1,2,3},{4,5,6}};

int t;

t=s[0].a+s[1].b;

printf(" %d\n",t); }

A.5 B.6 C.7 D.8

二、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ struct PRG

{ int c;

union

{ char st[8];

int i;

int j;

}test;

};

printf("%d",sizeof(struct PRG));

}

2. #include <stdio.h>

void main()

{ union student

{ int a[5];

float f;

char ch;

}stu;

printf("%d\n",sizeof(stu));

}

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.100名村民投票从3名候选人中选举一名村主任,以下程序的功能是统计各候选人的票数。

#include <string.h>

#include <stdio.h>

void main()

{ struct preson

{ char name[10];

int n;

}pp[3]={"Li",0,"Zhang",0,"Fan",0};/设定票箱/

int i,j;

char s[10];

for(i=1;i<=100;i++)

{ scanf("%s",s); /投票/

for (j=0;j<3;j++)

if(strcmp(_______)==0)

if(strcmp(s, pp[j].name) == 0)

pp[j].n++; /计票/

}

}

2.以下程序的功能是找出4名学生中成绩最好者,并输出其姓名和成绩。

#include <stdio.h>

void main()

{ int i,j=0;

float max;

struct st

{ char name[10];

int score;

}stu[4]={{"aa",67},{"bb",78},{"cc",98},{"dd",54}};

for(i=0;i<4;i++)

if(stu[j].score<stu[i].score)

______;

printf("%s,%d",stu[j].name, stu[j].score);

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.结构体数组中有两个学生的学号、姓名和年龄,输出其各项数据。

(1)#include <stdio.h>

(2)struct stu

(3){ int num;

(4) char name[8];

(5) int age; };

(6)void main()

(7){ int i;

(8) struct stu stud[2]={{01,"Wu",18},{02,"Zhu",19}};

(9) i=0;

(10) for( ;i<2;i++)

(11) printf("%d %s %d",stud[i]−>num,stud[i]−>name,stud[i]−>age);

(11) printf("%d %s %d",stud[i].num,stud[i].name,stud[i].age);

(12)}

1.26

2.结构体数组中有两个学生的学号、姓名和年龄,用指针输出数据。

(1)#include <stdio.h>

(2)struct stu

(3){ int num;

(4) char name[20];

(5) int age; };

(6)void main()

(7){ struct stu stud[2]={{01,"Li",19},{02,"Qi",20}},*p;

(8) p=stud;

(9) for( ;p<stud+2;p++)

(10) printf("%d %s %d\n",p.num,p.name,p.age);

printf("%d %s %d\n",p->num,p->name,p->age);

(11)}

3.定义一个结构体变量a并赋初值。

(1)student struct

(2){ int num;

(3) char name[20];

(4) char sex;

(5)}a={89031,"Lilin",'M'};

4.以下程序的功能是求一个学生的平均成绩并输出。

(1)#include <stdio.h>

(2)struct student

(3) { int num, score1, score2;

(4) float average;

(5) }stu1={1,67,89};

(6)void main()

(7){ stu1.average=(stu1.score1+stu1.score2)/2.0;

(8) printf("%f",stu1);

(9)}

11 文件习题

一、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是统计并输出当前盘当前目录下的文件myfile中所含字符个数。

#include <stdio.h>

void main()

{ FILE *fp;

int num=0;

if((fp=fopen(" myfile ","r "))==NULL)

{ printf(" Can not open file!\n ");

exit(0);

}

while(fgetc(fp)!=EOF) ___num=num+1;

fclose(fp);

printf(" num=%d ",num);

}

2.以下程序的功能是从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个"#"为止。

#include <stdio.h>

void main()

{ FILE *fp;

char ch,filename[10];

scanf("%s",filename);

if((fp=fopen(filename,"w"))==NULL)

{ printf("can not open file.\n");

exit(0);

}

ch=getchar();

while((ch!='#')

{ fputc(ch, fp__);

putchar(ch);

ch=getchar( );

}

fclose(fp);

}

3.以下程序的功能是从终端读入字符串(用$作为文本结束标志)并复制到一个名为out.dat的新文件中。

#include <stdio.h>

void main()

{ FILE *fp;

char ch;

if((fp=fopen("out.dat","w+"))==NULL) return 1;

while((ch=getchar())!='$')

fputc(ch,fp);

;

fclose(fp);

}

二、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.以下程序的功能是将从终端读入的文本(用$作为文本结束标志)复制到一个名为out.dat的新文件中。

(1)#include <stdio.h>

(2)void main()

(3){ FILE fp;

(4) char ch;

(5) if((fp=fopen("out.dat","w"))!=NULL)

(6) {

(7) while((ch=getchar( ))!='$') fputc(ch,fp);

(8) }

(9)fclose(fp);

(10)}

2.从键盘输入若干字符,并把它们输出到磁盘文件中保存。

(1)#include <stdio.h>

(2)void main()

(3){ FILE fp;

(4) char line[81];

(5) if((fp=fopen("aa.txt","w"))==NULL)

(6) { printf("文件不能打开");

(7) exit(0); }

(8) while(strlen(gets(line)>0)

(9) { fputs(line,fp);

(10) fputs("\n",fp);

(11) }

(12) fclose(fp);

(13)}

复习题

任意输入三个数a、b、c,按从小到大的顺序输出。{ // int x, y, z,a,b,c; // scanf_s("%d,%d,%d", &a, &b, &c); // if (a> b) // a= b; // if (a> c) // a = c; // if (b > c) // b= c; // printf("从大到小的值为%d,%d,%d", a, b, c); // return 0; //}

输入10个整数,统计并输出正数、负数和零的个数。

int main() { int numbers[10]; int positiveCount = 0, negativeCount = 0, zeroCount = 0;

 printf("Enter 10 integers:\n");
 for (int i = 0; i < 10; i++) {
     scanf("%d", &numbers[i]);
     if (numbers[i] > 0) {
         positiveCount++;
     }
     else if (numbers[i] < 0) {
         negativeCount++;
     }
     else {
         zeroCount++;
     }
 }
 ​
 printf("Number of positive numbers: %d\n", positiveCount);
 printf("Number of negative numbers: %d\n", negativeCount);
 printf("Number of zeros: %d\n", zeroCount);
 ​
 return 0;

}

You can use an array to store the 10 integers and then use a loop to iterate through the array and count the positive numbers, negative numbers, and zeros. Here's an example of how you can achieve this in C:

 #include <stdio.h>
 ​
 int main() {
     int numbers[10];
     int positiveCount = 0, negativeCount = 0, zeroCount = 0;
 ​
     printf("Enter 10 integers:\n");
     for (int i = 0; i < 10; i++) {
         scanf("%d", &numbers[i]);
         if (numbers[i] > 0) {
             positiveCount++;
         } else if (numbers[i] < 0) {
             negativeCount++;
         } else {
             zeroCount++;
         }
     }
 ​
     printf("Number of positive numbers: %d\n", positiveCount);
     printf("Number of negative numbers: %d\n", negativeCount);
     printf("Number of zeros: %d\n", zeroCount);
 ​
     return 0;
 }

请编写程序求出1/1+1/2+1/3+1/4+1/5+…+1/99+1/100的值。

你可以使用循环来计算这个序列的总和。以下是一个使用C语言的示例程序:

 #include <stdio.h>
 ​
 int main() {
     double sum = 0.0;
 ​
     for (int i = 1; i <= 100; i++) {
         sum += 1.0 / i;
     }
 ​
     printf("The sum of the series is: %f", sum);
 ​
     return 0;
 }

在这个示例程序中,我们使用了一个循环来计算1/1+1/2+1/3+1/4+1/5+…+1/99+1/100的总和。我们使用一个double类型的变量sum来存储总和,并在每次迭代中将1/i的值加到总和中。最后,程序打印出这个序列的总和。

通过调用函数计算任意3个整数的和。

#include <stdio.h>

int sumOfThree(int a, int b, int c) { return a + b + c; }

int main() { int num1, num2, num3, result; printf("Enter three integers: "); scanf("%d %d %d", &num1, &num2, &num3);

 result = sumOfThree(num1, num2, num3);
 ​
 printf("The sum of %d, %d, and %d is %d\n", num1, num2, num3, result);
 ​
 return 0;

}

通过函数调用方式计算y=|x|。

#include <stdio.h> int main()

{ int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

int i, j, sum = 0;

for (i = 0; i < 3; i++)

for (j = 0; j < 4; j++)

if (j > i)

sum += a[i][j]; printf("%d", sum); return 0; }

阅读程序题(写出程序的运行结果)

#include <stdio.h>

int fun(int a)

{ static int c=3;

int b=0; b++; c++;

return (a+b+c);}

void main()

{ int a=2,i; for(i=0;i<3;i++)

printf("%d,",fun(a));}

阅读程序题(写出程序的运行结果)

#include <stdio.h>

void main(){

int a[ ]={1,2,3,4,5,6},*p;

p=a; *(p+3)+=2; *

  • printf(″%d,%d\n″,p,(p+3));}

1,6

阅读程序题(写出程序的运行结果) #include <stdio.h> int fun(int x,int y){ static int m=0; int i=2; i+=m+1; m=i+x+y; return(m);}void main(){ int a=5,b=6; printf(″%d,″,fun(a,b)); printf(″%d″,fun(b,a));} 14,28

设char s[10],*p=s;,则以下表达式不正确的是( )。 A p=s+5

B s=p+s

C s[2]=*(p+4)

D *p=s[0]

选项 B 不正确。

在选项 B 中,表达式 p+s 的结果是一个指针,指向数组 s 中的第 5 个元素。但是,数组名 s 本身也是一个指向数组首元素的指针,因此将指针 ps 相加是没有意义的,也不符合 C 语言的语法规则。

其他选项都是正确的:

  • 选项 A 中,表达式 s+5 的结果是一个指针,指向数组 s 中的第 6 个元素,将其赋值给指针 p 是合法的。

  • 选项 C 中,表达式 *(p+4) 的结果是指针 p 指向的地址加上 4 个字节所对应的值,即数组 s 中的第 5 个元素,将其赋值给 s[2] 也是合法的。

  • 选项 D 中,表达式 s[0] 的值赋给 *p 也是合法的。

因此,答案是 B。

  1. (单选题)25.设n为整型变量,则循环语句for(n=10;n>0;n− −)的循环次数是(C)。

  • A. 9

  • B. 11

  • C. 10

  • D. 12

完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

从键盘输入一个大写字母,改用小写字母输出。

#include <stdio.h>

void main()

{ char c1,c2;

     printf("Please  input  a  character:\n");
 ​
     c1=____________;
 ​
     c2=c1+32;
 ​
     printf("%c,%c",c1,c2);

}

 使用气泡排序来实现乘法口诀表是不太合适的,因为气泡排序是一种用于对一维数组进行排序的算法,而乘法口诀表是一个二维的表格。不过,我们可以使用嵌套的循环来生成乘法口诀表。下面是一个示例代码,它使用嵌套的循环来生成一个简单的乘法口诀表:
 ​
 ```c
 #include <stdio.h>
 ​
 int main() {
  int i, j;
  for (i = 1; i <= 9; i++) {
      for (j = 1; j <= i; j++) {
          printf("%d * %d = %d\t", j, i, i*j);
      }
      printf("\n");
  }
  return 0;
 }
 ```
 ​
 在这个示例中,外层循环控制被乘数(1到9),内层循环控制乘数(1到被乘数)。在内层循环中,我们输出乘法表达式和结果,然后在每一行结束时换行。这样就可以生成一个简单的乘法口诀表。
 ​
 希望这个示例对您有所帮助。

以下是使用递归方法来求整数n的阶乘的完整程序:

 #include <stdio.h>
 ​
 int fact(int n) {
     if (n == 1) {
         return 1;  // 当n为1时,阶乘为1
     } else {
         return n * fact(n - 1);  // 递归调用自身,计算n的阶乘
     }
 }
 ​
 int main() {
     int n;
     scanf("%d", &n);
     printf("\n%d\n", fact(n));  // 输出n的阶乘
     return 0;
 }

在这个程序中,fact函数使用递归的方式来计算n的阶乘。当n为1时,阶乘为1;否则,使用递归调用自身来计算n的阶乘。最终,程序会输出n的阶乘。

希望这个程序对你有帮助。

看起来你想要使用指针p来遍历数组a,并打印数组中的元素。在这种情况下,你需要将指针p指向数组a的第一个元素,然后在循环中逐步递增指针p,并打印指针所指向的元素的值。

以下是一种可能的方法来完成这个任务:

 #include <stdio.h>
 ​
 int main() {
     static int a[6] = {2, 4, 6, 3, 5, 7};
     int *p;
 ​
     p = a;  // 将指针p指向数组a的第一个元素
 ​
     for (int i = 0; i < 6; i++, p++) {
         printf("%d ", *p);  // 打印指针p所指向的元素的值
     }
 ​
     return 0;
 }

在这个程序中,我们首先将指针p指向数组a的第一个元素,然后在循环中递增指针p,并打印指针所指向的元素的值。这样就可以实现遍历数组并打印数组元素的功能。

希望这个示例对你有所帮助。

default

求两个整数的和。 (1)#include <stdio.h> (2)sum(int x, y)//int sum(int x,int y) (3){ return x+y; (4)}(5)void main() (6){ int a=1,b=2; (7) printf("%d\n",sum(a,b)); }

#include <stdio.h>

void swap( int *p1,int *p2)

{ int p;

p=*p1; p1=p2; *p2=p;

}

void main()

{ int a,b;

scanf(" %d%d ",&a,&b);

___ swap( a,b)__;

printf(" a=%d,b=%d ",a,b);

#include <stdio.h>

void swap( int *p1,int *p2)

{ int p;

p=*p1; p1=p2; *p2=p;

}

void main()

{ int a,b;

scanf(" %d%d ",&a,&b);

___ swap( a,b)__;

printf(" a=%d,b=%d ",a,b);

}正确吗不正确。应该是 swap(&a, &b); 而不是 swap(a, b); 因为 swap 函数需要传入指针而不是值。

printf("%d %s %d",stud[i].num,stud[i].name,stud[i].age); printf("%d %s %d\n",p->num,p->name,p->age);分别在什么情况下使用

这两行代码都是用于输出结构体中的成员变量的值,不同之处在于输出的方式和适用的场景。

第一行代码是使用结构体变量stud的成员访问方式来输出结构体中的num、name和age成员的值。这种方式适用于在代码中直接定义并初始化了结构体变量的情况下,例如:

 struct student {
     int num;
     char name[20];
     int age;
 } stud = { 1001, "Tom", 20 };

在这种情况下,可以使用stud.num、stud.name和stud.age来访问结构体中的成员变量,并使用printf函数输出它们的值。

第二行代码是使用指向结构体的指针变量p来输出结构体中的num、name和age成员的值。这种方式适用于在代码中定义了一个指向结构体的指针变量,并通过指针变量来访问结构体中的成员变量的情况下,例如:

 struct student {
     int num;
     char name[20];
     int age;
 } stud = { 1001, "Tom", 20 };
 ​
 struct student *p = &stud;

在这种情况下,需要先定义一个指向结构体的指针变量p,并将其赋值为结构体变量stud的地址。然后可以使用指针变量p->num、p->name和p->age来访问结构体中的成员变量,并使用printf函数输出它们的值。需要注意的是,这里使用了箭头运算符->来访问指针所指向的结构体中的成员变量。

C语言

初识C语言

基本了解C语言的基础知识,对C语言有一个大概的认识。

每个知识点就是简单认识,不做详细讲解,后期课程都会细讲。

本章重点: 什么是C语言

第一个C语言程序

  • 数据类型

  • 变量、常量

  • 字符串+转义字符+注释

  • 选择语句

  • 循环语句

  • 函数

  • 数组

  • 操作符

  • 常见关键字

  • define 定义常量和宏

  • 指针

  • 结构体

1.什么是C语言?

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进 行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制 定了一套完整的美国国家标准语 法,称为ANSI C,作为C语言最初的标准。

[1] 目前2011年12月8日,国际标准化组织(ISO)和 国际电工委员会(IEC)发布的C11 标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字 标识符,一定程度上实现了汉 字编程。 C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。 其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等

2.第一个C语言程序

#include <stdio.h>
int main()
{
    printf("hello bit\n");
    printf("he he\n");
    return 0;
}
//解释:
//main函数是程序的入口
//一个工程中main函数有且仅有一个

3.数据类型

char //字符数据类型

short //短整型

int //整形

long //长整型

long long //更长的整形

float //单精度浮点数

double //双精度浮点数

//C语言有没有字符串类型?

为什么出现这么的类型?

每种类型的大小是多少?

#include  <stdio.h>
int main()
{   printf("%d\n", sizeof(char));  
 printf("%d\n", sizeof(short));  
 printf("%d\n", sizeof(int));   
 printf("%d\n", sizeof(long)); 
 printf("%d\n", sizeof(long long));  
 printf("%d\n", sizeof(float));  
 printf("%d\n", sizeof(double)); 
 printf("%d\n", sizeof(long double));  
 return 0; }

注意:存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。

类型的使用:

char ch='w';
int weight =120;
int salary=20000;

3.变量、常量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等) 有些值是可变的(比如:年龄,体重,薪资)

3.1定义变量的方法
int age=150;
float weight=45.5f;
char ch='w';
3.2变量的分类
  • 局部变量

  • 全局变量

#include <stdio.h>
int global=2019;//全局变量
int main(){
int local=2018;//局部变量
    //下面的global会不会有问题
int global=2020;//局部变量
printf("global=%d",global);

return 0;}

总结: 上面的局部变量global变量的定义其实没有什么问题的!

当局部变量和全局变量同名的时候,局部变量优先使用。

3.3变量的使用
#include<stdio.h>
int main()
{
    int num=0;
    int num=0;
    int sum=0;
    printf("请输入两个操作数:>");
    scanf("%d,%d",&num1,&num2);
    sum=num1+num2;
    printf("sum=%d\n",sum);
    return 0;
}
3.4变量的作用域和声明周期

作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的

而限定这个名字的可用性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围

  2. 全局变量的作用域是整个周期

生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

  1. 局部变量的生命周期是变量所在的局部范围

  2. 全局变量的作用域是整个工程

3.5常量

C语言中的常量和变量的定义的形式有所区别

C语言中的常量分为以下几种

  • 字面常量

  • const修饰的常变量

  • define定义的标识符常量'

  • 枚举常量

#include <stdio.h>
//举例
enum Sex
{MALE
    FEMALE
    UNKNOWN
}
//括号里的MALE,FEMALE,UNKNOWN是枚举常量
int main()
{
    
    //字面常量演示
    3.14
        1000
        //const修饰的常变量
        const float PI=3.14f;
    PI=5.14//这里的PI不能直接修改
        //#define的标识符常量演示
        #define MX=190
        printf("max=%d\n",max);
    //枚举常量演示
   printf("%d\n",MALE);
     printf("%d\n",FEMALE);
     printf("%d\n",UNKNOWN);
    //注 枚举常量的默认都是从零开始,依次向下递增一的
    return 0;
}

注: 上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了 变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量

4.字符串+转义字符+注释

4.1

"hello bit."\n

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。

#include <stdio.h>
//下面代码,打印结果是什么?为什么?
int main()
{
    char arr1[]="bit";
    char arr2[]={'b','i','t'};
    char arr3[]={'b','i','t';}
    printf("%s\n",arr1);
     printf("%s\n",arr2);
     printf("%s\n",arr3);
    
    return 0;
    
    
}

image-20231112204352423

4.2转义字符

假如我们要在屏幕上打印一个目录: c:\code\test.c

我们该如何写代码?

#include <stdio.h>
int main()
{
    
    
    printf("c:\code\test.c\n");
    return 0;
}

image-20231113101703127

#include <stdio.h>
int main()
{
    //问题1:在屏幕上打印一个单引号',怎么做?
    //问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?
    printf("%c\n", '\'');
    printf("%s\n", "\"");
    return 0;
}

5.注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉

  2. 代码中有些代码比较难懂,可以加一下注释文字

比如

#include <stdio.h>
int ADD(int x,int y,)
{
    return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{
    return x-y;
}
*/
int main()
{
    //C++注释风格
    //int a = 10;
    //调用Add函数,完成加法
    printf("%d\n", Add(1, 2));
    return 0;
}

注释有两种风格:

  • C语言风格的注释 /xxxxxx/

    • 缺陷:不能嵌套注释

  • C++风格的注释

    • //xxxxxxxx 可以注释一行也可以注释多行

6 选择语句

#includde <stdio.h>
int main()
{
    int codig =0;
    printf("你会去敲代码吗");
    scanf("%d",&coding);
    if (coding==1)
    {
        printf("keep it\n");
        
    }
        else
        {
            printf("maihongshu\n");
        }
    return 0;
}

7 循环语句

C语言中如何实现循环?

  • while

  • for

  • do while

//while 循环的实例
#include <stdio.h>
int main()
{
printf("加入比特\n");
int line=0;
while(line<=200)
{line++;
printf("我要继续努力敲代码\n");
}
    if(line>20000)
        printf("好offer");
    return 0;
    
}

8 函数

#include <stdio.h>
int main()
{
    int num1=0;
    int num2=0;
    int num3=0;
    printf("输入两个操作数:>");
    scanf("%d %d",&num1,&num2);
    sum =num1+num2;
    printf("sum=%d\n",sum);
}

//改写为函数如下
  #include<stdio.h>
int add(int x,int y)
{
    return x+y;
}
int main()
{
    int num1,num2,sum;
    printf("请输入两个操作数");
    scanf("%d %d",&num1,&num2);
    sum=add(num1,num2);
    printf("sum=%d\n",sum);
    return 0;
    
    
 
    
}



函数的特点就是简化代码,代码复用

9 数组

要存储1-10的数字,怎么存储?

C语言中给了数组的定义:一组相同类型元素的集合

9.1数组定义

‘int arr[10]={1,2,3,4,5,6};’//定义一个整形数组,最多放10个元素

9.2 数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。

数组可以通过下标来访问的。

int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
9.3数组的使用
#include <stdio.h>
int main()
{
 int i = 0;
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 for(i=0; i<10; i++)
 {
       printf("%d ", arr[i]);
 }
 printf("\n");
    return 0;
}

10 操作符

简单介绍为主,后面课件重点讲

算数操作符

‘+ - * / %’

移位操作符

>> <<

位操作符

& ^ |

赋值操作符

= += -= *= /= &= ^= |= >>= <<=

单目操作符

!`逻辑反操作

-负值

+正值

&取地址

sizeof操作数的类型长度(以字节为单位)

~对一个二进制位取反

--前置--,后置--

++前置++后置++

*间接访问操作符

(类型)强制类型转化

关系操作符

>

= <

<=

!= 用于测试“不相等”

== 用于测试“相等”

逻辑操作符

&&逻辑与

||逻辑或

条件操作符

exp1 ? exp2 : exp3

逗号表达式

exp1, exp2, exp3, …expN

下标引用、函数调用和结构成员

[] () . ->

11.常见关键字

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

11.1关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
    //观察num1和num2,这两个变量的类型是一样的
    unsigned int num1 = 0;
    uint_32 num2 = 0;
    return 0;
}
11.2 关键字static

在C语言中: static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量

  2. 修饰全局变量-称为静态全局变量

  3. 修饰函数-称为静态函数

11.2.1修饰局部变量
/代码1
#include <stdio.h>
void test()
{
    int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
 int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}
//代码2
#include <stdio.h>
void test()
{
    //static修饰局部变量
    static int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}
11.2.2修饰全局变量
 //代码1
 //add.c
 int g_val = 2018;
 //test.c
 int main()
 {
     printf("%d\n", g_val);
     return 0;
 }
 //代码2
 //add.c
 static int g_val = 2018;
 //test.c
 int main()
 {
     printf("%d\n", g_val);
     return 0;
 }
 ​

代码1正常,代码2在编译的时候会出现连接性错误。

结论:

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。

11.2.3修饰函数
 //代码1
 //add.c
 int Add(int x, int y)
 {
     return c+y;
 }
 //test.c
 int main()
 {
     printf("%d\n", Add(2, 3));
     return 0;
     }
 //代码2
 //add.c
 static int Add(int x, int y)
 {
     return c+y;
 }
 //test.c
 int main()
 {
     printf("%d\n", Add(2, 3));
     return 0;
 }
 ​

代码1正常,代码2在编译的时候会出现连接性错误.

一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用

12 #define定义常量和宏

 //define定义标识符常量
 #define MAX 1000
 //define定义宏
 #define ADD(x, y) ((x)+(y))
 #include <stdio.h>
 int main()
 {
     int sum = ADD(2, 3);
     printf("sum = %d\n", sum);
     
     sum = 10*ADD(2, 3);
     printf("sum = %d\n", sum);
     
     return 0;
 }
 ​

13.指针

13.1内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地 址。

image-20231114193942592

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。 取出变量地址如下:

 #include <stdio.h>
 int main()
 {
  int num = 10;
  &num;//取出num的地址
     //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
  printf("%p\n", &num);//打印地址,%p是以地址的形式打印
  return 0;
 }
 ​
 #include <stdio.h>
 int main()
 {
  int num = 10;
  int *p = &num;
  *p = 20;
     return 0;
 }
 #include <stdio.h>
 int main()
 {
  char ch = 'w';
  char* pc = &ch;
  *pc = 'q';
  printf("%c\n", ch);
     return 0;
 }
13.2指针变量的大小
 #include <stdio.h>
 //指针变量的大小取决于地址的大小
 //32位平台下地址是32个bit位(即4个字节)
 //64位平台下地址是64个bit位(即8个字节)
 int main()
 {
     printf("%d\n", sizeof(char *));
     printf("%d\n", sizeof(short *));
     printf("%d\n", sizeof(int *));
     printf("%d\n", sizeof(double *));
     return 0;
 }
 ​

指针大小在32位平台是4个字节,64位平台是8个字节。

14.结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。 比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。 这里只能使用结构体来描述了。 例如:

 struct Stu
 {
     char name[20];//名字
     int age;      //年龄
     char sex[5];  //性别
     char id[15]; //学号
 };
 ​

结构体的初始化:

 //打印结构体信息
 struct Stu s = {"张三", 20, "男", "20180101"};
 //.为结构成员访问操作符
 printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
 //->操作符
 struct Stu *ps = &s;
 printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
 >id);
 ​

分支语句和循环语句

分支语句

  • if

  • switch

循环语句

  • while

  • for

  • do while

goto语句

1 什么是语句

C语句可分为以下五类:

  1. 表达式语句

  2. 函数调用语句

  3. 控制语句

  4. 复合语句

  5. 空语句

本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语 言有九种控制语句。

可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句;

  2. 循环执行语句:do while语句、while语句、for语句;

  3. 转向语句:break语句、goto语句、continue语句、return语句

2.分支语句(选择结构)

2.1 if语句

那if语句的语法结构是怎么样的呢?

语法结构:
if(表达式)
    语句;
if(表达式)
    语句1;
else
    语句2;
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;
#include <stdio.h>
//代码1
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
}
//代码2
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
    else
   {
        printf("成年\n");
   }
}
//代码3
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("少年\n");
   }
    else if(age>=18 && age<30)
   {
        printf("青年\n");
   }
    else if(age>=30 && age<50)
   {printf("中年\n");
   }
    else if(age>=50 && age<80)
   {
        printf("老年\n");
   }
    else
   {
        printf("老寿星\n");
   }
    
}

如果表达式的结果为真,则语句执行。

在C语言中如何表示真假?

0表示假,非0表示真。

2.1.1悬空else

当你写了这个代码:

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

else的匹配:else是和它离的最近的if匹配的

2.1.2 if书写形式的对比
//代码1
if (condition) {
    return x;
}
return y;
//代码2
if(condition)
{
    return x;
}
else
{  return y;
}
//代码3
int num = 1;
if(num == 5)
{
    printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)//疑问
{
    printf("hehe\n");
}

代码2和代码4更好,逻辑更加清晰,不容易出错。

2.2switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期日

那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。

这就是switch 语句。

switch(整型表达式) { 语句项; }

2.2.1在switch语句中的break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

#include <stdio.h>
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0;
}
  1. 输入1-5,输出的是“weekday”;

  2. 输入6-7,输出“weekend”

#include <stdio.h>
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1: 
            case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

break语句 的实际效果是把语句列表划分为不同的分支部分。

编程好习惯

在最后一个 case 语句的后面加上一条 break语句。 (之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。

2.2.3练习2
 #include <stdio.h>
 int main()
 {
     int n = 1;
 int m = 2;
     switch (n)
    {
     case 1:
             m++;
     case 2:
             n++;
     case 3:
             switch (n)
            {//switch允许嵌套使用
              case 1:
                     n++;
              case 2:
                     m++;
                     n++;
                     break;
            }
     case 4:
             m++;
             break;
     default:
             break;
    }
     printf("m = %d, n = %d\n", m, n);
     return 0;
 }
 ​

3.循环语句

  • while

  • for do

  • while

3.1while循环

我们已经掌握了if语句

当条件满足的情况下,if语句后的语句执行,否则不执行。

但是这个语句只会执行一次。

由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢?

C语言中给我们引入了: while 语句,可以实现循环。

 //while 语法结构
 while(表达式)
  循环语句;
 ​

在屏幕上打印1-10的数字。

 #include<iostream>
 int main()
 {
 int i=0;
 while(i=<10){
 printf("%d",i);
 i++;}
 return 0;//while忘记{}
 }

上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下:

3.1.1while语句中的break和continue

break介绍

 //break 代码实例
 #include <stdio.h>
 int main()
 {
  int i = 1;
  while(i<=10)
  {
  if(i == 5)
  break;
      printf("%d ", i);
  i = i+1;
  }
  return 0;
 }
 ​

这里代码输出的结果是什么?

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 9 10

1 2 3 4 6 7 8 9 10

总结: break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。

continue介绍

 //continue 代码实例2
 #include <stdio.h>
 int main()
 {
  int i = 1;
  while(i<=10)
  {
     i = i+1;
      if(i == 5)
  continue;
  printf("%d ", i);
  }
  return 0;
 }

总结:

continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断

 //代码是什么意思
 //代码一
 include<stdio.h>
 int ch=0;while ((ch=getchar())!=EOF)
 putchar(ch);
 return 0;
 }

再看几个代码:

BIT-3-函数

  1. 函数是什么

  2. 库函数

  3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声明和定义 8. 函数递归 正文开始@比特就业课 1. 函数是什么? 数学中我们常见到函数的概念。但是你了解C语言中的函数吗? 维基百科中对函数的定义:子程序 在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组 成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软 件库。 2. C语言中函数的分类: 1. 库函数 2. 自定义函数 2.1 库函数: 为什么会有库函数? 1. 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想 把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格 式打印到屏幕上(printf)。 2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。 3. 在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。 像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发。 那怎么学习库函数呢? 这里我们简单的看看:www.cplusplus.com 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 简单的总结,C语言常用的库函数都有: IO函数 字符串操作函数 字符操作函数 内存操作函数 时间/日期函数 数学函数 其他库函数 我们参照文档,学习几个库函数:(教会学生怎么使用文档来学习库函数)。 strcpy memset 注: 但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。 这里对照文档来学习上面几个库函数,目的是掌握库函数的使用方法。 char * strcpy ( char * destination, const char * source ); void * memset ( void * ptr, int value, size_t num ); 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 2.1.1 如何学会使用库函数? 需要全部记住吗?No 需要学会查询工具的使用: MSDN(Microsoft Developer Network) www.cplusplus.com http://en.cppreference.com(英文版) http://zh.cppreference.com(中文版) 英文很重要。最起码得看懂文献。 2.2 自定义函数 如果库函数能干所有的事情,那还要程序员干什么? 所有更加重要的是自定义函数。 自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。 函数的组成: 我们举一个例子: 写一个函数可以找出两个整数中的最大值。 ret_type fun_name(para1, * ) { statement;//语句项 } ret_type 返回类型 fun_name 函数名 para1 函数参数 #include //get_max函数的设计 int get_max(int x, int y) { return (x>y)?(x):(y); } int main() { int num1 = 10; int num2 = 20; int max = get_max(num1, num2); printf("max = %d\n", max); 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 再举个例子: 写一个函数可以交换两个整形变量的内容。 3. 函数的参数 3.1 实际参数(实参): 真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形 参。 3.2 形式参数(形参): 形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单 元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有 效。 return 0; } #include //实现成函数,但是不能完成任务 void Swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } //正确的版本 void Swap2(int *px, int *py) { int tmp = 0; tmp = *px; *px = *py; py = tmp; } int main() { int num1 = 1; int num2 = 2; Swap1(num1, num2); printf("Swap1::num1 = %d num2 = %d\n", num1, num2); Swap2(&num1, &num2); printf("Swap2::num1 = %d num2 = %d\n", num1, num2); return 0; } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 上面 Swap1 和 Swap2 函数中的参数 x,y,px,py 都是形式参数。在main函数中传给 Swap1 的 num1 , num2 和传 给 Swap2 函数的 &num1 , &num2 是实际参数。 这里我们对函数的实参和形参进行分析: 代码对应的内存分配如下: 这里可以看到 Swap1 函数在调用的时候, x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。 所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。 4. 函数的调用: 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 4.1 传值调用 函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。 4.2 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。 4.3 练习 1. 写一个函数可以判断一个数是不是素数。 2. 写一个函数判断一年是不是闰年。 3. 写一个函数,实现一个整形有序数组的二分查找。 4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。 5. 函数的嵌套调用和链式访问 函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。 5.1 嵌套调用 函数可以嵌套调用,但是不能嵌套定义。 int main() { int num = 0; //调用函数,使得num每次增加1 return 0; } #include void new_line() { printf("hehe\n"); } void three_line() { int i = 0; for(i=0; i<3; i++) { new_line(); } } int main() { three_line(); return 0; } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 5.2 链式访问 把一个函数的返回值作为另外一个函数的参数。 6. 函数的声明和定义 6.1 函数声明: 1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放在头文件中的。 6.2 函数定义: 函数的定义是指函数的具体实现,交待函数的功能实现。 test.h的内容 放置函数的声明 test.c的内容 放置函数的实现 #include #include int main() { char arr[20] = "hello"; int ret = strlen(strcat(arr,"bit"));//这里介绍一下strlen函数 printf("%d\n", ret); return 0; } #include int main() { printf("%d", printf("%d", printf("%d", 43))); //结果是啥? //注:printf函数的返回值是打印在屏幕上字符的个数 return 0; } #ifndef TEST_H #define TEST_H //函数的声明 int Add(int x, int y); #endif //TEST_H 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 这种分文件的书写形式,在三字棋和扫雷的时候,再教学生分模块来写。 7. 函数递归 7.1 什么是递归? 程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小 7.2 递归的两个必要条件 存在限制条件,当满足这个限制条件的时候,递归便不再继续。 每次递归调用之后越来越接近这个限制条件。 7.2.1 练习1:(画图讲解) 接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4. 参考代码: #include "test.h" //函数Add的实现 int Add(int x, int y) { return x+y; } #include void print(int n) { if(n>9) { print(n/10); } printf("%d ", n%10); } int main() { int num = 1234; print(num); return 0; } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 7.2.2 练习2:(画图讲解) 编写函数不允许创建临时变量,求字符串的长度。 参考代码: 7.3 递归与迭代 7.3.1 练习3: 求n的阶乘。(不考虑溢出) 参考代码: 7.3.2 练习4: 求第n个斐波那契数。(不考虑溢出) 参考代码: 但是我们发现有问题; 在使用 fib 这个函数的时候如果我们要计算第50个斐波那契数字的时候特别耗费时间。 使用 factorial 函数求10000的阶乘(不考虑结果的正确性),程序会崩溃。 #incude int Strlen(const charstr) { if(*str == '\0') return 0; else return 1+Strlen(str+1); } int main() { char *p = "abcdef"; int len = Strlen(p); printf("%d\n", len); return 0; } int factorial(int n) { if(n <= 1) return 1; else return n * factorial(n-1); } int fib(int n) { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 为什么呢? 我们发现 fib 函数在调用的过程中很多计算其实在一直重复。 如果我们把代码修改一下: 最后我们输出看看count,是一个很大很大的值。 那我们如何改进呢? 在调试 factorial 函数的时候,如果你的参数比较大,那就会报错: stack overflow(栈溢出) 这样的信息。 系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。 那如何解决上述的问题: 1. 将递归改写成非递归。 2. 使用static对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代 nonstatic 局部对象(即栈对象),这不 仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保 存递归调用的中间状态,并且可为 各个调用层所访问。 比如,下面代码就采用了,非递归的方式来实现: int count = 0;//全局变量 int fib(int n) { if(n == 3) count++; if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } //求n的阶乘 int factorial(int n) { int result = 1; while (n > 1) { result *= n ; n -= 1; } return result; } //求第n个斐波那契数 int fib(int n) { int result; int pre_result; int next_older_result; result = pre_result = 1; 比特就业课 比特就业课-专注IT大学生就业的精品课程 比特主页:https://m.cctalk.com/inst/s9yewhfr 提示: 1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。 2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。 3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开 销。 函数递归的几个经典题目(自主研究): 1. 汉诺塔问题 2. 青蛙跳台阶问题

学校题目 不挂科速通

01 C语言概述习题

1.用C语言编写的C程序称之为( B)。

A.目标程序 B.源程序 C.汇编程序 D.命令程序

2.C语言源程序的基本单位为( B)。

A.过程 B.函数 C.子程序 D.标识符

3.一个C语言程序至少包含一个( A)。

A.函数 B.语句 C.命令 D.变量

4.以下四组用户标识符,其中合法的一组是( D)。

A.*A22,r12,st1 B.#my,&12x,studentN1

C.class,lotus1,2day D.Sb,sum,above

5.以下变量名称合法的是(D )。

A.$108 B.x1.1 C.3dx D.s_1

6.以下C语言标识符中,不正确的是(D )。

A.ABC B.abc C.a_bc D.ab.c

7.以下C语言标识符中,不正确的为(D )。

A.ABC B.abc C.a_bc D.ab%c

02 数据类型表达式

1.以下变量说明语句中,正确的是( C)。

A.int int; B.char a,b= 'AB';

C.char a=68,b='A'; D.int a=98.68,b="a";//不懂

2.C语言中运算对象必须是整型的运算符是( A)。

A.% B./ C.>= D.+

3.下列实型常数选项中,合法的是( C)。

A.5.8E6.0 B.E−10 C..6E0 D.98.6E

合法的实型常数应该符合浮点数的格式,即整数部分、小数点、小数部分、指数部分(可选),其格式为:

 <整数部分>.<小数部分>E<指数部分>

其中,整数部分可以省略,小数部分和指数部分至少要有一个。

根据这个格式,选项 A、B 和 D 都不符合合法的实型常数的格式。

选项 C 中的 .6E0 符合实型常数的格式,因为它的整数部分为空,小数部分是 6,指数部分是 0

因此,选项 C 是合法的实型常数。所以答案是 C..6E0。

4.在C语言类型说明中,char类型变量的长度为(D )字节。

A.2 B.4 C.8 D.1

5."A"和'A'在计算机内存中分别占用的字节数是(A )。

A.2和1 B.1和1 C.1和2 D.2和2

6.能正确定义整型变量a和b,并为它们赋初值5的语句是( D)。

A.a=b=5; B.int a,b=5; C.int a=b=5; //为什么不行 D.int a=5,b=5;

7.设int n=10,i=4,则赋值运算n%=i+1执行后,n的值为( )。

A.0 B.3 C.2 D.1

在这个表达式中,n%=i+1 是对 n 进行取模赋值运算,相当于 n = n % (i + 1)

首先,计算 i+1,得到5。然后,计算 n % 5,即10对5取模,结果是0。

因此,执行后,n 的值为0。所以答案是 A.0。

8.设int n=10,i=4,则赋值运算n%=i执行后,n的值为( C)。

A.0 B.3 C.2 D.1

9.设char ch;,则以下赋值语句中,正确的是(A )。

A.ch='123'; B.ch='\xff'; C.ch='\08'; D.ch="";

10.设有定义char ch;,则以下赋值语句中,不正确的是( D )。

A.ch=65; B.ch='\n'; C.ch='65'; D.ch='\x12';

11.设char ch; 则以下赋值语句中,正确的是( A)。

A.ch='123'; B.ch='\'; C.ch='\08'; D.ch="";

12.字符串常量"ab\ctd\376"的有效长度是( A )。

A.7 B.12 C.8 D.14

13.设有定义int a=5,b; ,则执行下列语句后,b的值不为2的是( )。

A.b=a/2 B.b=6−(− −a) C.b=a%2 D.b=a>3?2:4

14.设int n=3;,则++n的结果为( C)。

A.2 B.3 C.4 D.5

15.设int a=2,b=2;, 则a+++b的结果为(C/D )。

A.2 B.3 C.4 D.5

16.如果int i=3, j=4;,则k=i+++j执行之后,k、i和j的值分别为( )。

A.7,3,4 B.8,3,5 C.7,4,4 D.8,4,5

17.设int a=2,b=2;,则a - - - b的结果为( )。

A.0 B.1 C.2 D.4

18.设int n=2;,则++n+1= =4的结果为( C)。

A.true B.false C.1 D.0

19.设有定义int a=3,b=4;,则执行语句printf(" %d,%d",(a,b),(b,a));的输出是( B)。

A.3,4 B.4,3 C.3,3 D.4,4

20.设有定义int x=10,y=3;,则语句printf("%d",(x%y,x/y));的输出结果是( B)。

A.1 B.3 C.4 D.2

21.设有定义int x,a,b;,则执行语句x=(a=3,b=a− −);后,x、a、b的值依次是(A)。

A.3,2,3 B.3,2,2 C.3,3,2 D.2,3,2

22.设有定义int x=10,y=3;,则语句printf("%d",(x%y,x/y));的输出结果是(D)。

A.0 B.1 C.4 D.3

23.设所有变量均为整型,表达式r=(a=2,a=5,a++)执行后r的值是( B/c)。不懂

A.2 B.5 C.6 D.7

24.设有定义int x=10,y=3,z;,则语句printf(“%d\n”,z=(x%y,x/y));的输出结果是( B )。

A.0 B.3 C.4 D.1

25.设有定义int a=1,b=2,c=3,d=4;,则语句printf(″%d″,a>b?c:d);的输出结果是( D)。

A.3 B.1 C.2 D.4

26.设int a=1,b=2,c=3,d=4,则表达式a<b?a:c<d?c:d的值为( )。

A.1 B.2 C.3 D.4

表达式 a<b?a:c<d?c:d 中包含了条件运算符 ? :,它是一个三元运算符,根据条件的真假来返回两个可能的值之一。

首先,我们来分析这个表达式的执行顺序。根据运算符优先级,条件运算符的优先级较低,因此我们需要先进行比较运算。

  1. 首先进行 a < b 的比较,因为a是1,b是2,所以条件为真。

  2. 因此,整个表达式的值将是 a 对应的值,即1。

因此,表达式 a<b?a:c<d?c:d 的值为1。所以答案是 A.1。

27.设有float a=5.5,b=2.5;,则语句printf("%f",(int) a+b/b);的输出结果是(D )。

A.6.500000 B.6.5 C.5.500000 D.6.000000//不懂

28.设int i; char c; float f;,则以下结果为整型数的表达式的是(B )。

A.i+f B.i*c C.c+f D.i+c+f

29.设int a=2,b;,则执行b=a&&1; 后,b的结果为(B )。

A.0 B.1 C.2 D.3

30.若 int x=0,y=1;,则表达式(!x||y--)执行后,x、y的值分别为( A)。

A.0,0 B.0,1 C.1,0 D.1,1

根据给定的表达式 (!x||y--),我们首先来看一下逻辑非运算符 ! 和逻辑或运算符 || 的运算规则。

  • 逻辑非运算符 ! 用于取反,如果操作数为0,则结果为1;如果操作数为非0,则结果为0。

  • 逻辑或运算符 || 只要有一个操作数为真(非0),则结果为真;只有当两个操作数都为假(0)时,结果才为假。

现在我们来分析表达式 (!x||y--) 的执行过程:

  1. 首先计算 !x,因为 x 的值为0,所以 !x 的值为1。

  2. 接下来计算 y--,由于 y 的值为1,所以 y-- 的值为1,然后 y 的值减1,变为0。

  3. 最后计算 (!x||y--),根据逻辑或运算符的规则,因为有一个操作数为真(非0),所以结果为真,即1。

因此,执行完表达式 (!x||y--) 后,x 的值仍为0,y 的值变为0。

所以,x、y的值分别为 A.0,0。

31.设int a=2,b;,则执行b=a || 1; 后,b的结果为( )。

A.0 B.1 C.2 D.3

在这个问题中,|| 是逻辑或运算符。当使用逻辑或运算符时,如果其中一个操作数为真(非零),则结果为真;只有当两个操作数都为假(0)时,结果才为假。

在这个问题中,a的值是2,非零,因此被视为真。1也是真。因此,无论哪个操作数为真,结果都为真。

因此,执行b=a || 1; 后,b的结果为1。所以答案是 B.1

32.设int a=04,b;,则执行b=a<<1; 语句后,b的结果为( C)。

A.4 B.04 C.8 D.10

33.设有int b=4;,则语句printf("%d",b<<2);的输出结果是( D)。

A.2 B.8 C.4 D.16

34.设有定义char a=3,b=6,c;,则执行完语句c=(a^b)<<2;后,c的八进制值是(D )。

A.034 B.07 C.01 D.024

首先,我们需要了解位运算符。在这个问题中,我们使用的是异或运算符^和左移运算符<<

首先,我们执行异或运算:3的二进制表示是11,6的二进制表示是110。当我们对它们进行异或运算时,得到101,即5。

然后,我们对结果进行左移2位。5的二进制表示是101,当我们将它左移2位时,得到10100,即20。

最后,我们将结果转换为八进制。20的八进制表示是24。

因此,执行完语句c=(a^b)<<2;后,c的八进制值是24,选项D是正确答案。

异或运算是一种逻辑运算,其规则如下:

  • 如果两个对应的二进制位相同,则结果为0。

  • 如果两个对应的二进制位不同,则结果为1。

例如:

  0110 (6的二进制表示)
^ 0011 (3的二进制表示)
  ----
  0101 (5的二进制表示)

这是因为对应的二进制位有两个不同的位,所以结果是1。

35.设有int b=4;则语句printf("%d",b&4);的输出结果是( )。

A.8 B.4 C.16 D.2

根据位运算符的优先级,按位与运算符&的优先级低于格式化输出符号%。因此,b&4会先被计算,它的值为4。然后,printf("%d", 4)会输出4。因此,输出结果是4,选项B正确。

36.设int a=07,b;,则执行b=a>>1; 语句后,b的结果为( )。

A.3 B.4 C.8 D.7

在C语言中,以0开头的整数常量表示八进制数。因此,a的值为7,而不是十进制的7。执行a>>1时,相当于把a的二进制数向右移动一位,即0111(二进制表示)变成0011(二进制表示),即十进制的3。因此,b的值为3,选项A正确。

37.对以下程序段,要求给变量i赋值5,给变量j赋值20,则应该从键盘正确输入的是( A)。

{ int i,j;

scanf(″i=%d,j=%d″,&i,&j);

printf(″i=%d,j=%d″,i,j);

}

A.5,20 B.i=5,j=20 C.520 D.i=5j=20

38.使用读入语句scanf("a=%d,b=%f",&a,&b);,则以下从键盘输入数据的形式正确的是(A )。

A.30,5.5<回车> B.a=30,b=5.5<回车>

C.30 5.5<回车> D.a=30 b=5.5<回车>

39.逗号表达式(a=3 * 5,a*4),a+15的值为( C)。

A.15 B.60 C.30 D.不确定

逗号表达式会依次执行每个子表达式,但只有最后一个子表达式的值会作为整个表达式的值返回。因此,a的值为15,但它不会影响后面的表达式a+15,所以a+15的值为30。所以答案是C。

40.sizeof(double)是一个( A )表达式。

A.整型 B.实型 C.不合法 D.函数调用

41.程序设计的三种基本结构是( D)。

A.顺序结构、分支结构、选择结构 B.递归结构、循环结构、选择结构

C.顺序结构、循环结构、逻辑结构 D.顺序结构、循环结构、选择结构

03 程序结构习题

一、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ printf("%c,%d",'A'+5,'A'+5); }

F,72

2. #include <stdio.h>

void main()

{ char ch1='a',ch2;

ch2=ch1+5;

printf("%c",ch2);

}

f

3.#include <stdio.h>

void main()

{ float x,y;

x=1;

y=x+5/2;

printf("%f",y);

}//不懂

3.5

4. #include <stdio.h>

void main()

{ float x,y;

x=1/2,y=2;

printf("%.1f\n",x+y);

}

根据提供的代码,程序的运行结果将是:

2.0

这是因为在表达式1/2中,12都是整数,因此整数相除结果仍为整数,即0.5被截断为0。然后,x被赋值为0.0(因为1/2的结果是0),y被赋值为2.0。所以x+y的结果是2.0

5. #include <stdio.h>

void main()

{ float x,y;

x=1e−1;y=−12.9;

printf("x=%5.1f,y=%5.1f\n",x,y);

}

x=0.1,y=-12.9

6.#include <stdio.h>

void main()

{ int x=10,y;

y=x++;

printf("%d,%d",x,y);

}11,10 //注意

7.#include <stdio.h>

void main()

{ int a=3;

printf("%d",(a+=a−=a*a));

}

根据提供的代码,程序的运行结果将是:

3

这是因为代码中的表达式(a+=a−=a*a)包含了多个赋值运算符,而且这些赋值运算符在同一表达式中没有定义明确的优先级。根据C语言的运算符优先级规则,赋值运算符的优先级低于加减法运算符。因此,表达式的计算顺序如下:

  1. a * a,即3 * 3,得到9

  2. a -= 9,即a = a - 9a的值变为-6

  3. a += -6,即a = a + (-6)a的值变为-3

所以,printf语句输出的值是-3

8.#include <stdio.h>

void main()

{ int x=3,y=3,z=1;

printf("%d,%d\n",(++x,y++),z+2);

}5

9. #include <stdio.h>

void main()

{ int a=2,b=5,c=7;

a=a>b?a:b;

a=a>c?a:c;

printf("%d",a);

}7

10.#include <stdio.h>

void main()

{ char str[30];

scanf("%s",str);

printf("%s\n",str);

}

输入 Language Programming

根据提供的代码,程序的运行结果将是:

Language

这是因为scanf函数在遇到空格、制表符或换行符时会停止读取输入,因此只会读取"Language"中的"Language"。然后,printf函数将输出这个字符串。

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.已知函数,,输入任意一个x的值,输出对应的函数值y。

#include <math.h>

#include <stdio.h>

void main()

{ float x,y;

scanf("%f",&x);

y=______;sqrt(x*x-5*x )

printf(" y=%f\n ",y);

}

2.从键盘输入一个大写字母,改用小写字母输出。

#include <stdio.h>

void main()

{ char c1,c2;

printf("Please input a character:\n");

c1=____;%c

c2=c1+32;

printf("%c,%c",c1,c2);

}

3.以下程序的功能是求任意两点(x1,y1)与(x2,y2)之间的距离。

#include <math.h>

#include <stdio.h>

void main()

{ float x1,y1,x2,y2,dist;

printf("Input the point:\n");

scanf("%f %f %f %f",&x1,&y1,&x2,&y2);

dist= ;sqrt(y2*y2-y1*y1+x2*x2-x1*x1)*

sqrt(y2*y2-y1*y1)*

printf("dist=%f",dist);

}

4.输入两个浮点数,求它们的平方根之和。

#include <math.h>

#include <stdio.h>

void main()

{ float x,y,w;

scanf("%f,%f",_____);&x,&y

w=sqrt(x)+sqrt(y);

printf("%f",w);

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.计算两个数平方和的平方根。

(1)#include <math.h>

(2)#include <stdio.h>

(3) void main()

(4) {  float x=3.0,y=4.0,z; 

(5)   z=sqrt(x*x+y*y);//z = sqrt(x * x + y * y);

(6)    printf("%d\n",z); }

2.计算两个实数之和,并按小数形式输出。

(1)#include <stdio.h>

(2) void main()

(3)  { int a=12,b=2,c; 

(4)   c=a+b; 

(5)   printf("a=%5.2f,b=%5.2f,a+b=%5.2f\n",a,b,c); }
//变量 a、b 和 c 被声明为整数类型,但 printf 语句中的格式说明符使用了 %5.2f,这是用于浮点数的格式说明符,应该使用 %d 来打印整数。

3.输入能构成三角形的三边长x、y、z,求三角形的面积。

(1)#include <math.h>

(2)#include <stdio.h>   

(3)void main()

(4) {  float x,y,z,s,area;

(5)      scanf("%f,%f,%f",&x,&y,&z);

(6)      s=(x+y+z)/2;

(7)      area=sqrt(s(s−x)(s−y)(s−z));   

(8)      printf("area=%f",area); }
可以使用海伦公式(Heron's formula)计算三角形的面积,该公式如下:

$$area = \sqrt{s(s-a)(s-b)(s-c)}$$

其中,$a$、$b$ 和 $c$ 分别是三角形的三条边的长度,$s$ 是半周长,计算公式为:

$$s = \frac{a+b+c}{2}$$

因此,要计算三角形的面积,可以按照以下步骤进行:

1. 从用户处读取三角形的三条边的长度 $a$、$b$ 和 $c$。
2. 计算半周长 $s$。
3. 使用海伦公式计算面积 $area$。
4. 将结果输出给用户。

以下是一个使用 C 语言实现的示例代码:

```c
#include <math.h>
#include <stdio.h>

int main() {
    float a, b, c, s, area;
    printf("Enter the lengths of the three sides of the triangle: ");
    scanf("%f %f %f", &a, &b, &c);
    s = (a + b + c) / 2;
    area = sqrt(s * (s - a) * (s - b) * (s - c));
    printf("The area of the triangle is: %f\n", area);
    return 0;
}
```

运行程序后,用户将被提示输入三角形的三条边的长度,程序将计算并输出三角形的面积。

4.输出整型变量a、b的值。

(1)#include <stdio.h>

(2)void main()

(3){  int x,y;    

(4)      printf("please enter x,y:\n");

(5)      scanf("%d%d",x,y);//&&

(6)      printf("%d%d\n",x,y); }

5.输入能构成三角形的三边长x、y、z,求三角形的面积。

(1)#include <math.h>

(2)#include <stdio.h>

(3)void main()

(4){  float x,y,z,s,area;  

(5)      scanf("%f,%f,%f",x,y,z);//&&&

(6)      s=(x+y+z)/2;

(7)      area=sqrt(s*(s−x)*(s−y)*(s−z));

(8)      printf("area=%f",area); }

 

四、编程题

1.输入一个学生的3门课成绩,计算并输出其总成绩sum和平均成绩ave。

 #include<stdio.h>
 int main()
 {int a=0,b=0,c=0,sum=0;
  float ave=0;
  scanf("%f,%f,%f",&a,&b,&c)
      sum=a+b+c;
  ave=sum/3;
  printf("总成绩为%d\n",sum);
       printf("平均分为%f\n",ave);
    
     return 0;
 }
 //&遗忘
 //scanf遗忘 
 //scanf 行末尾缺少分号
 //使用 %d 格式说明符来读取整数。
 //printf 语句末尾缺少换行符,导致输出在同一行上。
 ​
 ​

04 选择结构习题

一、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ int x=1,a=0,b=0;

switch(x)

{ case 0: b++;

case 1: a++;

case 2: a++;b++;

}//不懂 a=2,b=1 或a=1 b=1

printf("a=%d,b=%d\n",a,b);01

}

2.#include <stdio.h>

void main()

{ int a=1,b=0;

switch(a)

{ case 1:

switch(b)

{ case 0: printf("$$$\n"); break;

case 1: printf("***\n"); break; }

break;

case 2: printf("%%%\n");

}

}$$$

3.#include <stdio.h>

void main()

{int a,b,c;

a=2, b=3,c=1;

if (a>b)

if(a>c)

printf("%d\n",a);

else

printf("%d\n",b);

printf("end\n");

}

本练习中要注意的是

if (a>b)

if(a>c)

printf("%d\n",a);

else

printf("%d\n",b);

是一条语句,当条件a>b为假时不执行内层的if else 语句,执行最后一条语句printf("end\n");,因此输出结果为end

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.从键盘输入3个整数分别给整型变量x、y、z,并输出3个数中的最大者。

#include <stdio.h>

void main()

{ int x,y,z,u;

scanf("%d %d %d",&x,&y,&z);

if(x>=y && x>=z) u=x;

else if( )

else u=z;

printf("max=%d\n",u);

}

2.将输入的百分制的分数转换为相应的等级并输出,100~90分为A,89~80分为B,79~70分为C,69~60分为D,小于60分为E。

#include <stdio.h>

void main()

{ int score,i;

scanf("%d",&score);

i=score/10;

switch(i)

{ case 10:

case 9: printf("A"); break;

case 8: printf("B"); break;

case 7: printf("C"); break;

case 6: printf("D"); break;

___ printf("E"); }default

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.以下程序的功能是输出x、y、z中的最大者。

(1) #include <stdio.h>

(2) void main()

(3) { int x=13,y=6,z=9;

(4) int u,v;

(5) if(x<y) u=x;(x > y)

(6) else u=y;

(7) if(u>z) v=u;

(8) else v=z;

(9) printf(" v=%d ",v); }

2.从键盘上输入两个数,输出它们之间较大的数。

(1) #include <stdio.h>

(2) void main()

(3) { float x1,x2,max;

(4) scanf("%f,%f",&x1,&x2);

(5) if(x1>=x2)

(6) max=x1;

(7) else

(8) max=x2;

(9) printf("%d",max); }//%f

3.以下程序的功能是将阿拉伯数字改写成中文数字,然后显示在屏幕上。

(1)#include <stdio.h>

(2)void main( )

(3){ char cd[23]="零一二三四五六七八九十";

(4) int figure;

(5) scanf("%d",&figure);

(6) if(figure>=0&figure<=10)

(7) { putchar(cd[figure*2]);

(8) putchar(cd[figure*2+1]);

(9) }

(10)}&&逻辑与与按位与

4.根据学生成绩的等级打印出分数段。

(1) #include <stdio.h>

(2) void main()

(3) { char grade;

(4) printf("input the grade :\n");

(5) scanf("%c",&grade);

(6) switch(grade)

(7) { case 'A' :printf("90−100\n"); break;

(8) case 'B' :printf("80−89\n"); break;

(9) case 'C' :printf("70−79\n"); break;

(10) case 'D' :printf("60−69\n"); break;

(11) case 'E' :printf("0−59\n"); break;

(12) else if :printf("error\n");

(13) }(1) #include <stdio.h>

(2) void main()

(3) { char grade;

(4) printf("input the grade :\n");

(5) scanf("%c",&grade);

(6) switch(grade)

(7) { case 'A' :printf("90−100\n"); break;

(8) case 'B' :printf("80−89\n"); break;

(9) case 'C' :printf("70−79\n"); break;

(10) case 'D' :printf("60−69\n"); break;

(11) case 'E' :printf("0−59\n"); break;

(12) else if :printf("error\n");

(13) }default: printf("error\n");

(14) }

四、编程题

1.有如下函数,请编写程序从键盘上输入任意一个x的值,输出对应y的值。

#include <stdio.h>
void main()
{ float  x,y;			
      scanf(" %f",&x);
      if(x<0) 
          y=x−8;
      else  if(x<99)
                    y=2*x-6;
          else 
                    y=x/9.0;
      printf (" %f",y);
}

2.有如下函数,请编写程序从键盘上输入任意一个x的值,输出对应y的值。

#include <stdio.h>
void main()
{	float  x,y;
		scanf("%f",&x);
		if(x<0)	 y=x;
		else  if(x<1)  y=2*x+6;
			  else  y=8*x−9;
		printf("%f\n",y);
	 }

3.判断一元二次方程是否有实根,若有实根显示根的值,否则显示“无实根”。

 #include <stdio.h>
#include <math.h>
void main()
{	float a,b,c,d,x1,x2;
		scanf("%f  %f  %f",&a,&b,&c);
   	d=b*b−4*a*c;
    	if (d>=0)
         {x1=(−b+sqrt(b*b−4*a*c))/(2*a);
          x2=(−b−sqrt(b*b−4*a*c))/(2*a);
          printf("x1=%f,x2=%f\n",x1,x2);}
   	else
          printf("无实根!");
}

4.任意输入三个数a、b、c,按从小到大的顺序输出。

 #include <stdio.h>
void main()
{  int  a,b,c,temp;
   scanf("%d%d%d",&a,&b,&c);
   if (a>b)  { temp=a;   a=b;   b=temp; }
   if (a>c)  { temp=a;   a=c;   c=temp; }
   if (b>c)  { temp=b;   b=c;   c=temp; }
   printf(" %d, %d, %d \n",a,b,c );
}

5.从键盘任意输入3个数,输出其中最小值。

#include <stdio.h>
void main( )
{  float  a,b,c,min;
scanf("%f%f%f",&a,&b,&c);
min=a;
if(b<min)  min=b;
if(c<min)   min=c;
printf("min=%f",min);}

6.编写程序,计算y=|x|。

#include <stdio.h>

void main()

{float x,y;

scanf("%f",&x);

if(x>0) y=x;

else if(x<0)

​       y=-x;

   else

​       y=0;

printf("%f\n",y);

}

05 循环结构习题

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.语句while(!G);中循环体能执行的条件!G等价于( )。

A.G = = 0 B.G! = 1 C.G! = 0 D.~ G

在C语言中,!G通常是用来表示逻辑非操作符,表示取反的意思。当!G用于一个表达式时,它会返回该表达式的相反值,如果表达式为真,则返回假,如果表达式为假,则返回真。例如,如果x为真,则!x为假,如果y为假,则!y为真。这在逻辑判断和条件语句中经常会用到。

2.设n为整型变量,则循环语句for(n=10;n>0;n− −)的循环次数是(C )。

A.9 B.11 C.10 D.12

3.设有程序段int k=8;while(k = = '8') {k−−;},则下面描述中正确的是( )。

A.循环体语句k− −;执行10次 B.循环体语句k− −;执行无限次

C.循环体语句k− −;一次也不执行 D.循环体语句k− −;执行一次

4.设有程序段

int k=’0’;

while(k==0) k=k−1;

则以下描述中,正确的是( 从从c\d)。

A.while循环体执行10次 B.循环是无限循环

C.循环体语句一次也不执行 D.循环体语句执行一次

二、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ int m=21,n=14,temp;

while(m!=0)

{ temp=m%n;

n=m/n;

m=temp;

}

printf("%d",n);

}

2.#include <stdio.h>

void main()

{ int i;

for(i=1;i<=5;i++)

{ if(i%2)

printf("*");

else

continue;

}

printf("$\n");

}

**$

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是在两位数中统计所有能被3整除的数的个数。

#include <stdio.h>

void main()

{ int i,num=0;

for(i=10;i<100;i++)

if(__i%3==0___)

num++;

printf("%d\n",num);

}

2.以下程序的功能是统计一个字符串中大写字母的个数,以回车符作为输入结束标志。

#include <stdio.h>

void main()

{ int alph=0;

char ch;

while((ch=getchar())!='\n')

if( ch>=A&&ch<=Z )

alph++;

printf("%d",alph);

}

3.以下程序的功能是统计一个字符串中大小写英文字母的个数,以回车符作为输入结束标志。

#include <stdio.h>

void main()

{ int ph=0;

char ch;

while((ch=getchar())!='\n')

if(ch>='A'&&ch<='Z'|| ch>='a'&&ch<='z')

_ph++__;

printf("%d",ph) ;

}

4.将从键盘上输入的大写字母转换成小写字母,其他字符不变,直到输入回车符为止。

#include <stdio.h>

void main()

{ char ch;

while ((ch=getchar())!='\n')

{ if(ch>='A'&&ch<='Z')

__ch=ch+32___

printf("%c",ch);

}

}

5.以下程序的功能是输出100以内个位数为6且能够被3整除的所有数。

#include <stdio.h>

void main()

{ int i,j;

for(i=0;i<10;i++)

{ j=i*10+6;

if(j%3!=0)

_____continue _;

printf("%d",j);

}

printf("\n ");

}

6.以下程序的功能是将1~500中的能被6整除的数输出。

#include <stdio.h>

void main()

{ int n;

for (n=1;n<=500;n++ )

{ if(n%6! =0 )

__continue + ;

printf("%d",n);

}

}

7.以下程序的功能是将50~500中的不能被8整除的数输出。

#include <stdio.h>

void main()

{ int n;

for(n=50;n<=500;n++)

{ if(n%8==0)

continue ;

printf(″%d″,n);

}

}

8.输出100以内且能被7整除的所有整数。

#include <stdio.h>

void main()

{ int i;

for (i=1; i<100**或i<=100**

;i++)

{ if(i%7) continue;

printf("%d",i);

}

printf("\n");

}

9.输入若干字符数据,分别统计其中A、B、C的个数。

#include <stdio.h>

void main()

{ char c;

inr k1=0,k2=0,k3=0;

while((c=getchar())!='\n')

{ i<100**或i<=100**

9. switch(c)

{ case 'A': k1++; break;

case 'B': k2++; break;

case 'C': k3++; break;

default:

}

}

printf("A=%d,B=%d\n,C=%d\n",k1,k2,k3);

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.变量a、b的初值是3。

(1)#include <stdio.h>

(2) void main()

(3) { int a=b=3,j; a=3,kb=3

(4) for(j=0;j<a;a−−,b++)

(5) printf("a+b=%d\n",a+b); }

2.求1+2+3+…+100的值。

(1)#include <stdio.h>

(2) void main()

(3) { int i=1,sum=0;

(4) do

(5) { sum+=i;i++;

(6) } while(i>100);i<100**或i<=100)

(7) printf("%d\n",sum);

(8) }

五、编程题

1.输入10个整数,统计并输出正数、负数和零的个数。

#include <stdio.h>

int main() {
    int num, positive=0, negative=0, zero=0;
    
    for (int i = 0; i < 10; i++) {
        printf("请输入第%d个整数: ", i+1);
        scanf("%d", &num);
        
        if (num > 0) {
            positive++;
        } 
        else if (num < 0) {
            negative++;
        } 
        else {
            zero++;
        }
    }
    
    printf("正数个数: %d\n", positive);
    printf("负数个数: %d\n", negative);
    printf("零的个数: %d\n", zero);
    
    return 0;
}

2.请编写程序求出1/1+1/2+1/3+1/4+1/5+…+1/99+1/100的值。

#include <stdio.h>

int main() {
    double sum = 0.0;
    
    for (int i = 1; i <= 100; i++) {
        sum += 1.0 / i;
    }
    
    printf("1/1 + 1/2 + 1/3 + ... + 1/99 + 1/100 的值为: %f\n", sum);
    
    return 0;
}

3.编程求1!+2!+…+10!。

#include <stdio.h>

int main() {
    int i, j;
    long long sum = 0;
    long long fact = 1;

    for (i = 1; i <= 10; i++) {
        fact = 1;
        for (j = 1; j <= i; j++) {
            fact *= j;
        }
        sum += fact;
    }
    
    printf("1! + 2! + ... + 10! 的值为: %lld\n", sum);
    
    return 0;
}

4.输入一串字符(按Enter键结束),分别统计并输出其中小写字母和大写字母的个数。

#include <stdio.h>

int main() {
    char ch;
    int uppercase = 0, lowercase = 0;

    printf("请输入一串字符,按Enter键结束:\n");

    while ((ch = getchar()) != '\n') {
        if (ch >= 'A' && ch <= 'Z') {
            uppercase++;
        } else if (ch >= 'a' && ch <= 'z') {
            lowercase++;
        }
    }

    printf("大写字母个数: %d\n", uppercase);
    printf("小写字母个数: %d\n", lowercase);

    return 0;
}

5.请编写程序求出1到100之间的偶数和。

#include <stdio.h>

int main() {
    int sum = 0;

    for (int i = 2; i <= 100; i += 2) {
        sum += i;
    }

    printf("1到100之间的偶数和为: %d\n", sum);

    return 0;
}

6.输入100个学生成绩,计算并输出平均成绩。

#include <stdio.h>

int main() {
    int numStudents = 100;
    int scores[numStudents];
    int sum = 0;

    printf("请输入100个学生成绩:\n");

    for (int i = 0; i < numStudents; i++) {
        scanf("%d", &scores[i]);
        sum += scores[i];
    }

    double average = (double)sum / numStudents;
    printf("平均成绩为: %.2f\n", average);

    return 0;
}

7.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() {
    int i, j, k;

    for (i = 1; i <= 5; i++) {
        for (j = 5; j > i; j--) {
            printf(" ");
        }
        for (k = 1; k <= 2 * i - 1; k++) {
            printf("#");
        }
        printf("\n");
    }

    return 0;
}

8.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() {
    int i, j;

    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= 2 * i - 1; j++) {
            printf("#");
        }
        printf("\n");
    }

    return 0;
}

9.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() { int i, j;

for (i = 1; i <= 3; i++) {
    for (j = 1; j <= 9; j++) {
        printf("#");
    }
    printf("\n");
}

return 0;

}

10.使用循环嵌套方法编程,输出下列图形。

#include <stdio.h>

int main() { int i, j;

for (i = 1; i <= 9; i++) {
    for (j = 1; j <= 10 - i; j++) {
        printf("#");
    }
    printf("\n");
}

return 0;

}

使用循环嵌套方法编程,输出下列图形。 ######### ########

#######

######

####

###

##

#

06 数组习题

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.以下数组的定义中,错误的是( D)。

A.int a[10]={'L','I','A','O','N','I','N','G'};

B.char b[10]={65,98,67,56,108,66};

C.char s[100]="TURBO C LANGUAGE";

D.int n=5,d[n];

2.以下数组的定义中,错误的是( A/B)。

A.int a[10]={'L','I','A','O','N','I','N','G'};

B.char a[5]="HELLO";

C.char b[10]={65,98,67,56,108,66};

D.char d[ ]="HELLO";

3.若有如下定义,则以下叙述中,正确的是( D)。

char x[ ]= "abcdefg";

char y[ ]={'a','b','c','d','e','f','g'};

A.数组x和数组y等价 B.数组x和数组y的长度相同

C.数组y的长度大于数组x的长度 D.数组x的长度大于数组y的长度

4.简单变量作为实参时,它和对应形参间的数据传递方式是(B )。

A.地址传递 B.单向值传递

C.由实参传给形参,再由形参传回给实参 D.由用户指定传递方式

5.若数组名作函数的实参,则实参传递给形参的是( C )。

A.数组元素的个数 B.数组元素的字节数

C.数组的首地址 D.数组的第一个元素的值

6.若已定义char s[10];,则下面的表达式中不能表示s[1]地址的是( A)。

A.s++ B.s+1 C.&s[0]+1 D.&s[1]

7.已定义int a[10]; ,以下对a的引用正确的是( D)。

A.a[10] B.a(6) C.a{6} D.a[10−10]

8.执行char str[10]="China\0"; 后,strlen(str)的结果是( A )。

A.5 B.6 C.10 D.9

执行char str[10]="China\0";后,字符串str中有5个字符,但是它们之间只有4个非空字符,因为字符串以空字符'\0'结尾。因此,strlen(str)的结果是:

A.5

9.若有定义int a[3][4];,则对a数组元素的非法引用是( D )。

A.a[0][2*1] B.a[1][3] C.a[4−2][0] D.a[0][4]

10.在执行int a[ ][3]={1,2,3,4,5,6}; 语句后,a[1][0]的值为( A)。

A.4 B.1 C.2 D.5

11.在执行char str[10]="China";语句后, strlen(str)的结果为( A )。

A.5 B.6 C.7 D.9

二、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ int i,k,a[10],p[3];

k=5;

for(i=0;i<10;i++) a[i]=i;

for(i=0;i<3;i++) p[i]=a[i*(i+1)];

for(i=0;i<3;i++) k+=p[i]*2;

printf("%d\n",k);

}29

2. #include <math.h>

#include <stdio.h>

void main()

{ int i,j;

static int s[11];

for (i=2;i<=10;i++) s[i]=i;

for(i=2;i<=sqrt(10);i++)

if(s[i])

for(j=i+i;j<=10;j+=i)

s[j]=0;

for(i=2;i<=10;i++)

if(s[i]) printf("%3d",i);

}

3.#include <stdio.h>

void main()

{ char a[10],i=0,sum;

printf("Please input a data string:\n");

scanf("%s",a);

sum=a[i]−'0';

while(a[i+1]!='\0')

{ sum=sum*8+a[i+1]−'0';

i=i+1;

}

printf("%d",sum);

}

运行时输入数据:142

4.#include <stdio.h>

void main()

{ char a[10];

int i=0,sum;

printf("Please input a binary data string:\n");

scanf("%s",a);

sum=a[i]−'0';

while(a[i+1]!='\0')

{ sum=sum*2+a[i+1]−'0';

i=i+1;

}

printf("%d",sum);

}

运行时输入数据:1010

5.#include <stdio.h>

void main()

{ int b3={0,1,2,0,1,2,0,1,2},i,j,t=0;

for(i=0;i<3;i++)

for(j=0;j<=i;j++)

t=t+bi[j]];

printf("%d",t);

}

6.#include <stdio.h>

void main()

{ int a3={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int i,j,sum=0;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(j>i)

sum+=ai;

printf(″%d″,sum);

}

7. #include <stdio.h>

void main()

{ static int a3={3,2,1,4,5,6,−2,9,1};

int i,j,sum=0;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{ if (i==j)

sum=sum+ai;

}

printf("sum=%d",sum);

}

8. #include <stdio.h>

void main()

{ int i,c;

static char num ={"CDEF","ACBD"};

for(i=0;i<4,i++)

{ c=num0+num1−2*'A';

printf("%3d ",c);

}

}

9. #include <stdio.h>

#include <string.h>

void main()

{ char p1[50],str[20]="abc";

strcpy(p1,"mnk");

strcat(p1,str);

printf("%s",p1);

}

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是输出字符串中的英文字符。

#include <stdio.h>

void main()

{ char a[80];

int i=0;

gets(a);

while(a[i]!=’\0’)

{ if(_____)

putchar(a[i]);

i++;

}

}A<=ch<=Z||z<=ch<=a

#include <stdio.h> 

void main()

{ 
    char a[80];
    int i=0;
    gets(a);

    while(a[i]!='\0')
    { 
        if((a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z'))
            putchar(a[i]);
        i++;
    }
}

2.以下程序的功能是输出数组a中的最大元素的下标。

#include <stdio.h>

void main()

{ int k,i;

int a[10];

for(i=0;i<10;i++) scanf(" %d ",&a[i]);

for(i=0,k=i;i<10;i++)

if(a[i]>a[k]) k=i ___;

printf("k=%d\n ",k);

}

3.以下程序的功能是对数组中的元素按由小到大顺序排序。

#include <stdio.h>

void main()

{int a[12]={34,56,7,−77,97,−35,−6,87,696,868,286,−586};int i,j,k;

for(k=11;k>=1;k−−)

for(i=0;i<k;i++)

if(a[i]>a[i+1])

{ j=a[i];

a[i]= a[i+1];

a[i+1]=j ;

}

for(i=0;i<12;i++ )

printf("%d",a[i]); }

4.以下程序的功能是将字符串s1复制到字符串s2中。

#include <string.h>

#include <stdio.h>

void main()

{ char s1[80],s2[80];

int i;

gets(s1);

for(i=0;i<=strlen(s1);i++)

__s2[i]=s1[i];

printf("%s",s2);

}

5.以下程序的功能是将输入的十进制数以八进制形式输出。

#include <stdio.h>

void main()

{ int n,c[8],i=0;

printf("Please input a number:\n");

scanf("%d",&n);

do{__c[i]=n%8;

i++;

n=n/8;

}while (n!=0);

for(−−i;i>=0;−−i)

printf("%d",c[i]);

}

6.以下程序的功能是用起泡法对数组中的元素值按由大到小顺序排序。

#include <stdio.h>

void main()

{ int a[10],i,j,k;

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(k=0;k<9;k++)

for(i=0;i<9−k;i++)

if( )

{ j=a[i] a[i]=a[i+1]; a[i+1]=j;}

for(i=0;i<10;i++)

printf("%d",a[i]);

}

7.以下程序的功能是在数组中顺序查找输入值为x的元素,如果找到该元素,输出其下标。

#include <stdio.h>

void main()

{ int a[10]={25,74,32,50,6,1,5,6,9,10};

int i,x;

printf("Input x:\n");

scanf("%d",&x);

for(i=0;i<10;i++)

if( a[i]==x )

{ printf("Found! The index is %d \n",i);

break;

}

if(i>=10) printf("Can't found!");

}

8.以下程序的功能是将输入的十进制数以二进制数形式输出。

#include <stdio.h>

void main()

{ int n,c[8],i=0;

printf("Please input a number:\n");

scanf("%d",&n);

do

{ c[i]=n%2;

i++;

n=n/2;

}while( n!=0 );

for(−−i;i>=0;−−i)

printf(″%d″,c[i]);

}

9.统计字符串的长度。

#include <stdio.h>

void main()

{ char string[30]="abcd123";

int i=0 _________;

while (string[i]!='\0')

{ i++; }

printf("%d\n",i);

}

10.将数组中的10个整数按逆序存放。

#include <stdio.h>

void main()

{ int a[10]={0,1,2,3,4,5,6,7,8,9},i,j,t;

for (i=0,j=9; _____; i++, j− −)

{ t=a[i];

a[i]=a[j];

a[j]=t;

}

for (i=0;i<10;i++)

printf("%d\n",a[i]);

}

11.将数组中最大的数与最后一个数交换位置。

#include <stdio.h>

void main()

{ static int a[5]={2,9,−1,6,3};

int max=a[0],i,k;

for(i=1;i<5;i++)

if(max<a[i])

{ max=a[i];

k=i;

}


a[4]=a[k];

a[k]=max;

for(i=0; i<5; i++)

printf("%4d",a[i]);

}

12.将一个有20个元素的数组,输入数据并在屏幕显示出来,每行5个数。

#include <stdio.h>

void main()

{ static int a[20];

int i,j;

for(i=0;i<20;i++)

scanf("%d",&a[i]);

for(i=0;i<20;i++)

{ printf("%6d",a[i]);

if( )

printf("\n");

}

}

13.将数组a的元素按行求和并且存储到数组s中,形式如下。

s[i]= (i=0,1,2)

#include <stdio.h>

void main()

{ static int s[3]={0,0,0},a3={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int i,j;

for(i=0;i<3;i++)

{ for (j=0;j<4;j++)

s[i]+= _____;

printf("%d",s[i]);

}

printf("\n");

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.将数组a中的9个元素输出。

(1)#include <stdio.h>

(2)void main()

(3){ static int a[9]={1,2,3,4,5,6,7,8,9};

(4) int i;

(5) for(i=1;i<=9;i++) i<9

(6) printf("%5d",a[i]); }

2.用“地址法”输出数组中的各个元素。

(1)#include <stdio.h>

(2)void main()

(3) { static int st[5]={9,8,7,6,5},i;

(4) for(i=0; i<5; i++)

(5) printf("%4d\n",*st); }

3.统计字符串中大写字符的个数。

(1)#include <stdio.h>

(2)void main()

(3){ char str[20];

(4) int i,n=0;

(5) gets(str);

(6) for(i=0; str[i]!='\n'; i++)

(7) if(str[i]>='A' && str[i]<='Z') n++;

(8) printf("%d\n",n); }

4.以下程序的功能是计算3×3阶矩阵的主对角线元素之和。

(1) #include <stdio.h>

(2) void main()

(3) { int i,sum=0,a3={1,2,3,4,5,6,7,8,9};

(4) for(i=0;i<=3;i++)

(5) sum+=ai;

(6) printf(" sum=%d\n ",sum); }

5.从键盘输入一个字符串,复制到另一个字符数组后输出。

(1)#include <stdio.h>

(2)void main()

(3){ char str1[80],str2[80];

(4) int i;

(5) printf("Input a string:");

(6) scanf("%s",str1);

(7) i=0;

(8) while(str1[i]!='\0')

(9) { str2[i]=str1[i];

(10) i++;}

(11) str2[i−1]='\0';

(12) printf("%s",str2);}

(13)}

6.从键盘上输入两个字符串,比较两个字符串是否相等。

(1)#include <stdio.h>

(2)void main( )

(3){ char str1[80],str2[80];

(4) int i,flag;

(5) gets(str1);

(6) gets(str2);

(7) i=0;

(8) while(str1[i]=str2[i])

(9) i++;

(10) if(str1[i]'\0'&&str2[i]'\0')

(11) flag=1;

(12) else

(13) flag=0;

(14) if (flag)

(15) printf("The two strings are equal.");

(16) else

(17) printf("The two strings are not equal.");

(18)}

7.从键盘输入一个字符串,复制到另一个字符数组后输出。

(1)#include <stdio.h>

(2)void main()

(3){ char str1[80],str2[80];

(4) int i;

(5) printf("Input a string:");

(6) scanf("%s",str1);

(7) i=0;

(8) while(str1[i]< >'\0')

(9) { str2[i]= str1[i];

(10) i++; }

(11) str2[i]='\0';

(12) printf("%s",str2);

(13)}

8.求二维数组中所有为负数的元素之和。

(1)#include <stdio.h>

(2)void main()

(3) { int a3={{1,4,−6,7},{−1,8,21,12},{3,9,−2,10}};

(4) int i,j,sum;

(5) for(i=0;i<3;i++)

(6) for(j=0;j<4;j++)

(7) if(ai<0) sum+=ai;

(8) printf("%d",sum);

(9)}

9.以下程序的功能是输出3个字符串中的最大字符串。

(1)#include <stdio.h>

(2)#include <string.h>

(3)void main()

(4) { char s[80],str3;

(5) int i;

(6) for(i=0;i<3;i++)

(7) gets(str);

(8) if(strcmp(str[0],str[1])>0)

(9) strcpy(s,str[0]);

(10) else

(11) strcpy(s,str[1]);

(12) if(strcmp(str[2],s)>0)

(13) strcpy(s,str[2]);

(14) printf("%s\n",s);

(15) }

10.以下程序的功能是删除字符串s中的所有数字字符。

(1) #include <stdio.h>

(2) void main()

(3) { char s[100];

(4) int n=0,i;

(5) gets(s);

(6) for(i=0; s[i]; i++)

(7) if(s[i]>=0&&s[i]<=9)

(8) s[n++]=s[i];

(9) s[n]='\0';

(10) puts(s);

(11)}

11.求二维数组中所有为正数的元素之和。

(1)#include <stdio.h>

(2)void main( )

(3){int a[3][4]={{1,4,−6,7},{−1,8,21,12},{3,9,−2,10}};

(4) int i,j,sum=0;

(5) for(i=0;i<3;i++)

(6) for(j=0;j<4;j++)

(7) if(a[i][j]<0) sum+=a[i][j];

(8) printf("%d",sum);

(9)}

// if(ai>0) sum+=ai;

07 函数习题

一、阅读程序题(写出程序的运行结果)

1. #include <stdio.h>

float max(float x,float y)

{

float z=x;

if(z<y)z=y;

return (z);

}

void main()

{ float a=3.5, b=8.7;

int c;

c=max(a,b);

printf("%d\n",c);

}

2.#include <stdio.h>

unsigned fun(unsigned num)

{ unsigned k=1;

do

{ k*=num%10;num/=10;} while(num);

return k;

}

void main()

{ unsigned n=26;

printf("%d\n",fun(n));

}

3.#include <stdio.h>

int ff(int n)

{ if(n==1)

return 1;

else

return ff(n−1)+1;

}

void main()

{ int i,j=0;

for(i=1;i<3;i++)

j+=ff(i);

printf("%d",j);

}

4. #include <stdio.h>

int fib(int g)

{ switch(g)

{ case 1:

case 2: return 1;

}

return(fib(g−1)+fib(g−2));

}

void main()

{ int k;

k=fib(5);

printf(″%d\n″,k);

}

5.#include <stdio.h>

int fun( int x)

{ static int a=3;

a=a+x;

return a;

}

void main()

{ int k=2,m=1,n;

n=fun(k);

n=fun(m);

printf("%d\n",n);

}

6.#include <stdio.h>

int fun(int a)

{ static int c=3;

int b=0;

b++;

c++;

return (a+b+c);

}

void main()

{ int a=2,i;

for(i=0;i<3;i++)

printf("%d,",fun(a));

}

7. #include <stdio.h>

int fun(int x,int y)

{ static int m=0;

int i=2;

i+=m+1;

m=i+x+y;

return(m);

}

void main()

{ int a=5,b=6;

printf(″%d,″,fun(a,b));

printf(″%d″,fun(b,a));

}

8. #include <stdio.h>

int sub(int n)

{ static int f=0;

f+=n;

return(f);

}

void main()

{ int i;

for(i=1;i<=4;i++)

printf("%3d",sub(5));

}

9. #include <stdio.h>

int f(int a )

{ auto int b=0;

static int c=3;

b=b+1;c=c+1;

return(a+b+c);

}

void main()

{ int a=1,i;

for(i=0;i<3;i++)

printf("%3d",f(a));

}

10.#include <stdio.h>

int fun(int p)

{int k=1;

static t=2;

k=k+1;

t=t+1;

return(pkt);

}

void main()

{int x=4;

fun(x);

printf("%d\n",fun(x));

}

11. #include <stdio.h>

int a=3,b=5;

void main()

{ void fun(void);

fun();

printf("a=%3d,b=%3d\n",a,b);

}

void fun(void)

{ int c;

c=a;a=b;b=c;

}

12.#include <stdio.h>

int a=63,b=52;

int max(int a,int b)

{ int c;

c=a>b?a:b;

return(c);

}

void main()

{ int a=28;

printf("%d\n",max(a,b));

}

13.#include <stdio.h>

int a=1,k=10;

int sub(int x,int y)

{ int n=0;

static int m=1;

m=m+a;

return(m+x*y);

}

void main()

{ int a=5,b;

b=sub(a,k);

b=sub(a,k);

printf("%d",b);

}

14.#include <stdio.h>

int m=4,n=6;

int max(int x, int y)

{ int max;

max=x>y?x : y;

return (max);

}

void main()

{ int m=10;

printf("%d\n",max(m,n));

}

15.#include <stdio.h>

int fib(int n)

{ if(n>2) return (fib(n−1));

else return 2;

}

void main()

{ printf("%d\n″,fib(4));}

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.Factorial( )函数的功能是计算n的阶乘(n!)。

float Factorial(int n)

{ int i;

float c=1.0;

for(i=1;i<=n;i++)

____;

return c;

}

2.以下程序的功能是输入一个ASCII码值,输出从该ASCII码开始的连续10个字符。

#include <stdio.h>

void put(char n)

{ int i,a;

for(i=0;i<=9;i++)

{ a=n+i;

putchar(a);

}

return;

}

void main( )

{ int ascii;

scanf("%c",&ascii);

;

}

3.strlength( )函数的功能是计算字符串str的长度,并作为函数值返回。

int strlength(char str[ ])

{ int i;

for(i=0;str[i]!='\0';i++);

return( );

}

4.以下函数的功能是将两个字符串s1和s2连接起来。

void con(char s1[ ],char s2[ ])

{ int i=0,j=0;

while(s1[i]!='\0') i++;

while(s2[j]!='\0')

s1[i++]=_____;

s1[i]='\0';

}

5.以下函数的功能是求数组中前n个数的平均值。

float average(float p[ ],int n)

{ float sum=0,aver;

int i;

for(i=0;i<n;i++)

sum+=__;

aver=sum/n;

return aver;

}

6.以下函数的功能是用选择法将数组中的n个元素按由小到大的顺序排序。

void sort(int s[ ],int n)

{ int i,j,k,t;

for(i=0;i<n−1;i++)

{ k=i;

for(j=i+1;j<n;j++)

if(__) k=j;

if(k!=i)

{ t=s[i]; s[i]=s[k]; s[k]=t; }

}

}

7. Numeral( ) 函数的功能是求6×6矩阵的元素值大于0的元素的个数。

void Numeral(int a6)

{ int i,j,num=0;

for(i=0;i<6;i++)

for(j=0;j<6;j++)

scanf("%d",&ai);

for(i=0;i<6;i++)

for(j=0;j<6;j++)

if( )

num=num+1;

printf("%d",num);

}

8. minimal( ) 函数的功能是求5×4矩阵中的最小元素。

int minimal(int a5)

{ int i,j,min;

min=a0;

for(i=0;i<5;i++)

for(j=0;j<4;j++)

if( )

min=ai;

return min;

}

9.计算当n=5时下面递归公式的值。

#include <stdio.h>

int tz(int n)

{ int c;

if(n==1) c=3;

else c= ;

return(c);

}

void main()

{ printf("tz(5)=%d\n",tz(5));

}

10.用递归的方法求整数n的阶乘(假设1<n<8)。

#include <stdio.h>

int fact(int n)

{ int ans;

if( n==1) ans=1;

else

ans=____;

return(ans);

}

void main()

{ int n;

scanf("%d",&n);

printf("\n%d\n",fact(n));

}

11.以下函数的功能是将若干给定的整数按由小到大排序。

void sort(int *s,int n)

{ int i,j,k,t;

for(i=0;i<=n−1;i++)

{ k=i;

for(j=i+1;j<n;j++)

if ( ) k=j; /比较两个元素/

if(k!=i)

{ t=(s+i);(s+i)=(s+k);(s+k)=t;}

}

}

12. inv( ) 函数的功能是交换a和b两个变量的值。

#include <stdio.h>

void inv(int *m,int *n )

{ int p;

p=*m;


*n=p;

}

void main()

{ int a=3,b=6;

inv(&a,&b);

printf("%d,%d",a,b);

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.以下fun( ) 函数的功能是求两个参数的和,并将和的值返回给调用函数。

(1) #include <stdio.h>

(2) int fun( int x ,y)

(3) { int c;

(4) c=x+y;

(5) return c; }

(6) void main()

(7) { int x=8,y=10;

(8) printf(" %d ",fun(x,y));

(9) }

2.求两个整数的和。

(1)#include <stdio.h>

(2)sum(int x, y)

(3){ return x+y;

(4)}

(5)void main()

(6){ int a=1,b=2;

(7) printf("%d\n",sum(a,b)); }

3.以下area( ) 函数的功能是求圆的面积。

(1) #define pi 3.1416

(2) float area(float r)

(3) { float aa;

(4) aa=pi×r×r;

(5) return aa;

(6) }

4.下列给定程序中fun( ) 函数的功能是计算正整数num各位上的数字之平方和。

(1)#include <stdio.h>

(2)int fun(int num)

(3){ int k=1;

(4) do

(5) { k+=(num%10)*(num%10);

(6) num/=10;

(7) }while(num);

(8) return (k);

(9) }

(10)void main( )

(11){ int n;

(12) scanf("%d",&n);

(13) printf("\n%d\n",fun(n));

(14)}

5. fun( ) 函数的功能是用递归调用的方法求mn。

(1)#include <stdio.h>

(2)fun( float m,float n)

(3) { float answer;

(4) if(n==0)

(5) answer=1;

(6) else

(7) answer=m*fun(m,n−1);

(8) return answer; }

(9)void main( )

(10){ printf("%f",fun(5,5));

(11)}

6.以下程序中fact( ) 函数的功能是用递归调用的方法求m的n次方。

(1)#include <stdio.h>

(2)int fact(int m,int n)

(3) { int answer;

(4) if(n==0) answer=1;

(5) eles

(6) answer=fact(m,n)*m;

(7) return answer; }

(8)void main()

(9){ printf("%d",fact(2,5));

(10)}

7. len( ) 函数的功能是求字符串的长度。

(1) int len(char s[100])

(2) { int i=−1,num=−1;

(3) do

(4) { i++;

(5) num++;

(6) }while(s[i]!='\0')

(7) return num;

(8) }

8.以下函数的功能是将字符串str按逆序存放。

(1) void fun(char str[ ])

(2) { char m;

(3) int i,j;

(4) j=strlen(str);

(5) for(i=0;i<j;i++,j−−)

(6) { m=str[i];

(7) str[i]=str[j];

(8) str[j]=m;

(9) }

(10) printf("%s",str);

(11)}

9.以下程序的功能是交换变量a、b的值。

(1)#include <stdio.h>

(2)void swap( int *p1,int *p2)

(3) { int p;

(4) p=*p1;

(5) p1=p2;

(6) *p2=p;

(7) }

(8) void main( )

(9) { int a,b;

(10) scanf("%d %d",&a,&b);

(11) swap (a,b);

(12) printf("a=%d,b=%d",a,b); }

10. average()函数的功能是求n名同学的平均成绩。

(1)#include <stdio.h>

(2)float average(int *a,int n)

(3) { int i;

(4) float av=0;

(5) for(i=0;i<n;i++)

(6) av=av+a[i];

(7) av=av/n;

(8) return av; }

(9)void main()

(10){ int a[]={45,76,89,78,76,73,91,65,70,50};

(11) float aver;

(12) average(a,10);

(13) printf("aver=%f",aver);

(14)}

11.函数sum的功能是求n名同学的总成绩。

(1)#include <stdio.h>

(2)float sum(int *a,int n)

(3){ int i;float av=0;

(4) for(i=0;i<n;i++)

(5) av=av+a[i];

(6) return av; }

(7) void main()

(8) { int a[]={45,76,89,78,76,73,91,65,70,50};

(9) float s;

(10) s=sum(a,10);

(11) printf("s=%f",sum);

(12)}

四、编程题

1.编写程序,通过函数调用方式计算y=|x|。

2.通过调用函数计算任意3个整数的和。

3.通过调用函数求任意两个整数的平方和。

4.通过调用函数求任意两个数的最大值。

5.通过调用函数求圆柱体体积。

6.通过调用函数求圆的面积。

08预处理习题

一、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

#define S(x) x*x

void main()

{ int a,k=3;

a=S(k+4);

printf("%d\n",a);

}

2.#include <stdio.h>

#define M(x,y,z) x*y−z

void main()

{ int a=1,b=2,c=3;

printf("%d",M(a+b,b+c,c+a));

}

3. #include <stdio.h>

#define M(x,y) x/y

void main()

{ int a=20,b=16,c=5;

printf(″%d″,M(a+b,c−b));

}

4. #define PI 3.14

#define R 3.0

#define S PIRR

#include <stdio.h>

void main()

{ printf("S=%.2f\n",S); }

二、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是通过带参的宏定义求圆的面积。

#include <stdio.h>

#define PI 3.1415926

#define AREA(r) ______#define AREA(r) (PI * (r) * (r))

void main()

{ float r=5;

printf("%f",AREA(r));

}

三、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.求圆的面积和周长。

(1)#include <stdio.h>

(2)#define PI=3.14159

(3) void main()

(4) { float r=5.0,s,z;

(5) s=PIrr;

(6) z=2PIr;

(7) printf("s=%6.2f,z=%6.2f\n",s,z); }

09 指针习题

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.已定义a为int型变量,则以下说明和初始化指针变量p的语句中,正确的是( D )。

A.int *p=a; B.int p=a;

C.int p=&a; D.int *p=&a;

2.在定义int a[10]; 之后,以下对a元素的引用中,不正确的为( B)。

A.a[1] B.*a C.*(a+6) D.a

3.设char s[10]; int j=3;,则以下表达式中,正确的是( )。

A.s(j+2) B.*(s+j) C.*(&s+j) D.*((s++)+j)

在这个情况下,正确的表达式是:

B. *(s+j)

这将对内存位置s+j进行解引用,有效地访问数组s的第(j+1)个元素。

4.设char s[10],*p=s;,则以下表达式不正确的是( B)。

A.p=s+5 B.s=p+s C.s[2]=*(p+4) D.*p=s[0]

5.设char s[10], *p; p=s;,则以下表达式中,正确的为( )。

A.p(2) B.(p+2) C.(&p+2) D.*((s++)+2)

6.设char s[4],*p=s+3;,则以下表达式中,正确的是( )。

A.p=s+5 B.s=p−s C.s[2]=p[3] D.*p=s[0]

7.设有定义char a[10]= "ABCD",p=a;,则(p+4)的值是( )。

A." ABCD" B.'D' C.'\0' D.不确定

8.在执行int a ={1,2,3,4,5,6}; 语句后,((a+1)+1)的值为( )。

A.4 B.1 C.2 D.5

9.定义一个指向一维数组的指针p,则以下正确的为( )。

A.int (*p)( ); B.int (*p)[4 ];

C.int *p( ); D.int *p[4 ];

10.定义一个指向函数的指针,以下正确的是( )。

A.int (p)( ); B.int (p)[ ];

C.int *p( ); D.int *p[ ];

11.设int **s; int *a; int k; k=10; a=&k; s=&a; 则以下值为10的语句是( C)。

A.a; B.s; C.**s; D.k;

在给定的代码中,s是一个指向指针的指针,a是一个指向整数的指针,k是一个整数。

因此,以下值为10的语句是:

C.**s;

这是因为*s将给出指向k的指针a的值,然后**s将解引用这个指针,得到k的值,即10。

12.设char **s;,则以下语句中,正确的是( )。

A.s="computer"; B.*s="computer";

C.**s="computer"; D.*s='c';

A. s="computer"; 这是错误的。因为s是一个指向指针的指针,所以它应该指向一个指针,而不是一个字符串常量。

C. s="computer"; 这也是错误的。因为s表示对指向指针的指针的解引用,然后尝试将字符串"computer"赋值给解引用的结果,这是不合法的操作。

D. s='c'; 这也是错误的。因为s是一个指向指针的指针,所以它应该指向一个指针,而不是一个字符常量。

二、阅读程序题(写出程序的运行结果)

1. #include <stdio.h>

void main()

{ int p1,p2,*p,a,b;

a=3;b=5;

p1=&a; p2=&b;

if(a<b)

{ p=p1; p1=p2; p2=p;}

printf("%3d %3d\n",p1,p2);

}

2.#include <stdio.h>

int A[ ]={2,4,6,8};

void main()

{ int i;

int *p=A;

for(i=0;i<4;i++,p++) A[i]=*p;

printf(" %d\n",A[2]);

}

3.#include <stdio.h>

void main()

{ int a[ ]={1,2,3,4,5,6},*p;

p=a;

*(p+3)+=2;

printf(″%d,%d\n″,p,(p+3));

}

4. #include <stdio.h>

void main()

{ static int a[10]={0,1,2,3,4,5,6,7,8,9};

int *p=a,s=0;

for(; p<a+10: p=p+2)

s=s+*p;

printf("%d",s);

}

5. #include <stdio.h>

void main()

{ char a[]="abcdefg",*b="china";

int i;

for(i=0;b[i]!='\0';i++)

a[i]=b[i];

a[i]='\0';

puts(a);

}

6.#include <stdio.h>

char *fun(char *s,char ch)

{ while(s&&s!=ch){s++;}

return s ;

}

void main()

{ char *s="abcdefg",ch=’c’;

printf(" %s",fun(s,ch));

}

7.#include <string.h>

#include <stdio.h>

void main()

{ char p1,p2,str[50]="ABCDEFG";

p1="abcd";

p2="efgh";

strcpy(str+1,p2+1);

strcpy(str+3,p1+3);

printf("%s",str);

}

8.#include <stdio.h>

#include <string.h>

void main()

{ char *s1="AbcDeG";

char *s2="CdEg";

s1+=2;

s2+=2;

printf("%d\n",strlen(s1)−strlen(s2));

}

9.#include <stdio.h>

void main()

{ int a=2,*p,**pp;

p=&a;

pp=&p;

a++;

printf("%d,%d,%d\n",a,*p,**pp);

}

10. #include <stdio.h>

void fun(int *a)

{ a=a+3;

}

void main()

{ int a=3;

fun(&a);

printf("%d\n",a);

}

一、单项选择题:

1.D 2.D 3.B 4.B 5.B 6.D 7.C 8.D 9.B 10.A

11.C 12.B

二、阅读程序题

1. 5 3 2. 6 3. 1,6 4. 20

5. china 6. cdefg 7. Afgd 8. 2

9. 3,3,3 10. 6

三、完善程序题

1. p=a 2. swap(&a,&b)

3. &a,&b 4. p=s 或p=&s[0]

5. p=a**或p=&a0**

四、程序改错题

1. (5) { if(*ch>='a'&&*ch<='z')

2. (9) if(*r=='\0') n++;

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.利用指针p输 出数组a的每个元素。

#include <stdio.h>

void main()

{ static int a[6]={2,4,6,3,5,7}; 47

int *p;

;

for(i=0;i<6;i++,p++)

printf("%d",*p);

}

2.以下程序的功能是调用swap( ) 函数,交换a,b的值。

#include <stdio.h>

void swap( int *p1,int *p2)

{ int p;

p=*p1; p1=p2; *p2=p;

}

void main()

{ int a,b;

scanf(" %d%d ",&a,&b);

_____;

printf(" a=%d,b=%d ",a,b);

}

3. swap( ) 函数的功能是交换变量a和b的值。

#include <stdio.h>

void swap(int *p1,int *p2)

{ int p;

p=*p1;

p1=p2;

*p2=p;

}

void main()

{ int a=3,b=5;

swap(____);

printf("a=%d,b=%d\n",a,b);

}

4.以下程序的功能是把终端读入的一行字符作为字符串放在字符数组中,然后输出。

#include <stdio.h>

void main()

{ int i;

char s[80],*p;

for(i=0;i<79;i++)

{ s[i]=getchar();

if(s[i]=='\n') break;

}

s[i]='\0';

____;

while(*p)

putchar(*p++);

}

5.以下程序的功能是用指针变量输出数组元素的值。

#include <stdio.h>

void main()

{ int a3={{9,8,7},{6,5,4},{3,2,1}};

int *p;

for(__;p<&a0+9;p++ )

printf("%d",*p);

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.把从键盘输入的小写字母变成大写字母并输出。

(1)#include <stdio.h>

(2)void main()

(3){ char c,*ch=&c;

(4) while((c=getchar( ))!='\n')

(5) { if(ch>='a'&ch<='z')

(6) putchar(*ch−'a'+'A');

(7) else

(8) putchar(*ch);

(9) }

(10) }

2.以下fun( ) 函数的功能是在字符串s中查找子串t的个数。

(1) int fun(char *s,char *t)

(2) { int n;char p,r;

(3) n=0;

(4) while(*s)

(5) { p=s;r=t;

(6) while(*r)

(7) if(r==p) { r++;p++;}

(8) else break;

(9) if(r=='\0') n++;

(10) s++;

(11) }

(12) return n;

(13) }

10 结构体公用体

一、单项选择题

下面每题给出四个答案,用A、B、C、D标出,其中只有一个是正确的,将其填入括号中。

1.C语言中,可用来定义包含多个不同类型独立属性值变量的类型是(A )。

A.结构体 B.数组 C.联合体 D.枚举

2.C语言中,可用来定义多个不同数据类型变量的数据类型是(A )。

A.结构体 B.文件型 C.数组 D.枚举

3.定义如下结构体,则表达式sizeof(stu1)的值是(B )。

struct student

{ char name[8];

int age;

struct

{ int year;

int month;

int day; } birth;

} stu1;

A.15 B.24 C.10 D.13

4.若有如下定义,则sizeof(struct PRG)的值是( )。

struct PRG

{ int c;

union

{ char st[4];

int i;

int j;

}test;

};

A.7 B.8 C.5 D.6

结构体和联合体的大小取决于其最大的成员的大小。

在C语言中,结构体的大小通常等于其所有成员的大小之和,加上编译器可能添加的一些填充字节以确保对齐要求。这意味着结构体的大小取决于其所有成员的大小,而不仅仅是最大的成员的大小。

对于联合体,它的大小等于其最大成员的大小,因为联合体中的所有成员共享同一块内存空间,因此大小取决于最大的成员。

5.下列程序段的输出结果是( )。

struct abc{ int a,b,c;};

void main()

{ struct abc s[2]={{1,2,3},{4,5,6}};

int t;

t=s[0].a+s[1].b;

printf(" %d\n",t); }

A.5 B.6 C.7 D.8

二、阅读程序题(写出程序的运行结果)

1.#include <stdio.h>

void main()

{ struct PRG

{ int c;

union

{ char st[8];

int i;

int j;

}test;

};

printf("%d",sizeof(struct PRG));

}

2. #include <stdio.h>

void main()

{ union student

{ int a[5];

float f;

char ch;

}stu;

printf("%d\n",sizeof(stu));

}

三、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.100名村民投票从3名候选人中选举一名村主任,以下程序的功能是统计各候选人的票数。

#include <string.h>

#include <stdio.h>

void main()

{ struct preson

{ char name[10];

int n;

}pp[3]={"Li",0,"Zhang",0,"Fan",0};/设定票箱/

int i,j;

char s[10];

for(i=1;i<=100;i++)

{ scanf("%s",s); /投票/

for (j=0;j<3;j++)

if(strcmp(_______)==0)

if(strcmp(s, pp[j].name) == 0)

pp[j].n++; /计票/

}

}

2.以下程序的功能是找出4名学生中成绩最好者,并输出其姓名和成绩。

#include <stdio.h>

void main()

{ int i,j=0;

float max;

struct st

{ char name[10];

int score;

}stu[4]={{"aa",67},{"bb",78},{"cc",98},{"dd",54}};

for(i=0;i<4;i++)

if(stu[j].score<stu[i].score)

______;

printf("%s,%d",stu[j].name, stu[j].score);

}

四、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.结构体数组中有两个学生的学号、姓名和年龄,输出其各项数据。

(1)#include <stdio.h>

(2)struct stu

(3){ int num;

(4) char name[8];

(5) int age; };

(6)void main()

(7){ int i;

(8) struct stu stud[2]={{01,"Wu",18},{02,"Zhu",19}};

(9) i=0;

(10) for( ;i<2;i++)

(11) printf("%d %s %d",stud[i]−>num,stud[i]−>name,stud[i]−>age);

(11) printf("%d %s %d",stud[i].num,stud[i].name,stud[i].age);

(12)}

1.26

2.结构体数组中有两个学生的学号、姓名和年龄,用指针输出数据。

(1)#include <stdio.h>

(2)struct stu

(3){ int num;

(4) char name[20];

(5) int age; };

(6)void main()

(7){ struct stu stud[2]={{01,"Li",19},{02,"Qi",20}},*p;

(8) p=stud;

(9) for( ;p<stud+2;p++)

(10) printf("%d %s %d\n",p.num,p.name,p.age);

printf("%d %s %d\n",p->num,p->name,p->age);

(11)}

3.定义一个结构体变量a并赋初值。

(1)student struct

(2){ int num;

(3) char name[20];

(4) char sex;

(5)}a={89031,"Lilin",'M'};

4.以下程序的功能是求一个学生的平均成绩并输出。

(1)#include <stdio.h>

(2)struct student

(3) { int num, score1, score2;

(4) float average;

(5) }stu1={1,67,89};

(6)void main()

(7){ stu1.average=(stu1.score1+stu1.score2)/2.0;

(8) printf("%f",stu1);

(9)}

11 文件习题

一、完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

1.以下程序的功能是统计并输出当前盘当前目录下的文件myfile中所含字符个数。

#include <stdio.h>

void main()

{ FILE *fp;

int num=0;

if((fp=fopen(" myfile ","r "))==NULL)

{ printf(" Can not open file!\n ");

exit(0);

}

while(fgetc(fp)!=EOF) ___num=num+1;

fclose(fp);

printf(" num=%d ",num);

}

2.以下程序的功能是从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个"#"为止。

#include <stdio.h>

void main()

{ FILE *fp;

char ch,filename[10];

scanf("%s",filename);

if((fp=fopen(filename,"w"))==NULL)

{ printf("can not open file.\n");

exit(0);

}

ch=getchar();

while((ch!='#')

{ fputc(ch, fp__);

putchar(ch);

ch=getchar( );

}

fclose(fp);

}

3.以下程序的功能是从终端读入字符串(用$作为文本结束标志)并复制到一个名为out.dat的新文件中。

#include <stdio.h>

void main()

{ FILE *fp;

char ch;

if((fp=fopen("out.dat","w+"))==NULL) return 1;

while((ch=getchar())!='$')

fputc(ch,fp);

;

fclose(fp);

}

二、程序改错题

以下每题各有一个错误,写出有错误的语句的行号及改正后的语句全行(每行语句前的序号只标注行号,非程序本身的内容)。

1.以下程序的功能是将从终端读入的文本(用$作为文本结束标志)复制到一个名为out.dat的新文件中。

(1)#include <stdio.h>

(2)void main()

(3){ FILE fp;

(4) char ch;

(5) if((fp=fopen("out.dat","w"))!=NULL)

(6) {

(7) while((ch=getchar( ))!='$') fputc(ch,fp);

(8) }

(9)fclose(fp);

(10)}

2.从键盘输入若干字符,并把它们输出到磁盘文件中保存。

(1)#include <stdio.h>

(2)void main()

(3){ FILE fp;

(4) char line[81];

(5) if((fp=fopen("aa.txt","w"))==NULL)

(6) { printf("文件不能打开");

(7) exit(0); }

(8) while(strlen(gets(line)>0)

(9) { fputs(line,fp);

(10) fputs("\n",fp);

(11) }

(12) fclose(fp);

(13)}

复习题

任意输入三个数a、b、c,按从小到大的顺序输出。{ // int x, y, z,a,b,c; // scanf_s("%d,%d,%d", &a, &b, &c); // if (a> b) // a= b; // if (a> c) // a = c; // if (b > c) // b= c; // printf("从大到小的值为%d,%d,%d", a, b, c); // return 0; //}

输入10个整数,统计并输出正数、负数和零的个数。

int main() { int numbers[10]; int positiveCount = 0, negativeCount = 0, zeroCount = 0;

 printf("Enter 10 integers:\n");
 for (int i = 0; i < 10; i++) {
     scanf("%d", &numbers[i]);
     if (numbers[i] > 0) {
         positiveCount++;
     }
     else if (numbers[i] < 0) {
         negativeCount++;
     }
     else {
         zeroCount++;
     }
 }
 ​
 printf("Number of positive numbers: %d\n", positiveCount);
 printf("Number of negative numbers: %d\n", negativeCount);
 printf("Number of zeros: %d\n", zeroCount);
 ​
 return 0;

}

You can use an array to store the 10 integers and then use a loop to iterate through the array and count the positive numbers, negative numbers, and zeros. Here's an example of how you can achieve this in C:

 #include <stdio.h>
 ​
 int main() {
     int numbers[10];
     int positiveCount = 0, negativeCount = 0, zeroCount = 0;
 ​
     printf("Enter 10 integers:\n");
     for (int i = 0; i < 10; i++) {
         scanf("%d", &numbers[i]);
         if (numbers[i] > 0) {
             positiveCount++;
         } else if (numbers[i] < 0) {
             negativeCount++;
         } else {
             zeroCount++;
         }
     }
 ​
     printf("Number of positive numbers: %d\n", positiveCount);
     printf("Number of negative numbers: %d\n", negativeCount);
     printf("Number of zeros: %d\n", zeroCount);
 ​
     return 0;
 }

请编写程序求出1/1+1/2+1/3+1/4+1/5+…+1/99+1/100的值。

你可以使用循环来计算这个序列的总和。以下是一个使用C语言的示例程序:

 #include <stdio.h>
 ​
 int main() {
     double sum = 0.0;
 ​
     for (int i = 1; i <= 100; i++) {
         sum += 1.0 / i;
     }
 ​
     printf("The sum of the series is: %f", sum);
 ​
     return 0;
 }

在这个示例程序中,我们使用了一个循环来计算1/1+1/2+1/3+1/4+1/5+…+1/99+1/100的总和。我们使用一个double类型的变量sum来存储总和,并在每次迭代中将1/i的值加到总和中。最后,程序打印出这个序列的总和。

通过调用函数计算任意3个整数的和。

#include <stdio.h>

int sumOfThree(int a, int b, int c) { return a + b + c; }

int main() { int num1, num2, num3, result; printf("Enter three integers: "); scanf("%d %d %d", &num1, &num2, &num3);

 result = sumOfThree(num1, num2, num3);
 ​
 printf("The sum of %d, %d, and %d is %d\n", num1, num2, num3, result);
 ​
 return 0;

}

通过函数调用方式计算y=|x|。

#include <stdio.h> int main()

{ int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

int i, j, sum = 0;

for (i = 0; i < 3; i++)

for (j = 0; j < 4; j++)

if (j > i)

sum += a[i][j]; printf("%d", sum); return 0; }

阅读程序题(写出程序的运行结果)

#include <stdio.h>

int fun(int a)

{ static int c=3;

int b=0; b++; c++;

return (a+b+c);}

void main()

{ int a=2,i; for(i=0;i<3;i++)

printf("%d,",fun(a));}

阅读程序题(写出程序的运行结果)

#include <stdio.h>

void main(){

int a[ ]={1,2,3,4,5,6},*p;

p=a; *(p+3)+=2; *

  • printf(″%d,%d\n″,p,(p+3));}

1,6

阅读程序题(写出程序的运行结果) #include <stdio.h> int fun(int x,int y){ static int m=0; int i=2; i+=m+1; m=i+x+y; return(m);}void main(){ int a=5,b=6; printf(″%d,″,fun(a,b)); printf(″%d″,fun(b,a));} 14,28

设char s[10],*p=s;,则以下表达式不正确的是( )。 A p=s+5

B s=p+s

C s[2]=*(p+4)

D *p=s[0]

选项 B 不正确。

在选项 B 中,表达式 p+s 的结果是一个指针,指向数组 s 中的第 5 个元素。但是,数组名 s 本身也是一个指向数组首元素的指针,因此将指针 ps 相加是没有意义的,也不符合 C 语言的语法规则。

其他选项都是正确的:

  • 选项 A 中,表达式 s+5 的结果是一个指针,指向数组 s 中的第 6 个元素,将其赋值给指针 p 是合法的。

  • 选项 C 中,表达式 *(p+4) 的结果是指针 p 指向的地址加上 4 个字节所对应的值,即数组 s 中的第 5 个元素,将其赋值给 s[2] 也是合法的。

  • 选项 D 中,表达式 s[0] 的值赋给 *p 也是合法的。

因此,答案是 B。

  1. (单选题)25.设n为整型变量,则循环语句for(n=10;n>0;n− −)的循环次数是(C)。

  • A. 9

  • B. 11

  • C. 10

  • D. 12

完善程序题

根据下列程序的功能描述,在程序的空白处填入适当的内容,使程序完整、正确。

从键盘输入一个大写字母,改用小写字母输出。

#include <stdio.h>

void main()

{ char c1,c2;

     printf("Please  input  a  character:\n");
 ​
     c1=____________;
 ​
     c2=c1+32;
 ​
     printf("%c,%c",c1,c2);

}

 使用气泡排序来实现乘法口诀表是不太合适的,因为气泡排序是一种用于对一维数组进行排序的算法,而乘法口诀表是一个二维的表格。不过,我们可以使用嵌套的循环来生成乘法口诀表。下面是一个示例代码,它使用嵌套的循环来生成一个简单的乘法口诀表:
 ​
 ```c
 #include <stdio.h>
 ​
 int main() {
  int i, j;
  for (i = 1; i <= 9; i++) {
      for (j = 1; j <= i; j++) {
          printf("%d * %d = %d\t", j, i, i*j);
      }
      printf("\n");
  }
  return 0;
 }
 ```
 ​
 在这个示例中,外层循环控制被乘数(1到9),内层循环控制乘数(1到被乘数)。在内层循环中,我们输出乘法表达式和结果,然后在每一行结束时换行。这样就可以生成一个简单的乘法口诀表。
 ​
 希望这个示例对您有所帮助。

以下是使用递归方法来求整数n的阶乘的完整程序:

 #include <stdio.h>
 ​
 int fact(int n) {
     if (n == 1) {
         return 1;  // 当n为1时,阶乘为1
     } else {
         return n * fact(n - 1);  // 递归调用自身,计算n的阶乘
     }
 }
 ​
 int main() {
     int n;
     scanf("%d", &n);
     printf("\n%d\n", fact(n));  // 输出n的阶乘
     return 0;
 }

在这个程序中,fact函数使用递归的方式来计算n的阶乘。当n为1时,阶乘为1;否则,使用递归调用自身来计算n的阶乘。最终,程序会输出n的阶乘。

希望这个程序对你有帮助。

看起来你想要使用指针p来遍历数组a,并打印数组中的元素。在这种情况下,你需要将指针p指向数组a的第一个元素,然后在循环中逐步递增指针p,并打印指针所指向的元素的值。

以下是一种可能的方法来完成这个任务:

 #include <stdio.h>
 ​
 int main() {
     static int a[6] = {2, 4, 6, 3, 5, 7};
     int *p;
 ​
     p = a;  // 将指针p指向数组a的第一个元素
 ​
     for (int i = 0; i < 6; i++, p++) {
         printf("%d ", *p);  // 打印指针p所指向的元素的值
     }
 ​
     return 0;
 }

在这个程序中,我们首先将指针p指向数组a的第一个元素,然后在循环中递增指针p,并打印指针所指向的元素的值。这样就可以实现遍历数组并打印数组元素的功能。

希望这个示例对你有所帮助。

default

求两个整数的和。 (1)#include <stdio.h> (2)sum(int x, y)//int sum(int x,int y) (3){ return x+y; (4)}(5)void main() (6){ int a=1,b=2; (7) printf("%d\n",sum(a,b)); }

#include <stdio.h>

void swap( int *p1,int *p2)

{ int p;

p=*p1; p1=p2; *p2=p;

}

void main()

{ int a,b;

scanf(" %d%d ",&a,&b);

___ swap( a,b)__;

printf(" a=%d,b=%d ",a,b);

#include <stdio.h>

void swap( int *p1,int *p2)

{ int p;

p=*p1; p1=p2; *p2=p;

}

void main()

{ int a,b;

scanf(" %d%d ",&a,&b);

___ swap( a,b)__;

printf(" a=%d,b=%d ",a,b);

}正确吗不正确。应该是 swap(&a, &b); 而不是 swap(a, b); 因为 swap 函数需要传入指针而不是值。

printf("%d %s %d",stud[i].num,stud[i].name,stud[i].age); printf("%d %s %d\n",p->num,p->name,p->age);分别在什么情况下使用

这两行代码都是用于输出结构体中的成员变量的值,不同之处在于输出的方式和适用的场景。

第一行代码是使用结构体变量stud的成员访问方式来输出结构体中的num、name和age成员的值。这种方式适用于在代码中直接定义并初始化了结构体变量的情况下,例如:

 struct student {
     int num;
     char name[20];
     int age;
 } stud = { 1001, "Tom", 20 };

在这种情况下,可以使用stud.num、stud.name和stud.age来访问结构体中的成员变量,并使用printf函数输出它们的值。

第二行代码是使用指向结构体的指针变量p来输出结构体中的num、name和age成员的值。这种方式适用于在代码中定义了一个指向结构体的指针变量,并通过指针变量来访问结构体中的成员变量的情况下,例如:

 struct student {
     int num;
     char name[20];
     int age;
 } stud = { 1001, "Tom", 20 };
 ​
 struct student *p = &stud;

在这种情况下,需要先定义一个指向结构体的指针变量p,并将其赋值为结构体变量stud的地址。然后可以使用指针变量p->num、p->name和p->age来访问结构体中的成员变量,并使用printf函数输出它们的值。需要注意的是,这里使用了箭头运算符->来访问指针所指向的结构体中的成员变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/289258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL是如何做到可以恢复到半个月内任意一秒的状态的?

MySQL的逻辑架构图 MySQL中两个重要的日志模块&#xff1a;redo log&#xff08;重做日志&#xff09;和binlog&#xff08;归档日志&#xff09; 我们先来看redo log&#xff1a; 介绍一个MySQL里经常说到的WAL技术&#xff0c;即Write-Ahead-Logging&#xff0c;它的关键点…

2024年了,如何制作高水平简历?(附模板)

Q&#xff1a;什么是高水平的简历&#xff1f; A&#xff1a;满足HR需求的同时&#xff0c;最大化的体现自身价值的简历是高水平的简历 HR的需求是什么&#xff1f; ✅ HR想看到清晰专业的简历模板 ——家人们每天看几百份简历谁懂啊&#xff01;花里胡哨真看不下去一点&…

阿里是如何去“O”的?

大家好&#xff0c;我是老猫&#xff0c;猫头鹰的“猫”。 今天我们来聊聊数据库这个话题。 2009年&#xff0c;阿里提出“去IOE化”的概念&#xff0c;这在当时看起来是天方夜谭&#xff0c;但目前来看可以说是"轻舟已过万重山"。 IOE是传统IT三大件&#xff0c;…

消息队列神器:打造高效、可靠的分布式系统

消息队列&#xff08;Message Queueing&#xff09;是现代应用架构中不可或缺的组件&#xff0c;它在处理大规模数据流、服务解耦、系统伸缩性和异步通信等方面发挥着关键作用。但是&#xff0c;要充分利用消息队列&#xff0c;我们必须解决一系列关于高可用性、一致性、顺序性…

你真的知道2024程序员搞钱新姿势吗?

2023年即将过去&#xff0c;2024的序曲已经奏响&#xff01;回顾2023&#xff0c;我们经历了降薪裁员的大趋势&#xff0c;身为程序员也有点惶惶不可终日&#xff0c;害怕会失去工作&#xff0c;害怕面对家人无奈的模样&#xff0c;害怕跟不上时代的步伐&#xff0c;沦为被大环…

MP3音乐播放器搜索引擎-在线搜索MP3歌曲实现(一)

首先添加网络模块和播放模块 下载文件&#xff0c;获取响应&#xff0c;错误处理,加上可以进行网络访问 要加上头文件#include<QNetworkAccessManager> 上面头文件发送请求后返回的响应类用下边的头文件 #include<QNetworkReply> 添加多媒体播放列表#include&…

数据库设计-DDL

D D L \huge{DDL} DDL DDL&#xff1a;数据库定义语言&#xff0c;用来定义数据对象&#xff08;数据库、表&#xff09; 简单操作 首先在cmd中进行操作&#xff0c;登录数据库 show databases; -- 以列表的形式显示所有的数据库create database [if not exists] 数据库名称…

《Vue3 前端构建工具》 Vue-cli 与 Vite 创建项目的插件和配置对比

前言 2024 年 啦&#xff01;Vue2 也于 2023.12.31 寿终正寝 &#xff01; 然而我的 Vue3 升级一再拖延&#xff08;惭愧不已&#xff09;~ 赶起来吧~ 今天用 vue-cli 和 vite 分别创建了 Vue3 项目&#xff0c;具体实现步骤见如下两篇。 《基于 Vue Cli4.x Vue3 TS styl…

高端电流检测方案

随着过去传统的“开环”系统被智能和高效率“闭环”设计所取代&#xff0c;准确的电流检测在多种应用中变得越来越重要。常见的电流检测方法&#xff0c;需要将检流电阻串联进被测电流通路&#xff0c;再用放大电路放大检流电阻上的压降。这个放大电路常被称之为电流检测放大器…

npm发布js工具包

一、创建项目 1、在github上创建一个项目&#xff0c;然后拉取至本地&#xff0c;进入项目目录2、执行 npm init 生成json文件3、创建 src/index.ts 入口文件和 src/isObject.ts 工具方法 src/index.ts export { default as isObject } from ./isObject src/isObject.ts /…

AUTOSAR软件手册文档缩写描述,AUTOSAR_TR_PredefinedNames

由于AUTOSAR文档中的缩写太多&#xff0c;入门者看起开不方便。例如TR、SWS、SRS、EXP模块。 下载链接&#xff1a;https://www.autosar.org/fileadmin/standards/R21-11/FO/AUTOSAR_TR_PredefinedNames.pdf

终于学会听英文歌了:A Sad Me In Your Eyes

A Sad Me In Your Eyes 来源&#xff1a; https://lyricstranslate.com/en/ln-party-sad-me-your-eyes-lyrics.html Fire can’t burn in my eyes If without your smile Snow can cover your smile If without your love When you think of me, I’ve gone too far I can’t …

8K自动化测试面试题分享(有答案,非常详细)

关于自动化测试面试&#xff0c;会问到哪些问题呢&#xff1f;给大家简单总结了一下&#xff0c;每一个都是学员反馈过来的企业真题&#xff0c;相信对大家有帮助&#xff0c;最近有面试机会的&#xff0c;快来背一下答案吧 1、你会封装自动化测试框架吗&#xff1f; 这个问得…

单片机外设矩阵键盘之线反转法识别原理与示例

单片机外设矩阵键盘之线反转法识别原理与示例 1.概述 这篇文章主要介绍单片机接收 4X4矩阵键盘发出的指令&#xff0c;做出对应的反馈。其中主要介绍矩阵键盘线反转方式的识别原理和实操。 2.矩阵键盘线反转识别原理 2.1.矩阵键盘硬件接线原理 矩阵键盘的硬件接线方式有多种…

Nginx 中的日志

目录 1.定制访问日志记录格式 1.1 全部日志记录 1.2 每个网站独属一份日志 2.日志路径 3.错误日志 1.定制访问日志记录格式 1.1 全部日志记录 该配置处于nginx.conf 文件中 log_format compression $remote_addr - $remote_user [$time_local] "$request" $sta…

源支付V7最新修复版,V2.7.9最新版

源支付V7最新修复版&#xff0c;V2.7.9最新版 注&#xff1a;开发不易&#xff0c;仅限交流学习使用&#xff0c;如商业使用&#xff0c;请支持正版&#xff01; 轻量化的界面 UI, 提供更加便捷的操作体验&#xff0c;让您的系统一目了然 推荐支付宝当面付 - 免 CK - 商家版&a…

【ZYNQ入门】第三篇、双核AMP运行模式程序开发

目录 第一部分、基础知识 1、多核CPU三种主要运行模式 2、ZYNQ内部FSBL涉及到的启动过程 2.1、BootRom是啥&#xff1f; 2.2、FSBL是啥&#xff1f; 2.3、ARM与cortex的关系 2.4、本次实验的启动流程 第二部分、FSBL环境配置过程 1、vivado配置硬件 2、SDK新建FSBL配…

8天狂收6000+⭐️,可商用的开源Stream Diffusion

加州大学伯克利分校、东洋大学、东京工业大学、麻省理工学院和筑波大学等研究人员&#xff0c;联合开源了一款创新性实时交互图像生成框架——Stream Diffusion。 Stream Diffusion的技术创新点在于&#xff0c;将传统的顺序去噪变成流批处理去噪&#xff0c;消除了漫长的等待…

大模型实战营第二期——1. 书生·浦语大模型全链路开源开放体系

文章目录 1. 实战营介绍2. 书生浦语大模型介绍2.1 数据2.2 预训练2.3 微调2.4 评测2.5 部署2.6 智能体(应用) 1. 实战营介绍 github链接&#xff1a;https://github.com/internLM/tutorialInternLM&#xff1a;https://github.com/InternLM书生浦语官网&#xff1a;https://in…

使用Vue3开发学生管理系统模板7 科目信息的实现

字段设计 IDname&#xff1a;课程名称&#xff0c;字符串&#xff0c;最大36字符start_time&#xff1a;开设时间&#xff0c;日期类型teacher_total&#xff1a;该科目老师人数&#xff0c;数字类型master_id&#xff1a;负责人ID&#xff0c;字符串&#xff0c;最大36字符ma…
最新文章