循环结构的核心就是为了重复代码
如我现在想 1 +到 100,由于数字很有可能是没有顺序的
因此我们要知道怎么去累加
int sum = 0;
int i = 1;
sum += i;
i++;
sum += i;
i++;
sum += i;
i++;
sum += i;
i++;
sum += i;
i++;
sum += i;
i++;
....
我的代码需要写很长,发现代码都是一样的,我这个时候就想到怎么重复的去使用这些代码
怎么重复使用?
我有一个条件 --- i >= 1 && i <= 100
每加一次,i就递增1,一直到不满足条件就完事了
c语言里面有几种语法来实现循环
1 goto --- 实质不是循环的意思,goto是实现无条件地址跳转
代码是要放在内存里面的,那么指令在运行的时候就会有地址
我就可以指定你去到这个地址上面去执行代码
我们不知道这些指令的地址,那么就通过打标机来进行标记指令
loop://标记
goto loop;//去到这个loop标记的地址上面往下面执行代码
如果是无条件跳转,你就很容易陷入死循环
int a = 1;
int sum = 0;
loop:
//int a; //不能定义 如果goto过来会重复定义 所以不行
sum += i;
i++;
goto loop;
为了防止上面的死循环,我们更多的时候是让goto形成有条件的跳转
if()
{
goto loop;
}
eg:1 +....+ 100
int i = 1;
int sum = 0;
loop:
sum += i;
i++;
if(i <= 100)//只要i不满101 我就要重复执行上面的两句代码
{
goto loop;
}
练习:
1 将100以内所有的奇数累加
i = 1;
i += 2;
2 找出所有的水仙花数(三位数)
//从100开始 到999,将每一个数的个位十位百位取出来
//算他们的立方和 和 本身比较 如果相等就是水仙花数
int i = 100;
int gewei = 0,shiwei = 0,baiwei = 0;
loop:
//取出i的个十百位
gewei = i % 10;
shiwei = i / 10 % 10;
baiwei = i / 100 % 10;
//他们的立方和和自己是不是相等
if(gewei*gewei*gewei + shiwei**shiwei*shiwei + baiwei*baiwei*baiwei == i)
{
printf("%d ",i);
}
i++;
//有条件的跳转
if(i < 1000)
{
goto loop;
}
2.c
goto如果乱用,会导致我们的代码很难得看明白
不是说goto不好用,是使用goto的人乱用了
因此尽量不要乱用goto --- 尽量不要goto穿插使用
慎用goto
if()
{
goto loop3;
}
if()
{
if()
{
goto loop2;
}
else
goto loop1;
}
2 do while:属于循环了,循环就有循环体,循环体要搞清楚在哪里
语法
do->后面只认一条语句,如果你有多条语句要成为循环体,那么请打{}
{
循环体
}while(任何合法的表达式都可以使用);
执行规则,先执行do后面的语句,然后判断while后面的条件,如果为真则执行循环体
为假则退出循环
不管你的条件是什么,反正要先做一遍do
编程的时候建立先打大括号
eg:
1 + .... + 100
int i = 1;
int sum = 0;
do
{
sum += i;
i++;
}while(i < 101);
printf("sum = %d\n",sum);
见3.c
练习:
1 100以内所以偶数的和
2 有一个变量a,你不知道(或者懒得找)它的类型,现在我需要知道这个a里面
有多少个功能被打开了(这个变量a里面有多少个1)
//循环条件是将a所有的bit都过一遍
0 ~ sizeof(a) * 8
int sum = 0;//累加1的个数
int n = 0;//循环a的bit
//a随便定义
int a;
do
{
if(//有条件对sum进行累加 我发现这个bit为1我才累加)
{
sum++;
}
//bit得往前面走
}while(循环所有的bit(0 ~ sizeof(a) * 8(这个数是不能到的)));
见代码4.c
3 while ---- 循环
语法:
while(合法的表达式)
{
循环体;//循环体是代码块,因此是可以定义变量的
}
执行规则:
先来看合法的表达式的值,如果为真则执行循环体,循环体执行了一遍
再来判断表达式的值,为真则继续执行循环体,为假则退出循环
while(1)
{
int a = 0;//每次执行的时候a都是重新定义的
a++;
//
}//到这里执行一遍循环 a就释放了
eg:
1 + ... + 100;
sum = 0
i = 1
while(i <= 100)
{
sum += i;
i++;
}
有如下代码
sum = 0
i = 1
while(i <= 100)
{
int sum1 = 0;
sum1 += i;
i++;
if(i == 100)
{
sum = sum1;
}
}
//sum ==
5.c
作业:
1 上面的练习2(134行)后面多加一句,请提高效率 ---- 这个作为作业,不限定用哪一个循环
#include <stdio.h>
int main()
{
/*
int a = 2;
int sum = -1;
loop:
sum += a;
a +=2;
if(a <= 100)
{
goto loop;
}
printf("%d\n",sum);
*/
/*
int a = 2;
int sum = 0;
do
{
sum += a;
a += 2;
}
while(a < 101);
printf("sum = %d\n",sum);
*/
/*
int sum = 0;
int n = 0;
int a ;
scanf("%d",&a);
do
{
if(a & n << 1)
{
sum++;
}
n++;
}while(n < sizeof(a)*8);
printf("sum = %d",sum);
*/
int a,sum,two;
scanf("%d",&a);
for(two = sizeof(a)*8-1;two >= 0;two--)
{
if(a & 1<<two)
printf("1");
else
{
printf("0");
}
if(!(two%8))
{
printf(" ");
}
}
2 求两个正整数(从键盘输入),求这两个数的最大公约数和最小公倍数
公约数:
a % c == 0 && b % c == 0
我们就说c是a b的公约数
最小公倍数 = a * b / 最大公约数
#include<stdio.h>
int main()
{
int a;
int b;
int c = 0;
printf("输入两个数字\n");
scanf("%d%d",&a,&b);
c = a < b ? a : b;
printf("%d与%d的最大公约数为\n",a,b);
while(a % c || b % c)
{
c--;
}
printf("%d\n",c);
printf("他们俩的最小公倍数为%d\n",a*b/c);
}
辗转 相除
#include<stdio.h>
int main()
{
int a;
int b;
int c;
int d;
int e;
printf("输入两个数字\n");
scanf("%d%d",&a,&b);
printf("%d与%d的最大公约数为\n",a,b);
c = a;
d = b;
while(d)
{
e = c % d;
c = d ;
d = e;
}
printf("%d\n",c);
printf("他们俩的最小公倍数为\n%d\n",a*b/c);
}