复习
条件运算符
表达式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 <stdio.h>
int main()
{
	int input;
	while(1)
	{
		scanf("%d", &input);
		if(input == 0)
		{
			break;
		}
		printf("%d\n", input);
	}
	return 0;
}
 
作业
输出以下图形.要求:每次只输出一个字符。
*****
#include <stdio.h>
int main()
{
	int i;
	//循环变量习惯从0开始
	//我们一定要清楚代码执行的流程,千万不要想当然
	for(i = 0;i < 5;i++)
	{
		printf("*");
	}
	//循环走完的时候,已经打印了5个*
	printf("\n");
	return 0;
}
 
作业
输出以下图形。要求:每次只输出一个字符。
*****
*****
*****
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h> 
int main()
{
	int i=1; 
	do
	{
		printf("%d",i);
		i++;
	}while(i<=5);
	return 0;
}
 
练习:
1 ~ 100 之间求和。使用 do-while 完成。
#include <stdio.h>
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 <stdio.h>
int main()
{
	while(1)
	{
		int input;
		scanf("%d", &input);
		if(input>=150 && input<=160)
		{
			printf("%d\n", input);
			break;
		}
	}
	return 0;
}
 
#include <stdio.h>
int main()
{
	int input;
	do
	{
		scanf("%d", &input);
	}while(input<150 || input>160);
    printf("%d\n", input);
	return 0;
}
 
练习:
输出以下图形。要求:每次只输出一个字符。
 *
***
*****
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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”










