C语言基础day4

复习

条件运算符

表达式1?表达式2:表达式3

表达式1为真,结果是表达式2的结果;否则是表达式3的结果。

sizeof()运算符

计算类型和变量的占内存长度,单位是字节

int 4

char 1

float 4

short 2

double 8

++自增 --自减

变量自身+1或者-1。

前缀和后缀形式表达式的结果不一样。

前缀:表达式的结果是变量+1或-1之后的值。

后缀:表达式的结果是变量+1或-1之前的值。

短路特性

&& ||

&& 左边为假,右边不执行。

|| 左边为真,右边不执行。

switch-case结构

switch(表达式) //表达式的结果必须是整型,或者字符型。

{

case 值(常量): //值是表达式可能产生的结果。

可以写无数个case

default: 当没有匹配到任何case,会执行default,可以省略。

}

当匹配到某个case的时候,会从这个开始case执行,直到遇见break或者switch结束。

while循环

while(表达式)

{

​ 循环体

}

for循环

for(表达式1;表达式2;表达式3)

​ 循环体

作业

用户不断输入数字,每输入一个数字就打印,直到输入为0时为止

#include 

int main()
{
	int input;
	while(1)
	{
		scanf("%d", &input);
		if(input == 0)
		{
			break;
		}
		printf("%d\n", input);
	}
	return 0;
}

作业

输出以下图形.要求:每次只输出一个字符。

*****

#include 

int main()
{
	int i;
	//循环变量习惯从0开始
	//我们一定要清楚代码执行的流程,千万不要想当然
	for(i = 0;i < 5;i++)
	{
		printf("*");
	}
	//循环走完的时候,已经打印了5个*
	printf("\n");
	return 0;
}

作业

输出以下图形。要求:每次只输出一个字符。

*****

*****

*****

#include 

int main()
{
	int i;
	int line;
	for(line = 0;line < 3;line++)
	{
		//循环变量习惯从0开始
		//我们一定要清楚代码执行的流程,千万不要想当然
		for(i = 0;i < 5;i++)
		{
			printf("*");
		}
		//循环走完的时候,已经打印了5个*
		printf("\n");
	}
	return 0;
}

作业

输出以下图形。要求:每次只输出一个字符。

*

**

***

****

#include 

int main()
{
	int i;
	int line;
	//int len = 1;
	for(line = 0;line < 4;line++)
	{
		//循环变量习惯从0开始
		//我们一定要清楚代码执行的流程,千万不要想当然
		for(i = 0;i < line+1;i++)
		{
			printf("*");
		}
		//循环走完的时候,已经打印了5个*
		printf("\n");
		//len++;
	}
	return 0;
}

作业

输入学生成绩,程序中加入循环,可以反复输入成绩查看等级

​ 90-100 分打印 A

​ 80-89 分打印 B

​ 70-79 分打印 C

​ 60-69 分打印 D

​ 其他不及格

#include 

int main()
{
	int score;
	while(1)
	{
		scanf("%d", &score);
		if(score<0 || score>100)
		{
			printf("输入错误\n");
		}
		else if(score >= 90)
		{
			printf("A\n");
		}
		else if(score >= 80)
		{
			printf("B\n");
		}
		else if(score >= 70)
		{
			printf("C\n");
		}
		else if(score >= 60)
		{
			printf("D\n");
		}
		else 
		{
			printf("不及格\n");
		}
	}
	return 0;
}

作业

实现输入一个字符,使用循环可以反复的输入判断,判断这个字符是不是数字,如果不是数字,是大写字符还是小写字符

#include 

int main()
{
	char input;
	while(1)
	{
		scanf("%c", &input);
		if(input>='0' && input<='9')
		{
			printf("数字\n");
		}
		else if(input>='a' && input<='z')
		{
			printf("小写\n");
		}
		else if(input>='A' && input<='Z')
		{
			printf("大写\n");
		}
		else
		{
			printf("啥也不是\n");
		}
		getchar();//清理回车
	}
	return 0;
}

作业

判断用户输入的年是否为闰年?

​ 四年一润

​ 百年不润

​ 四百年又润 2000 yes 1900 no

#include 

int main()
{
	int year;
	scanf("%d", &year);
	if(year%4==0&&year%100!=0 || year%400==0)
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
	return 0;
}

作业

在所有的三位数中,寻找有几个水仙花数。 (4个)

(371 == 3*3*3 + 7*7*7 + 1*1*1)

num%10 得到个位数

num/10%10 得到十位数

num/100 得到百位数

#include 

int main()
{
	int num;
	//循环所有的三位数
	for(num = 100;num < 1000;num++)
	{	
		int a = num%10;//个位数
		int b = num/10%10;//十位数
		int c = num/100;//百位数
		if(a*a*a+b*b*b+c*c*c == num)
		{
			printf("%d\n", num);
		}
	}
	return 0;
}

1、 do-while

格式:

do 
{
	循环体。 
}while( 条件 );

第一次的循环体是无条件执行的,循环体执行完之后判断条件,条件为真再执行循环体。

do-while循环以;结尾。

C语言的语句一定是以{}或者;结尾。

if()

{}

switch()

{}

while()

{}

for()

{}

特点: 先执行,再判断。

示例:

#include  

int main()
{
	int i=1; 
	do
	{
		printf("%d",i);
		i++;
	}while(i<=5);
	return 0;
}

练习:

1 ~ 100 之间求和。使用 do-while 完成。

#include 

int main()
{
	int i = 1;
	int sum = 0;
	do
	{
		sum += i;
		i++;
	}while(i < 101);
	printf("%d\n", sum);
	return 0;
}

练习:

请输入一个数,如果满足条件(150~160 之间包括150和160),输出它,并且结束程序即可。

(要求:请确保这个数是范围内的数,如果不在范围内,请重新输入)建议使用do-while

#include 

int main()
{
	while(1)
	{
		int input;
		scanf("%d", &input);
		if(input>=150 && input<=160)
		{
			printf("%d\n", input);
			break;
		}
	}
	return 0;
}
#include 

int main()
{
	int input;
	do
	{
		scanf("%d", &input);
	}while(input<150 || input>160);
    printf("%d\n", input);
	return 0;
}

练习:

输出以下图形。要求:每次只输出一个字符。

​ *

***

*****

#include 

int main()
{
	int i, j;
	//int spaceCount = 2;
	//int starCount = 1;
	for(i = 0;i < 9;i++)
	{
		for(j = 0;j < 8-i;j++)
		{
			printf(" ");
		}

		for(j = 0;j < 2*i+1;j++)
		{
			printf("*");
		}
	//	starCount+=2;
		printf("\n");
	//	spaceCount--;
	}
	return 0;
}

总结:

循环语句:

不同的循环写法适合表达不同的逻辑。

while 适合表达不以循环次数为条件的循环。

for 适合表达以循环次数为条件的循环。

do-while 校验循环体逻辑执行的结果,不符合预期就循环重来。

循环控制语句:

continue 结束本次循环的循环体。while会直接去判断循环条件;for会直接去执行表达式3

break 结束整个循环。

return 结束当前函数,它并不属于循环的关键字。

2、一维数组(整数类型)

1. 为什么使用数组

一堆变量组合到一起就是数组。

当我们需要很多变量时,我们会定义数组。

2.如何定义

int grade[10];

grade是数组

[10]说明数组里有10个变量,数组里的变量,称为数组的元素。

int说明数组里的10个变量都是int类型。

数组里的变量,类型都是一样的。

定义数组的时候,数组的长度必须是常量!

数组长度必须是确定的!

元素名称:

grade[0] 数组的第一个元素 数组元素[]里的数字,叫数组元素的角标。(也可以叫下标)

grade[1]

grade[2]

grade[9] 数组的最后一个元素 数组最后一个元素的下标,一定是数组的长度-1。

区分: int a[5] 和 a[5] 的区别:

int a[5] : 是在定义数组。 5代表的是,共有 5 个元素。

a[5] : 是数组中第 6 个元素的元素名。

3.如何赋值

数组不能整体赋值,必须是给某个元素单独赋值。

grade[0] = 98;

grade[1] = 77;

grade[2] = 44;

int i;

//使用循环,给数组里的所有元素赋值为88

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

​ grade[i] = 88; //数组元素的角标,可以是变量。

#include 

int main()
{
	int grade[10];
	grade[0] = 1;
	grade[1] = 10;
	int i;
	for(i = 3;i < 10;i++)
	{
		grade[i] = i;
	}
	grade[2] = 250;
	//经常使用循环变量作为数组的角标
	for(i = 0;i < 10;i++)
	{
		printf("%d ", grade[i]);
	}
	printf("\n");
	return 0;
}

4. 初始化问题

定义的时候赋值才叫初始化!只有在给数组初始化的时候才能用{}赋值。

完全初始化: int grade[10] = {1,2,3,4,5,6,7,8,9,10}; 初始化的数据和数组的长度相等。

部分初始化: int a[10] = {1,2}; a[0]=1 a[1]=2 a[2]~a[9] = 0 初始化的数据数量,小于数组的长度,其余的数组 元素补0。

​ int b[10] = {0}; 数组所有元素都初始化0,b[0] = 0 b[1]~b[9]=0 系统补0。

​ int c[10] = {1}; c[0]=1 c[1]~c[9] = 0

默认初始化: int array[] = {1,2,3,4,5,0,0,0}; 数组的长度根据初始化的数据决定。

5.如何遍历

for(i = 0;i < 10;i++)
{
//遍历数组的每个元素,并且打印

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

}

6.类型问题

char a[10];

short b[100];

float c[20];

double x[30];

练习:

请将 1 ~ 100 这 100 个数放在数组里保存起来。

请打印输出第 50 到 第60 个变量中保存的值。

最低等 编译错误

高级一 会崩溃的错误

最高级错误 没有任何线索,就是结果不符合预期

#include 

int main()
{
	int a[100];
	int i;
	for(i = 0;i < 100;i++)
	{
		a[i] = i+1;
	}

	for(i = 49;i < 60;i++)
	{
		printf("a[%d] = %d\n", i, a[i]);
	}
	return 0;
}

练习:

请输入 10 个整数,保存在数组中,然后累加求和。

#include 

int main()
{
	int a[10];
	int i;
	for(i = 0;i < 10;i++)
	{
		scanf("%d", &a[i]);
	}
	int sum = 0;
	for(i = 0;i < 10;i++)
	{
		sum += a[i];
	}
	printf("sum = %d\n", sum);
	return 0;
}

练习:

输入10个考试分数(0~100整数,超出范围重新输入)存到数组中,然后计算最高分、最低分。

#include 

int main()
{
	int a[10];
	int i;
	for(i = 0;i < 10;i++)
	{
		do
		{
			printf("please input %d\n", i);
			scanf("%d", &a[i]);
		}while(a[i]<0 || a[i]>100);
	}

	int max = a[0], min = a[0];
	for(i = 1;i < 10;i++)
	{
		if(max < a[i])
		{
			max = a[i];
		}
		else if(min > a[i])
		{
			min = a[i];
		}
	}
	printf("max = %d min = %d\n", max, min);
	return 0;
}

练习:

上题基础上,请输出最大值和最小值所在位置的下标,并交换最大值和最小值的位置。

12,45,78,9,43,99,32,7,8,23

假设a[5]最大值 a[7]最小值

交换后a[5]=7 a[7]=567

#include 

int main()
{
	int a[10];
	int i;
	for(i = 0;i < 10;i++)
	{
		do
		{
			printf("please input %d\n", i);
			scanf("%d", &a[i]);
		}while(a[i]<0 || a[i]>100);
	}

	//查看输入
	for(i = 0;i < 10;i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");

	int max = a[0], min = a[0];
	int maxIndex = 0, minIndex = 0;
	for(i = 1;i < 10;i++)
	{
		if(max < a[i])
		{
			max = a[i];
			maxIndex = i;//保存当前最大值的角标
		}
		else if(min > a[i])
		{
			min = a[i];
			minIndex = i;//保存当前最小值的角标
		}
	}
	printf("max = %d min = %d\n", max, min);
	printf("maxIndex = %d minIndex = %d\n", maxIndex, minIndex);
	int temp = a[maxIndex];
	a[maxIndex] = a[minIndex];
	a[minIndex] = temp;
	for(i = 0;i < 10;i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

作业1

求 100 - 200 的素数(质数:只能被1和他自己整除的整数)。

作业2

请输出斐波那契数列的前 20 项。

已知前两项:1 1 。 从第三项开始,每一项都是前两项之和。 1 1 2 3 5 8 13 21 34 。。。6765

作业3:(选做,很难,没有思路就不要写,不讲)

求任意两个字符串中的最长子串。

Char a[] = “abcabcdabc”;

Char b[] = “abcdefgh”;

最长”abcd”

你可能感兴趣的:(C语言基础,c语言,开发语言,后端)