流程控制基本概念
默認(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)
- 循環(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");
}