C語言循環(huán)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h> // 包含數(shù)學(xué)計(jì)算常用函數(shù)的頭文件
#include <stdbool.h> // stdbool.h頭文件將bool作為_Bool類型的別名,定義了true/false常量,兼容c++
#include <string.h>
void show_$(int rows, int columns); // 函數(shù)原型,C語言書寫規(guī)范為先聲明函數(shù)原型,再寫main()函數(shù),在main()函數(shù)之后定義聲明的函數(shù),函數(shù)原型用于在main()函數(shù)中調(diào)用函數(shù)時告訴編譯器函數(shù)的返回值和參數(shù)
long square(int n);
void show_$2(void);
double func1(double d1, double d2);
int main(void)
{
int a = -5;
while (a) // whilt()判定的條件為真(非0)時執(zhí)行循環(huán),當(dāng)條件為假(0)時結(jié)束循環(huán),關(guān)系表達(dá)式3>2的值為true即1,而3<2的值為false即0,所以也可以用一個值而不是一個關(guān)系表達(dá)式來作為判定的條件
{
????a++;
????printf("a");
}
while (++a < 3)
????printf("\n循環(huán)內(nèi)只寫一條語句可以省略括號");
while (++a < 5); // 測試條件之后直接跟分號,單獨(dú)分號不寫表達(dá)式是空語句,程序在空語句上不會執(zhí)行任何事情,所以會進(jìn)行下一輪判定,不斷判定直到false
printf("\n%d\n", a);
; // 單獨(dú)寫一個分號是空語句
while (scanf("%d", &a) == 1) // 清理輸入隊(duì)列,假設(shè)想跳過輸入中所有的空白符號及整數(shù),利用scanf讀取到整數(shù)會返回1作為條件一直循環(huán)到讀取到非數(shù)字字符并放回輸入隊(duì)列,這時輸入隊(duì)列中的開頭字符一定不是數(shù)字了
????; // 將空語句和while分兩行顯示,增加可讀性,當(dāng)條件true執(zhí)行空語句直到條件false
scanf("%*s"); //跳過放回輸入隊(duì)列的非數(shù)字字符
printf("%f\n", pow(2.0, 3.0)); // pow(f1,f2)求冪運(yùn)算,參數(shù)和返回值都是double,返回f1的f2次冪
printf("%f\n", fabs(-1.0)); // fabs(double)求絕對值,參數(shù)和返回值是double
//while (true); //要使用true表示布爾值需要預(yù)處理包含stdbool.h頭文件,true值為1,false值為0
char ch[26]; // 聲明一個有26個char元素的char數(shù)組
for (int i = 0; i < 26; i++) //for循環(huán)格式:for(初始化語句;測試條件;更新/迭代){語句},for循環(huán)和while循環(huán)都是入口條件循環(huán),即先測試條件,為真再執(zhí)行循環(huán)
{
????ch[i] = 'a' + i; // 數(shù)組ch有26個元素,用[0]至[25]指代首個至最后一個元素,通過26次循環(huán)將a-z賦值給ch[0]到ch[25]
}
for (int i = 0; i < 26; i++)
{
????printf("%c", ch[i]); // 遍歷數(shù)組
}
printf("\n"); // 這時數(shù)組ch并不是字符串,因?yàn)槟┪瞔h[25]是字符'z'而不是空字符'\0'
ch[25] = '\0'; // 將數(shù)組末尾改為空字符,變成了存儲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循環(huán),出口條件循環(huán),先執(zhí)行循環(huán),再測試條件,所以至少會執(zhí)行一次循環(huán)中的語句
double d1, d2;
printf("輸入兩個浮點(diǎn)數(shù):");
while (scanf("%lf%lf", &d1, &d2)==2) //在一次scanf()函數(shù)中讀取兩個浮點(diǎn)數(shù),如果用戶輸入了一個值,scanf會繼續(xù)等待用戶輸入第二個值,只有輸入兩個數(shù)字或者輸入非數(shù)字非空白字符才可以結(jié)束scanf(),正確讀取兩個浮點(diǎn)數(shù)會返回2,用來判斷合法輸入
{
????printf("%.2f\n", func1(d1, d2));
}
printf("%d", scanf("%*s")); //跳過非數(shù)字字符,由于沒有賦值,雖然讀取到了字符,scanf()依然返回0
printf("Enter lower an upper integer limits:");
for (int a1 = 0, a2 = 0;scanf("%d%d", &a1, &a2), a1 < a2;) // for循環(huán)()括號內(nèi)的每部分語句可以用逗號分成多個表達(dá)式,int a1=0,a2=0聲明及初始化兩個變量,而scanf()語句和a1<a2是從左到右逐句執(zhí)行的,逗號是序列點(diǎn),運(yùn)行到逗號時會完成前面語句的執(zhí)行,所以會先讀取新的輸入給a1、a2再比較,而逗號表達(dá)式的值為最右側(cè)項(xiàng)的值,即對于逗號表達(dá)式scanf(),a1<a2 來說,無論scanf()返回什么值,逗號表達(dá)式的值都是最右側(cè)a1<a2條件表達(dá)式的值,for循環(huán)()括號中每一部分都可以省略,寫成for(;;)表示沒有初始化,沒有迭代因子,測試條件為true無限循環(huán)
{
????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和表達(dá)式sum=sum+(a1*a1)等價,+= -= *= /= %=優(yōu)先級和賦值運(yùn)算符=相同,所以等號右側(cè)的表達(dá)式計(jì)算完才會執(zhí)行+=,比如sum%=1+2*3/4-5相當(dāng)于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++) // 嵌套循環(huán),外側(cè)循環(huán)負(fù)責(zé)打印一行并換行
{
????for (int j = 0; j < columns; j++) // 內(nèi)側(cè)循環(huán)負(fù)責(zé)打印一行中每列的內(nèi)容,每次外側(cè)循環(huán)迭代1次,內(nèi)側(cè)循環(huán)都會完整執(zhí)行
????{
????????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");
}
//結(jié)果為
// $
// $$
// $$$
// $$$$
// $$$$$
}
double func1(double d1, double d2) {
return (d1 - d2) / d1 / d2;
}
void func2(void) { //單利與復(fù)利的比較
const double TEX1 = 0.1; //單利,每年固定漲10%,每年利息一樣
const double TEX2 = 0.05; //復(fù)利,每年利息是上一年本息和的5%
const double START = 100.0; //本金100
int year = 0;
double money1 = START, money2 = START; //第0年單利和復(fù)利都是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++) //初始化對三個變量進(jìn)行,直到復(fù)利本息和大于單利之前循環(huán),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年時復(fù)利超過單利
}