C语言基础(三)构造类型、语句

一、构造类型

1.结构体:是由多个成员组成的数据集合,成员可以是不同的数据类型。例如:空间坐标、复数、学生信息等。

    //创建一个结构体类型:空间坐标Point,包含x、y、z三个坐标信息
    struct Point{
        double x;
        double y;
        double z;
    };

    // 声明一个结构体(Point)类型的变量p1
    struct Point p1;

    //为这个空间坐标p1赋值
    p1.x=3.5;
    p1.y=4.5;
    p1.z=5.0;

    //输出
    printf("空间坐标:p1(%2.1f,%2.1f,%2.1f)\n",p1.x,p1.y,p1.z);

结果:

空间坐标:p1(3.5,4.5,5.0)

 2.共用体:同一个内存空间中存储不同的数据类型,所有成员共享空间。

    //共用体
    union Data{
        char a; //占用1个字节空间
        short b; //占用2个字节空间
        double c;//占用8个字节空间
    };

    union Data d1;
    d1.a='a';
    d1.b=12345;
    d1.c=55555.5666;
    printf("d1.a=%c\nd1.b=%d\nd1.c=%lf\n",d1.a,d1.b,d1.c);

结果

d1.a=
d1.b=21181
d1.c=55555.566600

 共用体Data中虽然有char short double三种类型的成员,但是在开辟空间时只开辟8个字节(占空间最大的成员),给任意一个成员赋值时都会写入这个空间中,后写入的数据会覆盖之前的数据,上面例子中给d1.b赋值后,d1.a的数据被覆盖,给d1.c赋值后d1.b的数据又被覆盖了,所以最后只有d1.c显示正确数据。

3.枚举:声明符号名称来表示整型常量。枚举类型的目的是提高程序的可读性。

    enum Gender{
        Male,
        //Male=2,
        Female
    };

    enum Gender gg;
    gg=Male;
    printf("gg=%d\n",gg);
    gg=Female;
    printf("gg=%d\n",gg);
    gg=3;//不报错,但是不建议这样用
    printf("gg=%d\n",gg);

结果

gg=0
gg=1
gg=3

 默认情况下,枚举列表中的常量被赋予0,1,2等。所以Male=0,Female=1,不想使用默认值可以通过给Male=2这样的方式指定初始值,此时Female=3。

typedef:定义别名。

    //定义别名:定义Pt用来表示struct Point
    typedef struct Point Pt;
    //此时Pt的使用和基础类型一样
    Pt p2;
    
    //也可以在定义结构体的时候直接指定别名
    typedef struct Point2D{
        double x;
        double y;
    } Pt2D;

    Pt2D p3;

4.数组

一维数组

    //创建
    int array[5];

    //赋值
    array[0]=1;
    array[1]=3;
    array[2]=5;
    array[3]=7;
    array[4]=9;

    //创建+初始化
    int array1[]={2,4,6,8};

    //数组长度:函数sizeof()计算占用内存字节数
    int len = sizeof(array1)/sizeof(int);
    printf("数组长度为%d\n",len);

    //输出
    printf("array[%d]=%d\n",0,array[0]);
    printf("array[%d]=%d\n",1,array[1]);
    printf("array[%d]=%d\n",2,array[2]);
    printf("array[%d]=%d\n",3,array[3]);
    printf("array[%d]=%d\n",4,array[4]);

结果

数组长度为4
array[0]=1
array[1]=3
array[2]=5
array[3]=7
array[4]=9

 二维数组

    //二维数组
    int arr[2][3]={{1,2,3},{4,5,6}};

    //修改元素数据
    arr[1][0]=100;
    //输出
    printf("arr[%d][%d]=%d\t",0,0,arr[0][0]);
    printf("arr[%d][%d]=%d\t",0,1,arr[0][1]);
    printf("arr[%d][%d]=%d\n",0,2,arr[0][2]);
    printf("arr[%d][%d]=%d\t",1,0,arr[1][0]);
    printf("arr[%d][%d]=%d\t",1,1,arr[1][1]);
    printf("arr[%d][%d]=%d\n",1,2,arr[1][2]);

结果

arr[0][0]=1	arr[0][1]=2	arr[0][2]=3
arr[1][0]=100	arr[1][1]=5	arr[1][2]=6

 5.指针

 指针就是内存地址。

    //1.内存地址
    int num = 10;

    printf("num=%d\n",num);
    printf("num=%p\n",&num);//num的内存地址

    //2.定义指针
    int * ptr_num=#//指针指向num的内存地址
    printf("ptr_num=%p\n",ptr_num);//指针存储的是num的地址
    //指针前加*代表内存地址中的数据
    *ptr_num=20;//这个操作等价于num=20;
    printf("指针指向的数据num=%d\n",*ptr_num);
    printf("num=%d\n",num);

结果(32位操作系统或32位编译器):

num=10
num=0061FEC8
ptr_num=0061FEC8
指针指向的数据num=20
num=20

 结果(64位操作系统或64位编译器):

num=10
num=000000EC71D0F780
ptr_num=000000EC71D0F780
指针指向的数据num=20
num=20

注:64位操作系统可以同时处理64个二进制位(即8个字节),所以内存地址长度是8个字节。 

1.内存地址。内存中任何变量都有对应的地址,可以使用&获取内存地址

2.定义指针。定义指针使用符号“*”,访问内存地址中保存的数据也用“*”,要注意区分两个*。

二、语句

语句有三种结构:顺序、选择、循环

1.顺序结构:

由上至下一条一条的执行。

2.选择结构:

根据不同的条件,选择执行不同的语句 。选择结构包括if语句和Switch语句。

if语句

简单if语句:

    int num;
    printf("请输入一个数:");
    scanf("%d",&num);

    if(num<0){
        printf("负数\n");
    }else{
        printf("非负数\n");
    }

结果:

请输入一个数:-5
负数

 多重if语句:

    int num;
    printf("请输入成绩:\n");
    scanf("%d",&num);
    if(num>90)
        printf("优秀");
    else if (num>75)
        printf("良好");
    else if (num>60)
        printf("合格");
    else
        printf("不合格");

结果:

请输入成绩:
80
良好

if语句的嵌套:

    //比较两个数的大小
    int m,n;
    printf("请输入第一个数:\n");
    scanf("%d",&m);
    printf("请输入第二个数:\n");
    scanf("%d",&n);

    if(m==n)
        printf("相等");
    else{
        if(m>n)
            printf("m大于n");
        else
            printf("m小于n");
    }

 结果:

请输入第一个数:
15
请输入第二个数:
20
m小于n

switch语句:

    printf("今天星期几(输入数字回答)?\n");
    int day;
    scanf("%d",&day);
    switch (day) {
    case 1:
        printf("星期一");
        break;
    case 2:
        printf("星期二");
        break;
    case 3:
        printf("星期三");
        break;
    case 4:
        printf("星期四");
        break;
    case 5:
        printf("星期五");
        break;
    case 6:
    case 7:
        printf("周末");
        break;
    default:
        printf("输入错误!");
    }

 结果:

今天星期几(输入数字回答)?
3
星期三

3.循环结构:

程序中循环执行一段代码,需要设置循环终止条件。循环结构包括:for语句、while语句、do-while语句。

for、while、do-while的简单例子:

    //例:输出1~10
    printf("使用顺序语句输出:\n");
    printf("%d ",1);
    printf("%d ",2);
    printf("%d ",3);
    printf("%d ",4);
    printf("%d ",5);
    printf("%d ",6);
    printf("%d ",7);
    printf("%d ",8);
    printf("%d ",9);
    printf("%d ",10);

    //while
    printf("\nwhile循环:\n");
    int i=1;//1
    while(i<=10){//3
        printf("%d ",i);
        i++;//2
    }

    //do-while
    printf("\ndo-while循环:\n");
    i=1;
    do{
        printf("%d ",i);
        i++;//2
    }while(i<=10);


    //for
    printf("\nfor循环:\n");
    for(int i=1;i<=10;i++){
        printf("%d ",i);
    }

结果:

使用顺序语句输出:
1 2 3 4 5 6 7 8 9 10
while循环:
1 2 3 4 5 6 7 8 9 10
do-while循环:
1 2 3 4 5 6 7 8 9 10
for循环:
1 2 3 4 5 6 7 8 9 10

循环语句的终止:

上面例子中每个循环语句都有一个终止的条件,除了这种方式外还有一些其他的方法终止循环语句。

1.continue:跳过当前循环中continue后面的部分,继续执行下一次循环。

    //输出1-10,跳过5
    for(int i=1;i<=10;i++){
        if(i==5)
            continue;//跳过当前循环,继续执行下一次
        printf("%d ",i);
    }

结果:

1 2 3 4 6 7 8 9 10

2.break:结束循环语句。

    for(int i=1;i<=10;i++){
        if(i==6)
            break;//跳出循环语句
        printf("%d ",i);
    }

结果:

1 2 3 4 5

3.通过输入数据判断是否终止循环:

猜数游戏:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//循环:猜数游戏
int main(){

    //1.随机生成一个10以内数
    srand(time(NULL));

    int num = rand()%10;
    int guess;
    //2.输入一个数,与生成的数比较;相等=》3,不等=》2
    printf("刚刚系统随机生成了一个10以内的数,猜一下是几(请输入一个10以内的数)?:\n");
    do{
        scanf("%d",&guess);
        if(guess>num){
            printf("大了!再猜一次吧(请输入一个10以内的数):");
        }else if(guess<num){
            printf("小了!再猜一次吧(请输入一个10以内的数):");
        }
    }while(guess!=num);

    //3.输出结果
    printf("猜对了,数字是%d",num);

    return 0;
}

结果:

刚刚系统随机生成了一个10以内的数,猜一下是几(请输入一个10以内的数)?:
7
小了!再猜一次吧(请输入一个10以内的数):9
大了!再猜一次吧(请输入一个10以内的数):8
猜对了,数字是8

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值