简单点-c-Lesson5(结构体,分支语句(if,switch),p和*p的区别)

本文详细讲解了C语言中结构体的定义与访问,分支语句if和switch的用法,包括单选、二选、多选条件判断,悬空else的处理,以及如何判断奇数和输出1-100的奇数。还重点阐述了switch语句中break的作用,并通过实例演示了嵌套switch的使用。
摘要由CSDN通过智能技术生成

1.结构体

(1)结构体定义,即描述不同数据类型或者相同数据类型的集合。(复杂类型)
(2)访问结构体:指针访问结构体(->);变量名访问结构体(.).
(3)p和*p的区别,具体是什么含义要看是左值还是右值。

#if 1 
#include <stdio.h>
#include <windows.h>

#define SIZE 20

//定义一个结构体
struct Stu{
	char name[SIZE];
	int age;
	char sex[SIZE];
	char telephone[SIZE];
};
int main()
{
	//访问结构体
	//1.变量名访问(struct Stu是结构体类型)
	struct Stu Tom = {"tom",12,"男","1234567"};
	printf("%s %d %s %s\n", Tom.name, Tom.age, Tom.sex, Tom.telephone);

	//2.指针访问(struct Stu*是结构体指针类型)
	struct Stu* ps = NULL;//不知道指针指向哪时,让其指向空,如果不指向,就会乱指,生成随机值,也就是野指针。
	ps = &Tom;
	printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).telephone);

	struct Stu* p = &Tom;
	printf("%s %d %s %s\n", p->name, p->age, p->sex, p->telephone);
	system("pause");
	return 0;
}
#endif

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.分支语句 if语句

(1)C语言中由一个分号; 隔开的就是一条语句。
(2)if选择语句:
a.if(表达式){语句;} 单选1
b.if(表达式){语句;}else{语句;} 二选1
c.if(表达式){语句;}else if(表达式){语句;}else{语句;} 多选1
注:1.自上而下判断,以上一个成立,就不执行后面的了。
2.表达式必须为真,c语言中,0为假,非0为真。防止出现逻辑错误,1 == flag;不建议flag1,如果将写成=,就会出现错误。
3.{}括起来的就是一个代码块,内部的变量为局部变量。
(3)两个并列的if条件判定(每个条件都要判断)
if(表达式){语句;}
if(表达式){语句;}
(4)悬空else:采用就近原则,解决此问题,就是规范写代码,该{}就{},一是代码风格,二是逻辑比较清楚。
(5)例子:a.判断一个数是否为奇数
b.输出1-100之间的奇数
在这里插入图片描述

2.1 单选1

#if 0
#pragma warning(disable:4996)
#include <stdio.h>
#include <windows.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if(age<18)
	{
		printf("未成年\n");
	}

	system("pause");
	return 0;
}
#endif

在这里插入图片描述

2.2 二选1

#if 0
#pragma warning(disable:4996)
#include <stdio.h>
#include <windows.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if(age<18)
	{
		printf("未成年\n");
	}
	else
	{
		printf("成年人\n");
	}

	system("pause");
	return 0;
}
#endif

在这里插入图片描述

2.3 多选1

#if 0
#pragma warning(disable:4996)
#include <stdio.h>
#include <windows.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if(age<18)
	{
		printf("少年\n");
	}
	else if(age>=18 && age<30)//else if(age<30)---这种判断是自上而下判断,到这一步,就意味着已经age>=18了。这块遵循的是左闭右开的原理。
	{
		printf("青年\n");
	}
	else if(age>=30 && age<50)//else if(age<50)
	{
		printf("中年\n");
	}
	else if(age>=50 && age<80)//else if(age<80)
	{
		printf("老年\n");
	}
	else
	{
		printf("老不死\n");
	}
	system("pause");
	return 0;
}
#endif

在这里插入图片描述

2.4 并列if

#if 0
#include <stdio.h>
#include <windows.h>
int main()
{
	int flag= 1;
	if(1 == flag)
	{
		printf("xixi\n");
	}
	if(1 == flag%2)
	{
		printf("haha\n");
	}
	//结果为xixi,haha,因为两个条件都成立。
	system("pause");
	return 0;
}
#endif

在这里插入图片描述

2.5 悬空else,就近匹配if,解决方案就是把{}写上。

#if 0
#include <stdio.h>
#include <windows.h>
int main()
{
	//以下代码,将{}写上,就输出了haha
	int a = 0;
	int b = 2;
	if(a == 1)
	{
		if(b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}

	//以下代码,你以为可以输出hehe,其实啥也没输出,因为else是跟第二个if匹配的。
	/*int a = 0;
	int b = 2;
	if(1 == a)
		if(2 == b)
			printf("hehe\n");
	else
		printf("haha\n");*/

	system("pause");
	return 0;
}
#endif

在这里插入图片描述

2.6 判断一个数是否为奇数

#if 0
#include <stdio.h>
#include <windows.h>

int IsJi(int _x)
{
	//0不是奇数,1是奇数
	//return _x%2 == 1 ? 1:0;
	//return _x%2 == 1;
	//return _x%2;

	/*理解:
		3:011 --- 2^1+2^0
		4:100 --- 2^2
		10:1010 --- 2^3 + 2^1
		11:1011 --- 2^3 + 2^1 + 2^0 --- 2*( 2^2 + 2^0) + 2^0
		上述就可以看出,要判断一个数是否奇数,只需要判断bit位的午后一位是不是1,是1则是奇数,是0则是偶数。
		eg:11
		00000000 00000000 00000000 00000001
		00000000 00000000 00000000 00001011 &
		-----------------------------------
		00000000 00000000 00000000 00000001 奇数
	*/
	        
	return _x&1;
}

int main()
{
	int x = 0;
	printf("请输入一个数:");
	scanf("%d",&x);
	int ret = IsJi(x);
	if(ret)
	{
		printf("是奇数\n");
	}
	else
	{
		printf("不是奇数\n");
	}
	system("pause");
	return 0;
}
#endif

在这里插入图片描述

2.7 输出1-100之间的奇数

#if 0
#include <stdio.h>
#include <windows.h>

int IsJi(int _x)
{
	//0不是奇数,1是奇数
	//return _x%2 == 1 ? 1:0;
	//return _x%2 == 1;
	//return _x%2;

	/*理解:
		3:011 --- 2^1+2^0
		4:100 --- 2^2
		10:1010 --- 2^3 + 2^1
		11:1011 --- 2^3 + 2^1 + 2^0 --- 2*( 2^2 + 2^0) + 2^0
		上述就可以看出,要判断一个数是否奇数,只需要判断bit位的午后一位是不是1,是1则是奇数,是0则是偶数。
		eg:11
		00000000 00000000 00000000 00000001
		00000000 00000000 00000000 00001011 &
		-----------------------------------
		00000000 00000000 00000000 00000001 奇数
	*/
	        
	return _x&1;
}

int main()
{
	int start = 0;
	int end = 0;
	printf("请输入start和end:");
	scanf("%d%d",&start,&end);
	for(; start < end; start++)
	{
		if(IsJi(start))
		{
			printf("%d ",start);
		}
	}
	printf("\n");
	system("pause");
	return 0;
}
#endif

在这里插入图片描述

3.分支语句 switch…case:break; default:break

(1)定义:
	a.单分支:
		switch(表达式){case 常量:语句;break;case 常量:语句;break;...case 常量:语句;break;default:语句;break;}
	b.多分支:
		switch(表达式){case 常量:case 常量:...case 常量:语句;break;default:语句;break;}
(2)注意事项:
	a.case具有判断功能,没有分支功能;if语句是条件+判断+分支。
	  case后面必须是整形常量表达式;类型可以是:int、short、char、long、longlong
	  case表达式不要求顺序。
	b.break实现的是分支功能;
	  break语句的实际效果是把语句列表划分为不同的部分。
	c.default实现没有匹配到的功能;
	  当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。
	  每个switch语句中只能出现一条default子句;
	  可以出现在语句列表的任何位置。
(3)例子看break的重要性(面试题):
	a.break只是跳出了break所在的循环,外面如果还有循环,还需要继续。
	b.switch允许嵌套使用

在这里插入图片描述

3.1 单分支

#if 0
#include <stdio.h>
#include <windows.h>

int main()
{
	
	int day = 0;
	printf("请输入星期:");
	scanf("%d",&day);
	switch(day)
	{
	case 1:
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期7\n");
		break;
	default:
		printf("输入错误,请重新输入\n");
		break;

	}
	system("pause");
	return 0;
}
#endif

在这里插入图片描述

3.2 多分支

#if 0
#include <stdio.h>
#include <windows.h>

int main()
{
	
	int day = 0;
	printf("请输入星期:");
	scanf("%d",&day);
	switch(day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("周内\n");
		break;
	case 6:
	case 7:
		printf("周末\n");
		break;
	default:
		printf("输入错误,请重新输入\n");
		break;
	}
	system("pause");
	return 0;
}
#endif

在这里插入图片描述

3.3 例子看break的重要

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

在这里插入图片描述

4.其他小知识点

1.strlen();用来获取字符串内容的有效长度,结尾标记’\0’不包含在内。
sizeof():包含\0,获取的是空间长度。
在这里插入图片描述
2.数组的初始化,可以不指定数组大小。
eg:int arr[] = {1,2,3,4,5};
注:[]里面只能存放常量,不能放变量。
3.c语言关键字:c语言中关键字是具有特定含义、专门用于特殊用途的C语言标识符,也称保留字。
define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是c语言的内容。
注:#开头的都是预处理福。
4.指针是地址;指针变量是变,用来存放地址。
5.const修饰的变量为常变量,值不能被改变。

#if 0
#include <stdio.h>
#include <windows.h>
int main()
{
	
	char arr[] = {'a','b','c'};
	char arr1[] ="abc";
	char arr2[] = {'a','b','c','\0'};
	printf("%d %d %d\n",strlen(arr),strlen(arr1),strlen(arr2));//随机值 3 3
	printf("%d %d %d\n",sizeof(arr),sizeof(arr1),sizeof(arr2));//3 4  4
	system("pause");
	return 0;
}
#endif

在这里插入图片描述

5.p和*p的区别,具体是什么含义要看是左值还是右值。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值