目录
一、循环结构
循环可反复进行操作,非常方便,例如求1~1000的值、遍历数组等等,需要注意:1.循环变量的初始化 2. 循环结束条件 3. 循环变量的自加自减 ,常用循环语句:for() 、while() 、do{}while()
1.1 while循环
练习1: 问题: 求出 1+2+3+4+5+6+....+100的和
练习2: 用while循环 输出从1-1000内能整除3 或 整除5的数字,能够整除任意一个都算满足条件
1.2 for循环
练习3:用for循环 求出 1+2+3+4+5+6+....+100的和
练习4: 用for循环 输出从1-1000内能整除3 或 整除5的数字,能够整除任意一个都算满足条件
1.3 do-while循环
练习同上,不过是使用do-while循环来求1~100的值;1~1000内整除3但不能整除5的数
while和do-while有什么区别
while循环,先进行条件判断,再决定是否进入循环体;while可能一次也不进入
do-while,先进入一次循环体,再进行条件判断,循环是否继续运行;循环至少循环一次,
1.4 循环嵌套
凡是循环语句都可以复合进行嵌套
练习7:用for循环嵌套 实现输出如下图型, 要求1次只能输出一个 "#" printf("#");
//外循环次数控制行数,内循环的次数控制列数 3行5列的#
练习8: 用for循环嵌套 实现输出如下图型, 要求1次只能输出一个 "*" printf("*");
(1)确定行数,控制外循环的次数 (2)找到关系式 ,内循环控制个数
1.5 死循环
当我们不知道循环次数时,但又必须要使用循环,所以只要设定结束条件,让程序停下来,如果没有满足刹车条件,程序就会一直进行。
例如:for(;;) while(1)
1.5.1 break 关键字
break 作用:跳出一个循环体 结束switch体和循环体(for,while,do-while循环)
练习9:求和 1+2+3+4+5+6+....+100 ,如果只加到5 (1+2+3+4+5)停止
1.5.1 continue 关键字
continue 关键字作用:结束本次循环 或 结束一次循环
练习10:求和 1+2+3+4+5+6+....+100 ,如果跳过10?
练习11:用while写一个死循环,实现用户输入一个数字后,立刻打印输出该数字,直到输入为0时为止,结束程序
1.6 练习编程
练习12:打印输出100-999之间的所有水仙花数,水仙花数需要满足下面条件
例如 153就是水仙花数 满足条件 153 == 1*1*1 + 5*5*5 + 3*3*3
方法1:
方法2:
练习13:编写一个程序,输出1-100的全部素数(除了1和自己,不能被任何数整除的数)
2 3 5 7 11 13 17 19 ....
练习14:输出N层三角形阵,层数由用户输入(输出满足下面规律的三角形阵)
二、一维数组
数组:一次性定义多个变量 也可看做同一类型的集合 。数组定义:类型 数组名[个数]
2.1 数组初始化
数组元素下标是从0开始,循环赋值
(1)完全初始化,所有的元素,都会赋值
(2)部分初始化(没赋值的元素默认为0)
注意事项:
练习15:键盘输入5个学生成绩,然后打印输出和与平均值
练习16:输出Fibonacci数列前20项, 先正序输出,然后逆序输出。斐波那契数列 (前两项的和等于第三项 )
#include <stdio.h>
int main()
{
int i;
int a[20] = {1,1};//让a[0]和a[1]初始化为1,其他为0
//形成斐波那契数列
for(i = 2; i < 20; i++)//i从2开始,是因为下标为2代表第3个,往后开始满足规律
{
a[i] = a[i-1] + a[i-2];
}
//用个for循环 正序打印
for(i = 0; i < 20; i++)
{
printf("%d ",a[i]);
}
printf("\n");
//用个for循环,倒序打印
for(i = 19; i >= 0; i--)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
2.2 冒泡排序
原理:每次两个数进行比较,从数组的前两个元素开始,如果前面的数 > 后面的数,就交换第一趟会求出一个最大值,并且放在最后面,然后 依此类推,经过最多N-1趟,排好序
练习17:使用冒泡排序将数组a[6]={12,5,34,234,34,23}按增序排列
#include <stdio.h>
int main()
{
int i,j;
//规律 假设数组的元素个数为n,那么
//外循环的结束条件是 i < n-1;
//内循环的结束条件是 j < n-1-i;
int a[6] = {12,5,34,234,34,23};
//循环遍历数组打印
for(i = 0; i < 6; i++)
{
printf("%d ",a[i]);
}
printf("\n");
//实现对数组进行冒泡排序
for(i = 0; i < 6-1; i++)
{
for(j = 0; j < 6-1-i; j++)
{
//j = 0 1 2 3 4
//j+1 = 1 2 3 4 5
if(a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//循环遍历数组打印
for(i = 0; i < 6; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
练习19:完数(因子不包含自己)的和等于它本身 6 1*6 2*3 1+2+3 == 6 打印输出1-1000之间的完数
#include <stdio.h>
int main()
{
int i,j;
int sum;
//此for循环来代表1-100之间的每一个数
for(i = 1; i <= 1000; i++)
{
sum = 0;//在对每个数判断之前,都要先将sum清零
//对每一个数进行找到它的所有因子,将1-前一个数,都%一遍
for(j = 1; j < i; j++)
{
if(i % j == 0)//说明j是因子
{
sum += j;
}
}
//上面的循环结束后,得到了这个数的所有的因子的和
if(sum == i)
{
printf("%d\n",sum);//sum is 6
}
}
return 0;
}
三、字符串
字符串由多个单个字符组成并且由'\0'结尾 ,任何字符串必须以'\0'结尾 不以'\0'结尾也不叫字符串
3.1 字符串输出
字符用char 类型变量保存,那么字符串就用char数组来保存
3.2 字符串拷贝
对于字符数组来说,字符串拷贝就是把数组赋值给另一个字符数组
3.3 字符串函数讲解
strlen strcpy strcat
练习20:围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须先找到我,我就藏身于这十个洞中的某个洞。你从1号洞找,下次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,再隔3个…以后在这个圆圈中如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。问:兔子可能在哪个洞里?
#include <stdio.h>
int main()
{
int a[10] = { 0 };
int i;
int j = 0;//j是数组的下标,j代表的是狐狸入洞的洞号对应的下标
//循环次数代表找了1000次
for(i = 0; i < 1000; i++)
{
a[j] = 1;//代表狐狸去过这个洞
j = (i+j+2) % 10;//计算出下一次狐狸要去的洞号对应的数组下标 % 10循环
}
//用循环遍历每一个元素,只要保持0不变就是没去过的洞
for(i = 0; i < 10; i++)
{
if(a[i] == 0)
{
printf("%d ",i+1);//i下标 下标 + 1 == 洞号
}
}
printf("\n");
return 0;
}
练习21:消除一句话中所有的元音字母,例如:a[] = "I am a student!"
#include <stdio.h>
int main()
{
char a[] = "I aaam a Student!!";
char b[] = "aeiouAEIOU";
int i,j,k;
printf("%s\n",a);
//遍历字符串
for(i = 0; a[i] != '\0'; i++)
{
//k 用来遍历b数组
for(k = 0; b[k] != '\0'; k++)
{
if(a[i] == b[k])//只要出现a[i] == b[k]说明a[i]是元音,没必要继续往下和b[k]比较,所以break
{
break;
}
}
if(b[k] != '\0')//证明上面的循环,是提前结束了,执行过break,说明a[i]是元音
{
//进入这个条件,证明当前的a[i]是原因字母,需要进行a[i]之后的元素整体向前移动一个位置
for(j = i; a[j] != '\0'; j++)
{
a[j] = a[j+1];//逐个向前移动覆盖删除
}
//为了解决连续两次出现元音字母的bug
i--;//删除一个元音字母后,后面的元音字母会向前移动一个位置,需要继续对原来删除的位置,再次判断
}
}
printf("%s\n",a);
return 0;
}
总结
- 今天主要讲述了C语言的循环结构、数组和字符串函数。其中对while() for() do{}while(); 循环结合break continue关键字进行了详细的讲解,并且进行了相关的代码编程练习;对一维数组有了一个基本的认识,存储、长度、起始位置和定义规则进行了细致的表述;对字符串函数进行了讲解,加深了对ASCII的理解、操作能力。