C语言 结构体和选择语句

目录

一、内存与地址

1.内存

2. 地址的产生

二、结构体struct

1.什么是结构体

2.创建结构体

 三、数据类型

(1)数据类型的大小

(2)ASCII码的表示

(3)汉字的表示

四、选择语句

1.C语言中的真与假

2.if语句

3.switch语句

4.continue语句

五、保留小数和四舍五入


一、内存与地址

1.内存

内存被划分为一个一个小的内存单元,为了管理这些内存单元,计算机给每一个内存单元进行编号。

内存单元的编号就是地址。

对于变量的地址:所占内存单元中第一个内存单元(一个内存单元的大小为一个字节)的编号。比如int a=10;变量a占4个字节,但是地址为a第一个字节。

而且因为每一次程序运行,内存都会重新给a分配一个空间,所以每一次运行程序打印出地址不一样。

地址以16进制方式打印:0x为16

进制的开头 16进制一共8位。 

#include<stdio.h>
int main()
{
    int a=10;
    int*p=&a;
    printf("%p",p);
    return 0;
}

2. 地址的产生

(1)对于32位机器来说,它有32根地址线/数据线;给物理线进行物理通电——>产生(高电平和低电平(1/0))。每一根物理线产生一个数

(0/1)一共有32位,产生2^32种编号;

每一个编号有32位数,每一数被称为1bit位,而8个bit就是1个byte,所以在32位机中,一个地址的长度为4字节。

4个字节长度编号一共有2^32个地址可能

(2)x86表示32位机,x64表示64位机

二、结构体struct

1.什么是结构体

结构体(struct)是由一系列具有相同类型或不同类型的数据项构成的数据集合,这些数据项称为结构体的成员。

结构体是C语言中的一种构造类型。

2.创建结构体

结构体类型的定义

​
//创建学生信息档案,那么每个学生的信息有姓名,学号,性别等
// 对于姓名我们需要使用字符串类型,对于学号需要int型。
//对于这种不同类型的数据,我们可以创建结构体
struct Stu
   {
	//结构体的成员
	char name[20];
	int age;
	char sex[10];
    };
//对结构体进行初始化
int main()
{
	struct Stu zhangsan = { "张三",24,"男" }; //对名字为张三的学生信息进行初始
	struct Stu lisi = { "李四",20,"保密" };   //对名字为李四的学生信息进行初始化 
 	//打印出学生信息方法一:
  printf("%s %d %s", zhangsan.name, zhangsan.age, zhangsan.sex);
  //打印出学生信息方法二:利用指针,结构体指针定义方式 struct name*p
   struct Stu * pl = &lisi;
	printf("%s %d %s\n", (*pl).name, (*pl).age, (*pl).sex); 
   
   //结构体指针*******************************
   //结构体指针的使用   '->'
   struct Stu * pl = &lisi;
	printf("%s %d %s\n", pl->name, pl->age, pl->sex);

}

​

#include<stdio,h>
int main()
{
    struct Stu
    {
        char name[10];
        int age;
        char sex[10];    
    };
    //创建一个结构体
    struct Stu s;
    scanf("%s",&s.name);   //这里是输入结构体s的name信息 
    printf("%s",s.name); //打印输入的信息
    return 0;
}

 三、数据类型

(1)数据类型的大小

一个字母占一个字节的空间;一个汉字占两个字节的空间;符号:英文标点占一个字节,中文标点占两个字节.

一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数.在32位机中也是一个字节。如一个ASCII码就是一个字节.此类单位的

1KGB=1024GB

1GB) =1024MB

1MB =1024KB

1KB =1024Byte

1Byte = 8bit

比特(bit)就是一个二进制位。

字节(byte)是计算机中数据类型最基本的单位了,8bit 组成1byte

字(word)两个byte称为一个word,所以一字大小应该是16位bit,共两字节。

(2)ASCII码的表示

char数据类型长度为1byte 即8位。

unsigned char 无符号的字符型 占1byte 即8位 它主要是为了能够兼容扩展ASCII码。

由于 char 由8位表示表示范围为 -128 - +127,无法表示带上扩展ASCII码总共256个字符所以如果把 8位中的最高位符号位也用来计数,就可以正好表示256个字符。

unsigned char 表示范围为 0 - 255 正好256个数可以对应包含扩展ASCII码在内的共计256个ASCII字。

(3)汉字的表示

汉字在计算机中存储是使用机内码来存储的,而常用汉字不过是几万个。如果用16位比特就可以表示了,所以汉字字符存储使用了两个字节。所以可以用两个字节储存一个汉字。

四、选择语句

1.C语言中的真与假

c语言规定0为假,非0就为真。

if(18<=age<40)//这种语言虽然没有语法错误,可以运行,但是逻辑上有错误
//例如输入10  从左到右,正确返回1,然后进行右边判断
//等价为if(0<40)这个的结果为真,可以运行。

2.if语句

if (age < 18)
    printf("少年\n");
else if (age >= 18 && age < 40)
	printf("青年\n");
else if (age >= 40 && age < 60)
 	printf("壮年\n");
else if (age >= 60 && age < 90)
  printf("老年\n");

在if语句中else匹配的问题:与最近的if匹配

#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与第二个if进行匹配。这个程序的逻辑结果是这样的

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

所以if语句在书写的时候,当出现多个if条件的时候,最好使用花括号把语句的逻辑结果清楚的表示出来;

有兴趣的读者可以看看《高质量c/c++编程》,养成一个好的书写习惯;

3.switch语句

int main()
{
int day = 0;
scanf("%d", &day);
int n = 1;

switch (day)
{	
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    	printf("weekday\n");
    	break;
    case 6:
    case 7:
    	printf("weekend\n");
    	break;
    default:
    	printf("输入错误,请输入1~7的数字\n");
    	break;
}
return 0;
}
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
    case 1:
    	m++;  //m=3
    case 2:
    	n++;  //由于没有break语句,所以这句话需要执行n=2
    case 3:   
    	switch (n)  //n=2从case 2:开始执行
     	{
    		case 1:
    		       n++;
    		case 2:
    			m++; //m=4
    			n++;  // n=3
    			break;
    	}
    case 4:
    	m++;   //m=5
    	break;  //跳出循环
    default:
    	break;
}
printf("m = %d, n = %d\n", m, n);  所以最后的结果为5 3
return 0;

}

这个程序的输出结果为5,3

switch语句的执行为:n等于多少,就从哪里开始执行case语句;如果没有break,就会一直执行后面的语句。直到遇见break或者全部执行完语句。

4.continue语句

continue的作用是终止当前的一次循环后面的内容,跳过去执行下一次循环的内容。

//写代码在屏幕上打印1~10
int main()
{
    int i = 1;
    while (i <= 10)
    {
    	if (5 == i)
    	continue;//当i的值为5时,跳过循环后面的内容,回到while语句再次执行,所以出现了死循环。

    	printf("%d ", i);
    	i++;
    }

return 0;
}

五、保留小数和四舍五入

C语言中小数保留问题满足四舍六入,五成双。%.mf 可以让浮点数保留 m 位小数输出。

规则为:

5以下舍弃 5以上进位。而当下一位为5时要讨论:被化简的小数位后面一位的数字等于5时

要看5前面的数字,若是奇数则进位,

若是偶数则将5舍掉,即修约后末尾数字都成为偶数;

若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。比如我们保留两位小数:

9.8249=9.82(小于5,舍掉), 9.82671=9.83(大于5进位)

9.8350=9.84(奇数进位), 9.8351=9.84(奇数进位)

9.8250=9.82(偶数舍弃), 9.82501=9.83(5后面有数应进位)

四舍五入到整数可以使用round().该函数的作用是把数四舍五入精确到整数。

#include<stdio.h>
#include<math.h>
int main()
{
    double a=11.6789;
    printf("%lf",round(a));
    return 0;
}

如果想要四舍五入到第n位小数,我们可以使用以下这个公式:

#include<stdio.h>
//如果要把num四舍五入到n个小数位 不妨用
float num;
printf("%.nf",(num*1en+0.5)/1e(n.0))
//比如我们要四舍五入到第三位
float n=11.728889;
printf("%.3f",(n*1e3+0.5)/(10.0*10.0*10.0));

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影中人lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值