08-C語言流程控制-指趣學(xué)院

流程控制基本概念

  • 默認(rèn)情況下程序運(yùn)行后渣窜,系統(tǒng)會按書寫順序從上至下依次執(zhí)行程序中的每一行代碼率挣。但是這并不能滿足我們所有的開發(fā)需求, 為了方便我們控制程序的運(yùn)行流程辉饱,C語言提供3種流程控制結(jié)構(gòu)眨八,不同的流程控制結(jié)構(gòu)可以實(shí)現(xiàn)不同的運(yùn)行流程蜻韭。

  • 這3種流程結(jié)構(gòu)分別是順序結(jié)構(gòu)得院、選擇結(jié)構(gòu)傻铣、循環(huán)結(jié)構(gòu)

  • 順序結(jié)構(gòu):

    • 按書寫順序從上至下依次執(zhí)行
  • 選擇結(jié)構(gòu)

    • 對給定的條件進(jìn)行判斷,再根據(jù)判斷結(jié)果來決定執(zhí)行代碼
  • 循環(huán)結(jié)構(gòu)

    • 在給定條件成立的情況下祥绞,反復(fù)執(zhí)行某一段代碼

選擇結(jié)構(gòu)

  • C語言中提供了兩大選擇結(jié)構(gòu), 分別是if和switch

選擇結(jié)構(gòu)if

  • if第一種形式
    • 表示如果表達(dá)式為真,執(zhí)行語句塊1,否則不執(zhí)行
if(表達(dá)式) {
  語句塊1;
}
后續(xù)語句;
if(age >= 18) {
  printf("開網(wǎng)卡\n");
}
printf("買煙\n");
  • if第二種形式
    • 如果表達(dá)式為真,則執(zhí)行語句塊1,否則執(zhí)行語句塊2
    • else不能脫離if單獨(dú)使用
if(表達(dá)式){
  語句塊1;
}else{
  語句塊2;
}
后續(xù)語句;
if(age > 18){
  printf("開網(wǎng)卡\n");
}else{
  printf("喊家長來開\n");
}
printf("買煙\n");
  • if第三種形式
    • 如果"表達(dá)式1"為真,則執(zhí)行"語句塊1",否則判斷"表達(dá)式2",如果為真執(zhí)行"語句塊2",否則再判斷"表達(dá)式3",如果真執(zhí)行"語句塊3", 當(dāng)表達(dá)式1非洲、2、3都不滿足,會執(zhí)行最后一個(gè)else語句
    • 眾多大括號中,只有一個(gè)大括號中的內(nèi)容會被執(zhí)行
    • 只有前面所有添加都不滿足, 才會執(zhí)行else大括號中的內(nèi)容
if(表達(dá)式1) {
  語句塊1;
}else if(表達(dá)式2){
  語句塊2;
}else if(表達(dá)式3){
  語句塊3;
}else{
  語句塊4;
}
后續(xù)語句;
if(age>40){
  printf("給房卡");
}else if(age>25){
  printf("給名片");
}else if(age>18){
   printf("給網(wǎng)卡");
}else{
  printf("給好人卡");
}
printf("買煙\n");
  • if嵌套
    • if中可以繼續(xù)嵌套if, else中也可以繼續(xù)嵌套if
if(表達(dá)式1){
    語句塊1;
   if(表達(dá)式2){
      語句塊2;
  }
}else{
   if(表達(dá)式3){
      語句塊3;
  }else{
      語句塊4;
  }
}

  • if注意點(diǎn)
    • 任何數(shù)值都有真假性
#include <stdio.h>
int main(){
    if(0){
        printf("執(zhí)行了if");
    }else{
        printf("執(zhí)行了else"); // 被執(zhí)行
    }
}
    • 當(dāng)if else后面只有一條語句時(shí), if else后面的大括號可以省略
    // 極其不推薦寫法
    int age = 17;
    if (age >= 18)
        printf("開網(wǎng)卡\n");
    else
        printf("喊家長來開\n");
    • 當(dāng)if else后面的大括號被省略時(shí), else會自動和距離最近的一個(gè)if匹配
#include <stdio.h>
int main(){
    if(0)
    if(1)
    printf("A\n");
    else // 和if(1)匹配
    printf("B\n");
    else // 和if(0)匹配, 因?yàn)閕f(1)已經(jīng)被匹配過了
    if (1)
    printf("C\n"); // 輸出C
    else // 和if(1)匹配
    printf("D\n");
}
    • 如果if else省略了大括號, 那么后面不能定義變量
#include <stdio.h>
int main(){
    if(1)
        int number = 10; // 系統(tǒng)會報(bào)錯
    printf("number = %i\n", number);
}
#include <stdio.h>
int main(){
    if(0){
        int number = 10; 
    }else
        int value = 20; // 系統(tǒng)會報(bào)錯
    printf("value = %i\n", value);
}
    • C語言中分號(;)也是一條語句, 稱之為空語句
// 因?yàn)閕f(10 > 2)后面有一個(gè)分號, 所以系統(tǒng)會認(rèn)為if省略了大括號
// if省略大括號時(shí)只能管控緊隨其后的那條語句, 所以只能管控分號
if(10 > 2);
{
printf("10 > 2");
}
// 輸出結(jié)果: 10 > 2
    • 但凡遇到比較一個(gè)變量等于或者不等于某一個(gè)常量的時(shí)候蜕径,把常量寫在前面
#include <stdio.h>
int main(){
    int a = 8;
//    if(a = 10){// 錯誤寫法, 但不會報(bào)錯
    if (10 == a){
      printf("a的值是10\n");
    }else{
     printf("a的值不是10\n");
    }
}

  • if練習(xí)

    • 從鍵盤輸入一個(gè)整數(shù)两踏,判斷其是否是偶數(shù),如果是偶數(shù)就輸出YES兜喻,否則輸出NO梦染;
    • 接收用戶輸入的1~7的整數(shù),根據(jù)用戶輸入的整數(shù)朴皆,輸出對應(yīng)的星期幾
    • 接收用戶輸入的一個(gè)整數(shù)month代表月份帕识,根據(jù)月份輸出對應(yīng)的季節(jié)
    • 接收用戶輸入的兩個(gè)整數(shù),判斷大小后輸出較大的那個(gè)數(shù)
    • 接收用戶輸入的三個(gè)整數(shù)遂铡,判斷大小后輸出較大的那個(gè)數(shù)
    • 接收用戶輸入的三個(gè)整數(shù)肮疗,排序后輸出
  • 實(shí)現(xiàn)石頭剪刀布

剪刀石頭布游戲:
1)定義游戲規(guī)則
  剪刀 干掉 布
  石頭 干掉 剪刀
  布 干掉石頭
2)顯示玩家開始猜拳
3)接收玩家輸入的內(nèi)容
4)讓電腦隨機(jī)產(chǎn)生一種拳
5)判斷比較
(1)玩家贏的情況(顯示玩家贏了)
(2)電腦贏的情況(顯示電腦贏了)
(3)平局(顯示平局)

選擇結(jié)構(gòu)switch

  • 由于 if else if 還是不夠簡潔,所以switch 就應(yīng)運(yùn)而生了扒接,他跟 if else if 互為補(bǔ)充關(guān)系伪货。switch 提供了點(diǎn)的多路選擇
  • 格式:
switch(表達(dá)式){
    case 常量表達(dá)式1:
        語句1;
        break;
    case 常量表達(dá)式2:
        語句2; 
        break;
    case 常量表達(dá)式n:
        語句n;
        break;
    default:
        語句n+1;
        break;
}
  • 語義:
    • 計(jì)算"表達(dá)式"的值, 逐個(gè)與其后的"常量表達(dá)式"值相比較,當(dāng)"表達(dá)式"的值與某個(gè)"常量表達(dá)式"的值相等時(shí), 即執(zhí)行其后的語句, 然后跳出switch語句
    • 如果"表達(dá)式"的值與所有case后的"常量表達(dá)式"均不相同時(shí),則執(zhí)行default后的語句
  • 示例:
#include <stdio.h>

int main() {

    int num = 3;
    switch(num){
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");
        break;
    case 4:
        printf("星期四\n");
        break;
    case 5:
        printf("星期五\n");
        break;
    case 6:
        printf("星期六\n");
        break;
    case 7:
        printf("星期日\n");
        break;
    default:
        printf("回火星去\n");
        break;
    }
}

  • switch注意點(diǎn)
    • switch條件表達(dá)式的類型必須是整型, 或者可以被提升為整型的值(char、short)
#include <stdio.h>

int main() {

    switch(1.1){ // 報(bào)錯
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    default:
        printf("回火星去\n");
        break;
    }
}
    • case的值只能是常量, 并且還必須是整型, 或者可以被提升為整型的值(char钾怔、short)
#include <stdio.h>

int main() {

    int num = 3;
    switch(1){ 
    case 1:
        printf("星期一\n");
        break;
    case 'a':
        printf("星期二\n");
        break;
    case num: // 報(bào)錯
        printf("星期三\n");
        break;
    case 4.0: // 報(bào)錯
        printf("星期四\n");
        break;
    default:
        printf("回火星去\n");
        break;
    }
}
    • case后面常量表達(dá)式的值不能相同
#include <stdio.h>

int main() {
    switch(1){ 
    case 1: // 報(bào)錯
        printf("星期一\n");
        break;
    case 1: // 報(bào)錯
        printf("星期一\n");
        break;
    default:
        printf("回火星去\n");
        break;
    }
}
    • case后面要想定義變量,必須給case加上大括號
#include <stdio.h>

int main() {
    switch(1){
    case 1:{
        int num = 10;
        printf("num = %i\n", num);
        printf("星期一\n");
        break;
        }
    case 2:
        printf("星期一\n");
        break;
    default:
        printf("回火星去\n");
        break;
    }
}
    • switch中只要任意一個(gè)case匹配, 其它所有的case和default都會失效. 所以如果case和default后面沒有break就會出現(xiàn)穿透問題
#include <stdio.h>

int main() {

    int num = 2;
    switch(num){
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n"); // 被輸出
    case 3:
        printf("星期三\n"); // 被輸出
    default:
        printf("回火星去\n"); // 被輸出
        break;
    }
}
    • switch中default可以省略
#include <stdio.h>

int main() {
    switch(1){
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期一\n");
        break;
    }
}
    • switch中default的位置不一定要寫到最后, 無論放到哪都會等到所有case都不匹配才會執(zhí)行(穿透問題除外)
#include <stdio.h>

int main() {
    switch(3){
    case 1:
        printf("星期一\n");
        break;
    default:
        printf("Other,,,\n");
        break;
    case 2:
        printf("星期一\n");
        break;
    }
}

  • if和Switch轉(zhuǎn)換
  • 看上去if和switch都可以實(shí)現(xiàn)同樣的功能, 那么在企業(yè)開發(fā)中我們什么時(shí)候使用if, 什么時(shí)候使用switch呢?
    • if else if 針對于范圍的多路選擇
    • switch 是針對點(diǎn)的多路選擇
  • 判斷用戶輸入的數(shù)據(jù)是否大于100
#include <stdio.h>

int main() {
    int a = -1;
    scanf("%d", &a);
    if(a > 100){
        printf("用戶輸入的數(shù)據(jù)大于100");
    }else{
        printf("用戶輸入的數(shù)據(jù)不大于100");
    }
}
#include <stdio.h>

int main() {
    int a = -1;
    scanf("%d", &a);
    // 挺(T)萌(M)的(D)搞不定啊
    switch (a) {
        case 101:
        case 102:
        case 103:
        case 104:
        case 105:
            printf("大于\n");
            break;
        default:
            printf("不大于\n");
            break;
    }
}

  • 練習(xí)
    • 實(shí)現(xiàn)分?jǐn)?shù)等級判定
要求用戶輸入一個(gè)分?jǐn)?shù)碱呼,根據(jù)輸入的分?jǐn)?shù)輸出對應(yīng)的等級
A 90~100  
B 80~89
C 70~79
D 60~69
E 0~59
    • 實(shí)現(xiàn)+ - * / 簡單計(jì)算器

循環(huán)結(jié)構(gòu)

  • C語言中提供了三大循環(huán)結(jié)構(gòu), 分別是while、dowhile和for
  • 循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)宗侦。
    • 其特點(diǎn)是,在給定條件成立時(shí),反復(fù)執(zhí)行某程序段, 直到條件不成立為止愚臀。
    • 給定的條件稱為"循環(huán)條件",反復(fù)執(zhí)行的程序段稱為"循環(huán)體"

循環(huán)結(jié)構(gòu)while

  • 格式:
while (  循環(huán)控制條件 ) {
    循環(huán)體中的語句;
    能夠讓循環(huán)結(jié)束的語句;
    ....
}
  • 構(gòu)成循環(huán)結(jié)構(gòu)的幾個(gè)條件

    • 循環(huán)控制條件
      • 循環(huán)退出的主要依據(jù),來控制循環(huán)到底什么時(shí)候退出
    • 循環(huán)體
      • 循環(huán)的過程中重復(fù)執(zhí)行的代碼段
    • 能夠讓循環(huán)結(jié)束的語句(遞增、遞減凝垛、真懊悯、假等)
      • 能夠讓循環(huán)條件為假的依據(jù),否則退出循環(huán)
  • 示例:

int count = 0;
while (count < 3) { // 循環(huán)控制條件
    printf("發(fā)射子彈~嗶嗶嗶嗶\n"); // 需要反復(fù)執(zhí)行的語句
    count++; // 能夠讓循環(huán)結(jié)束的語句
}
  • while循環(huán)執(zhí)行流程
    • 首先會判定"循環(huán)控制條件"是否為真, 如果為假直接跳到循環(huán)語句后面
    • 如果"循環(huán)控制條件"為真, 執(zhí)行一次循環(huán)體, 然后再次判斷"循環(huán)控制條件"是否為真, 為真繼續(xù)執(zhí)行循環(huán)體,為假跳出循環(huán)
    • 重復(fù)以上操作, 直到"循環(huán)控制條件"為假為止
#include <stdio.h>
int main(){
    int count = 4;
    // 1.判斷循環(huán)控制條件是否為真,此時(shí)為假所以跳過循環(huán)語句
    while (count < 3) { 
        printf("發(fā)射子彈~嗶嗶嗶嗶\n"); 
        count++; 
    }
    // 2.執(zhí)行循環(huán)語句后面的代碼, 打印"循環(huán)執(zhí)行完畢"
    printf("循環(huán)執(zhí)行完畢\n");
}
#include <stdio.h>
int main(){
    int count = 0;
    // 1.判斷循環(huán)控制條件是否為真,此時(shí)0 < 3為真
    // 4.再次判斷循環(huán)控制條件是否為真,此時(shí)1 < 3為真
    // 7.再次判斷循環(huán)控制條件是否為真,此時(shí)2 < 3為真
    // 10.再次判斷循環(huán)控制條件是否為真,此時(shí)3 < 3為假, 跳過循環(huán)語句
    while (count < 3) { 
        // 2.執(zhí)行循環(huán)體中的代碼, 打印"發(fā)子彈"
        // 5.執(zhí)行循環(huán)體中的代碼, 打印"發(fā)子彈"
        // 8.執(zhí)行循環(huán)體中的代碼, 打印"發(fā)子彈"
        printf("發(fā)射子彈~嗶嗶嗶嗶\n"); 
        // 3.執(zhí)行"能夠讓循環(huán)結(jié)束的語句" count = 1
        // 6.執(zhí)行"能夠讓循環(huán)結(jié)束的語句" count = 2
        // 9.執(zhí)行"能夠讓循環(huán)結(jié)束的語句" count = 3
        count++; 
    }
    // 11.執(zhí)行循環(huán)語句后面的代碼, 打印"循環(huán)執(zhí)行完畢"
    printf("循環(huán)執(zhí)行完畢\n");
}

  • while循環(huán)注意點(diǎn)
    • 任何數(shù)值都有真假性
#include <stdio.h>
int main(){
    while (1) { // 死循環(huán)
         printf("發(fā)射子彈~嗶嗶嗶嗶\n");
         // 沒有能夠讓循環(huán)結(jié)束的語句
    }
}
    • 當(dāng)while后面只有一條語句時(shí),while后面的大括號可以省略
#include <stdio.h>
int main(){
    while (1)  // 死循環(huán)
         printf("發(fā)射子彈~嗶嗶嗶嗶\n");
         // 沒有能夠讓循環(huán)結(jié)束的語句
}
    • 如果while省略了大括號, 那么后面不能定義變量
#include <stdio.h>
int main(){
    while (1)  // 死循環(huán)
         int num = 10; // 報(bào)錯
         // 沒有能夠讓循環(huán)結(jié)束的語句
}
    • C語言中分號(;)也是一條語句, 稱之為空語句
#include <stdio.h>
int main(){
    int count = 0;
    while (count < 3);{ // 死循環(huán)
       printf("發(fā)射子彈~嗶嗶嗶嗶\n"); 
       count++; 
    }
}
    • 最簡單的死循環(huán)
// 死循環(huán)一般在操作系統(tǒng)級別的應(yīng)用程序會比較多, 日常開發(fā)中很少用
while (1);

  • while練習(xí)
    • 計(jì)算1 + 2 + 3 + ...n的和
    • 獲取1~100之間 7的倍數(shù)的個(gè)數(shù)

循環(huán)結(jié)構(gòu)do while

  • 格式:
do {
    循環(huán)體中的語句;
    能夠讓循環(huán)結(jié)束的語句;
    ....
} while (循環(huán)控制條件 );
  • 示例
int count = 0;
do {
   printf("發(fā)射子彈~嗶嗶嗶嗶\n");
   count++;
}while(count < 10);
  • do-while循環(huán)執(zhí)行流程

    • 首先不管while中的條件是否成立, 都會執(zhí)行一次"循環(huán)體"
    • 執(zhí)行完一次循環(huán)體,接著再次判斷while中的條件是否為真, 為真繼續(xù)執(zhí)行循環(huán)體,為假跳出循環(huán)
    • 重復(fù)以上操作, 直到"循環(huán)控制條件"為假為止
  • 應(yīng)用場景

    • 口令校驗(yàn)
#include<stdio.h>
int main()
{
    int num = -1;
    do{
        printf("請輸入密碼,驗(yàn)證您的身份\n");
        scanf("%d", &num);
    }while(123456 != num);
    printf("主人,您終于回來了\n");
}
  • while和dowhile應(yīng)用場景
    • 絕大多數(shù)情況下while和dowhile可以互換, 所以能用while就用while
    • 無論如何都需要先執(zhí)行一次循環(huán)體的情況, 才使用dowhile
    • do while 曾一度提議廢除蜓谋,但是他在輸入性檢查方面還是有點(diǎn)用的

循環(huán)結(jié)構(gòu)for

  • 格式:
for(初始化表達(dá)式;循環(huán)條件表達(dá)式炭分;循環(huán)后的操作表達(dá)式) {
    循環(huán)體中的語句;
}
  • 示例
for(int i = 0; i < 10; i++){
    printf("發(fā)射子彈~嗶嗶嗶嗶\n");
}
  • for循環(huán)執(zhí)行流程

    • 首先執(zhí)行"初始化表達(dá)式"桃焕,而且在整個(gè)循環(huán)過程中,只會執(zhí)行一次初始化表達(dá)式
    • 接著判斷"循環(huán)條件表達(dá)式"是否為真,為真執(zhí)行循環(huán)體中的語句
    • 循環(huán)體執(zhí)行完畢后捧毛,接下來會執(zhí)行"循環(huán)后的操作表達(dá)式"观堂,然后再次判斷條件是否為真,為真繼續(xù)執(zhí)行循環(huán)體,為假跳出循環(huán)
    • 重復(fù)上述過程,直到條件不成立就結(jié)束for循環(huán)
  • for循環(huán)注意點(diǎn):

    • 和while一模一樣
    • 最簡單的死循環(huán)for(;;);
  • for和while應(yīng)用場景

    • while能做的for都能做, 所以企業(yè)開發(fā)中能用for就用for, 因?yàn)閒or更為靈活
    • 而且對比while來說for更節(jié)約內(nèi)存空間
int count = 0; // 初始化表達(dá)式
while (count < 10) { // 條件表達(dá)式
      printf("發(fā)射子彈~嗶嗶嗶嗶 %i\n", count);
      count++; // 循環(huán)后增量表達(dá)式
}
// 如果初始化表達(dá)式的值, 需要在循環(huán)之后使用, 那么就用while
printf("count = %i\n", count);
// 注意: 在for循環(huán)初始化表達(dá)式中定義的變量, 只能在for循環(huán)后面的{}中訪問
// 所以: 如果初始化表達(dá)式的值, 不需要在循環(huán)之后使用, 那么就用for
// 因?yàn)槿绻跏蓟磉_(dá)式的值, 在循環(huán)之后就不需要使用了 , 那么用while會導(dǎo)致性能問題
for (int count = 0; count < 10; count++) {
     printf("發(fā)射子彈~嗶嗶嗶嗶 %i\n", count);
}
//     printf("count = %i\n", count);
// 如果需要使用初始化表達(dá)式的值, 也可以將初始化表達(dá)式寫到外面
int count = 0;
for (; count < 10; count++) {
     printf("發(fā)射子彈~嗶嗶嗶嗶\n", count);
}
printf("count = %i\n", count);

四大跳轉(zhuǎn)

  • C語言中提供了四大跳轉(zhuǎn)語句, 分別是return呀忧、break师痕、continue、goto

  • break:

    • 立即跳出switch語句或循環(huán)
  • 應(yīng)用場景:

    • switch
    • 循環(huán)結(jié)構(gòu)
  • break注意點(diǎn):

    • break離開應(yīng)用范圍而账,存在是沒有意義的
if(1) {
  break; // 會報(bào)錯
}
    • 在多層循環(huán)中,一個(gè)break語句只向外跳一層
while(1) {
  while(2) {
    break;// 只對while2有效, 不會影響while1
  }
  printf("while1循環(huán)體\n");
}
    • break下面不可以有語句胰坟,因?yàn)閳?zhí)行不到
while(2){
  break;
  printf("打我啊!");// 執(zhí)行不到
}

  • continue
    • 結(jié)束本輪循環(huán),進(jìn)入下一輪循環(huán)
  • 應(yīng)用場景:
    • 循環(huán)結(jié)構(gòu)
  • continue注意點(diǎn):
    • continue離開應(yīng)用范圍泞辐,存在是沒有意義的
if(1) {
  continue; // 會報(bào)錯
}

  • goto
    • 這是一個(gè)不太值得探討的話題笔横,goto 會破壞結(jié)構(gòu)化程序設(shè)計(jì)流程,它將使程序?qū)哟尾磺甯篮穑也灰鬃x吹缔,所以慎用
    • goto 語句,僅能在本函數(shù)內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)锯茄,不能實(shí)現(xiàn)跨函數(shù)跳轉(zhuǎn)(短跳轉(zhuǎn))厢塘。但是他在跳出多重循環(huán)的時(shí)候效率還是蠻高的
#include <stdio.h>
int main(){
    int num = 0;
// loop:是定義的標(biāo)記
loop:if(num < 10){
        printf("num = %d\n", num);
        num++;
        // goto loop代表跳轉(zhuǎn)到標(biāo)記的位置
        goto loop;
    }
}
#include <stdio.h>
int main(){
    while (1) {
        while(2){
            goto lnj;
        }
    }
    lnj:printf("跳過了所有循環(huán)");
}

  • return
    • 結(jié)束當(dāng)前函數(shù),將結(jié)果返回給調(diào)用者
    • 不著急, 放一放,學(xué)到函數(shù)我們再回頭來看它

循環(huán)的嵌套

  • 循環(huán)結(jié)構(gòu)的循環(huán)體中存在其他的循環(huán)結(jié)構(gòu)肌幽,我們稱之為循環(huán)嵌套
    • 注意: 一般循環(huán)嵌套不超過三層
    • 外循環(huán)執(zhí)行的次數(shù) * 內(nèi)循環(huán)執(zhí)行的次數(shù)就是內(nèi)循環(huán)總共執(zhí)行的次數(shù)
  • 格式:
while(條件表達(dá)式) {
    while循環(huán)結(jié)構(gòu) or dowhile循環(huán)結(jié)構(gòu) or for循環(huán)結(jié)構(gòu)
}
for(初始化表達(dá)式晚碾;循環(huán)條件表達(dá)式;循環(huán)后的操作表達(dá)式) {
    while循環(huán)結(jié)構(gòu) or dowhile循環(huán)結(jié)構(gòu) or for循環(huán)結(jié)構(gòu)
}
do {
     while循環(huán)結(jié)構(gòu) or dowhile循環(huán)結(jié)構(gòu) or for循環(huán)結(jié)構(gòu)
} while (循環(huán)控制條件 );
  • 循環(huán)優(yōu)化
    • 在多重循環(huán)中牍颈,如果有可能迄薄,應(yīng)當(dāng)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層煮岁,以減少 CPU 跨切循環(huán)層的次數(shù)
for (row=0; row<100; row++) {
  // 低效率:長循環(huán)在最外層
  for ( col=0; col<5; col++ ) {
    sum = sum + a[row][col];
  }
}
for (col=0; col<5; col++ ) {
  // 高效率:長循環(huán)在最內(nèi)層
  for (row=0; row<100; row++) {
    sum = sum + a[row][col];
  }
}
  • 練習(xí)
    • 打印好友列表
好友列表1
    好友1
    好友2
好友列表2
    好友1
    好友2
好友列表3
    好友1
    好友2
for (int i = 0; i < 4; i++) {
    printf("好友列表%d\n", i+1);
    for (int j = 0; j < 4; j++) {
        printf("    角色%d\n", j);
    }
}

圖形打印

  • 一重循環(huán)解決線性的問題讥蔽,而二重循環(huán)和三重循環(huán)就可以解決平面和立體的問題了
  • 打印矩形
****
****
****
// 3行4列
//  外循環(huán)控制行數(shù)
for (int i = 0; i < 3; i++) {
//        內(nèi)循環(huán)控制列數(shù)
    for (int j = 0; j < 4; j++) {
        printf("*");
    }
    printf("\n");
}
  • 打印三角形
    • 尖尖朝上,改變內(nèi)循環(huán)的條件表達(dá)式画机,讓內(nèi)循環(huán)的條件表達(dá)式隨著外循環(huán)的i值變化
    • 尖尖朝下冶伞,改變內(nèi)循環(huán)的初始化表達(dá)式,讓內(nèi)循環(huán)的初始化表達(dá)式隨著外循環(huán)的i值變化
*
**
***
****
*****
/*
最多打印5行
最多打印5列
每一行和每一列關(guān)系是什么? 列數(shù)<=行數(shù)
*/
for(int i = 0; i< 5; i++) {
    for(int j = 0; j <= i; j++) {
        printf("*");
    }
    printf("\n");
}
*****
****
***
**
*
for(int i = 0; i< 5; i++) {
    for(int j = i; j < 5; j++) {
        printf("*");
    }
    printf("\n");
}
  • 練習(xí)
    • 打印特殊三角形
1
12
123
for (int i = 0; i < 3; i++) {
    for (int j = 0; j <= i; j++) {
        printf("%d", j+1);
    }
    printf("\n");
}
    • 打印特殊三角形
1
22
333
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= i; j++) {
        printf("%d", i);
    }
    printf("\n");
}
    • 打印特殊三角形
--*
-***
*****
for (int i = 0; i <= 5; i++) {
    for (int j = 0; j < 5 - i; j++) {
        printf("-");
    }
    for (int m = 0; m < 2*i+1; m++) {
        printf("*");
    }
    printf("\n");
}
    • 打印99乘法表
1 * 1 = 1
1 * 2 = 2     2 * 2 = 4
1 * 3 = 3     2 * 3 = 6     3 * 3 = 9
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        printf("%d * %d = %d \t", j, i, (j * i));
    }
    printf("\n");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末步氏,一起剝皮案震驚了整個(gè)濱河市响禽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖芋类,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隆嗅,死亡現(xiàn)場離奇詭異,居然都是意外死亡侯繁,警方通過查閱死者的電腦和手機(jī)胖喳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贮竟,“玉大人丽焊,你說我怎么就攤上這事」颈穑” “怎么了技健?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惰拱。 經(jīng)常有香客問我雌贱,道長,這世上最難降的妖魔是什么弓颈? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任帽芽,我火速辦了婚禮删掀,結(jié)果婚禮上翔冀,老公的妹妹穿的比我還像新娘。我一直安慰自己披泪,他們只是感情好纤子,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著款票,像睡著了一般控硼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艾少,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天卡乾,我揣著相機(jī)與錄音,去河邊找鬼缚够。 笑死幔妨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谍椅。 我是一名探鬼主播误堡,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雏吭!你這毒婦竟也來了锁施?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悉抵,沒想到半個(gè)月后肩狂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姥饰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年婚温,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳否。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栅螟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篱竭,到底是詐尸還是另有隱情力图,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布掺逼,位于F島的核電站吃媒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吕喘。R本人自食惡果不足惜赘那,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氯质。 院中可真熱鬧募舟,春花似錦、人聲如沸闻察。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辕漂。三九已至呢灶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钉嘹,已是汗流浹背鸯乃。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跋涣,地道東北人缨睡。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像仆潮,于是被迫代替她去往敵國和親宏蛉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)性置,也就是一...
    悟名先生閱讀 4,148評論 0 13
  • Swift 提供了類似 C 語言的流程控制結(jié)構(gòu)拾并,包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 703評論 1 1
  • 為了生存的邏輯自洽,對身邊出現(xiàn)的不同人不同事嗅义,在自有體系中找到合理解釋屏歹,如果沒有知識的累積,認(rèn)識的升級之碗,身邊所有的...
    中年惡爸閱讀 791評論 0 0
  • 卓越,其實(shí)并不遙遠(yuǎn)博敬,我相信積累的力量友浸,有些東西,如果不去表達(dá)出來偏窝,可能他就不會成為你的收恢。看過太多人祭往、聽過太多故事伦意,...
    music_lei溯鯤閱讀 167評論 0 0
  • 去做自己想做的事,去見自己想見的人硼补,這樣的感覺太好了驮肉,也許我太久沒珠海了吧,變化很大括勺。(一直很想去珠海長隆缆八,一直在...
    小鈺涵閱讀 240評論 0 2