该笔记含有图片,欲获取原文请访问github主页:c-c-NOTE/4循环控制结构.md
*该系列是《c语言程序设计》教材的学习笔记
- goto:语句和if语句构成循环
- while(){}
- do {} while() 先执行一次再判断条件
- for语句
例子
- goto
goto语句不能用break语句和continue语句进行控制
void main()
{
int i, sum = 0;
i=1
loop:if (i <= 100)
{
sum = sum + i;
i++; //计数
goto loop; //回到if那一行,达成循环
}
printf("%d\n", sum);
system("pause");
}
- while
void main()
{
int i, sum = 0;
i = 1
while (i <= 100)
{
sum = sum + i;
i++; //计数
}
printf("%d\n", sum);
system("pause");
}
统计从键盘输入一行字符的个数
void main()
{
int n = 0;
printf("type in a string:\n");
while (getchar() != '\n')
{
n++;
}
printf("total num of string==%d \n", n);
system("pause");
}
只要控制式的值为真即可循环
//打印n个正偶数:0,2,4,6,8...
void main() {
int a = 0, n;
printf("\n input n:");
scanf("%d", &n);
while (n--)
{
printf("%d", a++ * 2); //相当于a*2,然后a++
}
}
- do while
do
{
sum=sum+i;
i++;
} while (i<=100);
- for
for (循环变量赋初值;循环条件;循环变量增量)
分号不能缺省,但表达式1、2、3可以缺省
[图片上传失败...(image-120851-1548092557191)]
void main() {
int sum = 0, i;
for (i = 1; i <= 100; i++)
{
sum = sum + i;
}
printf("%d\n", sum);
system("pause");
}
可以用逗号隔开多个赋值和i增量
for (i = 0, sum = 0; i < 100,j>10; i++, j--) {
}
- 输出以下图形
*
**
***
****
*****
******
//#include
//strcat(a,b); //连接两个字符串,连接后的字符串存放在a中,数组a中有足够空间
#include
void main() {
int i;
char a[10] = "*";
char b[] = "*";
printf("initial=%s\n", a);
for (i = 1; i <= 6; i++)
{
printf("%s\n", a);
strcat(a, b);
}
system("pause");
}
/*解法2*/
void main() {
int i,j;
char a = '*';
for (i = 1; i <= 6; i++)
{
for (j = 1; j <= i; j++)
{
printf("%c", a); //putchar('*');
}
printf("\n"); //打印段落
}
system("pause");
}
- 题目:有1234这四个数字,能组成多少互不相同且无重复数字的三位数?都是多少?
remark:嵌套的循环是从最内部的循环开始计算的。但是是从最外部的控制式开始判断是否开始循环的。
void main() {
int a, b, c;
for (a = 1; a <= 4; a++)
{
for (b = 1; b <= 4; b++)
{
if (b == a) continue; //结束本次循环重新判断
for (c = 1; c <= 4; c++)
{
if (c == a || c == b) continue;
printf("%d,%d,%d\n", a, b, c);
}
}
}
system("pause");
}
//解法2
void main() {
int a, b, c;
for (a = 1; a <= 4; a++)
{
for (b = 1; b <= 4; b++)
{
for (c = 1; c <= 4; c++)
{
if (a != b && b != c && c != a)
printf("%d%d%d\n", a, b, c);
}
}
}
system("pause");
}
break和continue
remark:
- break语句只在循环语句和switch中有用
- 多层循环中,一个break语句只向外跳一层;只跳出当前的if
void main() {
float area;
int r;
for (r = 1; r <= 10; r++)
{
area = 3.14159*r*r;
if (area > 100) break;
printf("r=%d,area=%f\n", r, area);
}
system("pause");
}
- 例子
#include //getch和putch函数的头文件
void main() {
int i = 0;
char c;
while (1) {
c = '\0';
while (c != 13 && c != 27)
//键盘接受字符并打印,直到按回车或esc.esc的ASCII码为27
{
c = getch();
printf("%c\n", c);
}
if (c == 27) break; //判断若按esc则退出第一个while循环
i++;
printf("the no. is %d\n", i); //打印本循环进行了多少次
}
printf("the end");
system("pause");
}
- 显示输入的字符,如果按esc则退出循环显示“the end”;如果按enter则不作任何处理,继续输入下一个字符
#include //getch和putch函数的头文件
void main() {
char ch;
for (;;) { //while(1)
ch = getch(); //字符输入函数
if (ch == 27) break;
if (ch == 13) continue;
putch(ch); //显示输入的字符
}
getch(); //让程序停一下,拍任何键继续
system("pause");
}
- 把100~200之间不能被3整除的数输出
void main() {
int a = 99;
while (a < 200) {
a++;
if (a % 3 == 0) continue;
printf("%d\n", a);
}
system("pause");
}
- 求pi的近似值:
pi/4=1-1/3+1/5-1/7+...
分子1正负切换,分母是奇数列
#include
void main() {
int i;
long float pi = 0, x;
for (i = 0;; i++)
{
x = pow(-1, i) / (2 * i + 1); //pow(a,b)==a^b
pi = pi + x;
if (fabs(x) < 1e-6) break; //计算float的绝对值。abs是计算int的绝对值
}
printf("%10.6f\n", 4 * pi); //小数点后6位算的很快,7位要等一秒,8位要等更久
system("pause");
}
//解法2
int i;
long float pi = 0, x;
float k = 1; //k最好是float,不然k=1、i=0都是int算出来得x=0。
for (i = 0;; i++)
{
x = k / (2 * i + 1); //pow(a,b)==a^b
k = -k ;
pi = pi + x;
if (fabs(x) < 1e-6) break;
}
- 求Fibonacci数列前40个数。
x1=1
x2=1
x[n]=x[n-1]+x[n-2],n>2
void main() {
int x, i;
int a = 1, b = 1;
printf("x[1]=1\nx[2]=1\n");
for (i = 3; i < 41; i++)
{
x = a + b;
a = b;
b = x;
}
printf("x[%d]=%d\n", i, x);
system("pause");
}
- 求Fibonacci数列第n个数F[n](n>3)
void main() {
int x, i, num, a, b;
for (;;)
{
printf("\n input a number(>2):");
scanf("%d", &num);
getchar();
a = 1, b = 1;
for (i = 3; ; i++)
{
x = a + b;
a = b;
b = x;
if (i == num)
{
break;
}
}
printf("\t F[%d]=%d\n", i, x);
printf("\t press enter to continue or press ESC to exit:");
if (getch() == 27) break;
}
system("pause");
}
- 判断x是否是质数
void main() {
int x, i;
for (;;)
{
printf("\ninput a integer:");
scanf("%d", &x);
getchar();
if (2 == x) printf("yes the smallest prime\n");
for (i = 2;; i++)
{
if (i > sqrt(x)) {
printf("yes, this is a prime\n");
break;
}
if (x % i == 0) {
printf("no, this is not prime\n");
break;
}
}
printf("\t press enter to continue or press ESC to exit:\n");
if (getch() == 27) break;
}
system("pause");
}
//改进版本
void main() {
int x, i, r;
for (;;)
{
printf("\ninput a integer:");
scanf("%d", &x);
getchar();
if (2 == x) printf("yes the smallest prime\n");
for (i = 2; i <= sqrt(x); i++)
{
if (x % i == 0) break;
}
if (i > sqrt(x)) printf("yes, this is a prime\n");
else printf("no, this is not prime\n");
printf("\t press enter to continue or press ESC to exit:\n");
if (getch() == 27) break;
}
system("pause");
}
- decifer密码:按以下规律将字母A-->E,a-->e,所有字符后移4位+4。