C语言循环
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h> // 包含数学计算常用函数的头文件
#include <stdbool.h> // stdbool.h头文件将bool作为_Bool类型的别名,定义了true/false常量,兼容c++
#include <string.h>
void show_$(int rows, int columns); // 函数原型,C语言书写规范为先声明函数原型,再写main()函数,在main()函数之后定义声明的函数,函数原型用于在main()函数中调用函数时告诉编译器函数的返回值和参数
long square(int n);
void show_$2(void);
double func1(double d1, double d2);
int main(void)
{
int a = -5;
while (a) // whilt()判定的条件为真(非0)时执行循环,当条件为假(0)时结束循环,关系表达式3>2的值为true即1,而3<2的值为false即0,所以也可以用一个值而不是一个关系表达式来作为判定的条件
{
a++;
printf("a");
}
while (++a < 3)
printf("\n循环内只写一条语句可以省略括号");
while (++a < 5); // 测试条件之后直接跟分号,单独分号不写表达式是空语句,程序在空语句上不会执行任何事情,所以会进行下一轮判定,不断判定直到false
printf("\n%d\n", a);
; // 单独写一个分号是空语句
while (scanf("%d", &a) == 1) // 清理输入队列,假设想跳过输入中所有的空白符号及整数,利用scanf读取到整数会返回1作为条件一直循环到读取到非数字字符并放回输入队列,这时输入队列中的开头字符一定不是数字了
; // 将空语句和while分两行显示,增加可读性,当条件true执行空语句直到条件false
scanf("%*s"); //跳过放回输入队列的非数字字符
printf("%f\n", pow(2.0, 3.0)); // pow(f1,f2)求幂运算,参数和返回值都是double,返回f1的f2次幂
printf("%f\n", fabs(-1.0)); // fabs(double)求绝对值,参数和返回值是double
//while (true); //要使用true表示布尔值需要预处理包含stdbool.h头文件,true值为1,false值为0
char ch[26]; // 声明一个有26个char元素的char数组
for (int i = 0; i < 26; i++) //for循环格式:for(初始化语句;测试条件;更新/迭代){语句},for循环和while循环都是入口条件循环,即先测试条件,为真再执行循环
{
ch[i] = 'a' + i; // 数组ch有26个元素,用[0]至[25]指代首个至最后一个元素,通过26次循环将a-z赋值给ch[0]到ch[25]
}
for (int i = 0; i < 26; i++)
{
printf("%c", ch[i]); // 遍历数组
}
printf("\n"); // 这时数组ch并不是字符串,因为末尾ch[25]是字符'z'而不是空字符'\0'
ch[25] = '\0'; // 将数组末尾改为空字符,变成了存储a-y的字符串
printf("%s\t%zd\n", ch, strlen(ch)); // 字符串长度为25,不包含末尾的空字符
int start = 5;
int end = 9;
do
{
printf("%5d %5d %5d\n", start, start * start, start * start * start);
} while (start++ < end); // do-while循环,出口条件循环,先执行循环,再测试条件,所以至少会执行一次循环中的语句
double d1, d2;
printf("输入两个浮点数:");
while (scanf("%lf%lf", &d1, &d2)==2) //在一次scanf()函数中读取两个浮点数,如果用户输入了一个值,scanf会继续等待用户输入第二个值,只有输入两个数字或者输入非数字非空白字符才可以结束scanf(),正确读取两个浮点数会返回2,用来判断合法输入
{
printf("%.2f\n", func1(d1, d2));
}
printf("%d", scanf("%*s")); //跳过非数字字符,由于没有赋值,虽然读取到了字符,scanf()依然返回0
printf("Enter lower an upper integer limits:");
for (int a1 = 0, a2 = 0;scanf("%d%d", &a1, &a2), a1 < a2;) // for循环()括号内的每部分语句可以用逗号分成多个表达式,int a1=0,a2=0声明及初始化两个变量,而scanf()语句和a1<a2是从左到右逐句执行的,逗号是序列点,运行到逗号时会完成前面语句的执行,所以会先读取新的输入给a1、a2再比较,而逗号表达式的值为最右侧项的值,即对于逗号表达式scanf(),a1<a2 来说,无论scanf()返回什么值,逗号表达式的值都是最右侧a1<a2条件表达式的值,for循环()括号中每一部分都可以省略,写成for(;;)表示没有初始化,没有迭代因子,测试条件为true无限循环
{
printf("The sums of the squares form %d to %d is ", a1 * a1, a2 * a2);
int sum = a1 * a1;
while (++a1<=a2)
{
sum += a1 * a1; //sum+=a1*a1和表达式sum=sum+(a1*a1)等价,+= -= *= /= %=优先级和赋值运算符=相同,所以等号右侧的表达式计算完才会执行+=,比如sum%=1+2*3/4-5相当于sum=sum%(1+2*3/4-5)
} // sum+=a1*a1比 sum=sum+a1*a1更高效
printf("%d\n", sum);
printf("Enter lower an upper integer limits:");
}
return 0;
}
void show_$(int rows, int columns) {
for (int i = 0; i < rows; i++) // 嵌套循环,外侧循环负责打印一行并换行
{
for (int j = 0; j < columns; j++) // 内侧循环负责打印一行中每列的内容,每次外侧循环迭代1次,内侧循环都会完整执行
{
printf("$ ");
}
printf("\n");
}
}
long square(int n) {
return (long)n * (long)n;
}
void show_$2(void) {
for (int i = 0; i < 5; i++)
{
for (int j = 0; j <= i; j++)
{
printf("$");
}
printf("\n");
}
//结果为
// $
// $$
// $$$
// $$$$
// $$$$$
}
double func1(double d1, double d2) {
return (d1 - d2) / d1 / d2;
}
void func2(void) { //单利与复利的比较
const double TEX1 = 0.1; //单利,每年固定涨10%,每年利息一样
const double TEX2 = 0.05; //复利,每年利息是上一年本息和的5%
const double START = 100.0; //本金100
int year = 0;
double money1 = START, money2 = START; //第0年单利和复利都是100
printf("year %2d: %5.2f %5.2f\n", year, money1, money2);
for (money1 += START * TEX1, money2 *= 1 + TEX2, year++; money1 > money2; money1 += START * TEX1, money2 *= 1 + TEX2, year++) //初始化对三个变量进行,直到复利本息和大于单利之前循环,money1+=固定利息,money2*=105%每年是上一年的1.05倍
{
printf("year %2d: %5.2f %5.2f\n", year, money1, money2);
}
printf("year %2d: %5.2f %5.2f\n", year, money1, money2); //第27年时复利超过单利
}