之 輸入輸出與程序設計結構之美
看看今天的菜是什麼:printf()與scanf();if語句開關switch 三種循環結構。看到這些東西,如果你曾經學完過C,你是不是有點懷念?如果你是初學者,你是不是感到頭疼?
你是不是感覺到它們很簡單,因為它們都是最基本的知識,但是,我說正是因為它們基礎,所以它們才博大精深,因為把他們按照自己的思路拼湊在一起會形成不同風格的程序。
即使是如此的簡單,你是不是因為pirntf(“%5d”,a);中的5而感到疑惑?會不會因為scanf(“%d”,&a)中的輸入格式無從下手? 有沒有因為swich中的break而查閱過好多資料?更不用說大家肯定都會動腦子想想循環結構的邏輯思路。
如果大家對我說的還有一定疑惑的話,那就跟著小編一起走一段路吧!
1.格式:printf(格式控制,輸出列表);
1)格式控制是用雙引號引起來的字符串,也叫:轉換控制字符串。它包括兩種信息
格式字符串:由%和格式字符組成,作用是將輸出的數據轉換為指定的格式輸出
普通字符,即需要原樣輸出的字符。
2)輸出列表是需要輸出的一些數據,也可以是表達式
3)printf函數的一般形式可以表示為
Printf(參數1,參數2....參數n) 功能是將參數2~參數n按參數1給定的格式輸出
2.我們主要來看一下格式控制中的格式字符串的形式,我們已經說過,它是有%和格式字
符組成,也就是大家常用的 “%d”等。但是這個格式字符的種類可是有好多的分類:
格式字符
作用
描述
d或i)
用來輸出十進制整數
①%d,按整型數據的實際長度輸出。
②%md,m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補以空,若大於m,則按實際位數輸出。%5d。
③%ld(%mld 也可),輸出長整型數據。
o
以八進制數形式輸出整數
%o,%mo,%lo,%mlo都可
x(或X)
以十六進制數形式輸出整數
%x,%mx,%lx,%mlx都可
u
輸出unsigned型數據,即無符號數,以十進制數形式輸出
%u,%mu,%lu都可
c
輸出一個字符
%c,%mc都可
s格式
輸出一個字符串。
%s,%ms,%-ms,%m.ns,%-m.ns都可
f格式符
輸出實數包括單、雙精度),以小數形式輸出
%f,%m.nf,%-m.nf都可
注意:單精度實數的有效位數一般為7位,雙精度為16位。
注:字符l用於長整型整數,可加在格式符d、o、x、u前面;
m代表一個正整數,表示數據最小寬度
N代表一個正整數,表示對實數表示輸出n位小數,對字符串,表示截取的字符個數
3.疑惑
1)如果要輸出%怎麼辦?我們知道“%+格式字符”是一種形式,但是要輸出%怎麼辦?
應該在“格式控制”字符串中用連續兩個%表示 ,比如:printf(“%f%%”,a);
2)在格式控制 字符串內是可以包含轉義字符的,如\n換行)
1.格式:scanf(“格式控制”,地址表列);
格式控制的作用與printf函數相同,但是不能顯示非格式字符串,
地址表列中是各變量的地址,地址由&地址運算符)個變量名組成。&a
2.“*”
表示該輸入項,讀入後不賦予相應的變量,即跳過該輸入值
比如:scanf(“%d%*d%d”,&a,&b);當輸入為123時,把1給a,2被跳過,3給b
3.scanf)函數和printf)函數的格式控制字符基本上是一樣的,也分為%d%5d等等,但是scanf中沒有精度控制,比如scanf(“%5.2f”,&a)是錯誤的。
4. 格式控制字符串與輸入格式,兩者格式是一樣的。
比如:scanf(“%d,%d %d%d”,&a,&b,&c,&e);//3個%d之間一個逗號,一個空格,一個什麼都沒有。則輸入的時候就應該按照這樣的格式輸入:d,e fg。
如果不按照控制字符的格式輸出呢?
比如:scanf(“%d%d%d”,&a,&b,&c)
輸入 d e f 在格式控制字符竄中3個%d之間什麼都沒有,但是在輸入的的abc之間都加了一個空格,很明顯兩者的格式沒有統一起來。那麼:
d給a,空格給b,e給c。
if是選擇語句,我認為裡面實在沒有什麼難點和應該注意的地方,硬要說的話,就是if語句的嵌套層次。需要注意它們的格式,不要亂寫if.
if(條件)
語句;
else
語句;
if(條件)
語句;
else if(條件)
語句;
else if(條件)
語句;
..
..
else
語句;
在if 中,可以寫成條件運算符的形式。下述兩種語句表達的是一個意思
if(a>b)
Max=a;
else
Max=b;
Max=a>b? a:b
Switch又稱為開關語句
基本形式是
switch(表達式)
{
case 值1:語句1;[break;]
case 值2:語句2;[break;]
.....
[default:語句;]
}
需要注意的是switch()中的表達式的數據類型只能是整型或字符型。
有關break的詳解,請繼續往下看
while表達式)
{
語句序列;
}
do{
語句序列;
}while(表達式);
for(表達式1;表達式2;表達式3)
{
語句序列;
}
3中循環結構以for循環最為重要。
while和do..while的區別在於:while是先判斷再執行;do...while是先執行後判斷。
for循環中的表達式1為初始條件,符合表達式2的判斷,執行語句,然後執行表達式3,再根據表達式2進行判斷,執行語句。
關於for循環的嵌套:程序實例:打印九九乘法表。
#include <stdio.h> main() { int m,n; for(m=1;m<10;m++){ printf("%4d",m); } printf("\n"); for(m=1;m<10;m++){ printf(" -"); } printf("\n"); for(m=1;m<10;m++){ //被乘數m從1變化到9 for(n=1;n<=m;n++){ //乘數從1變化到m printf("%4d",m*n); //輸出第m行n列中的m*n的值 } printf("\n"); } }
1.break語句
1)break語句只能用於循環語句或者switch語句中。即使有這樣的語句
If(...) break; 那麼這個if語句也一定位於循環體或者swich語句之中。
2)break語句的作用是跳出終止)它所在的循環。而且不能同時跳出多層循環。
比如:
for(){ 第一個for循環
for(){ 第二個for循環
語句1;
break;
語句2;
}
語句3;
}
上述中break終止的只能是第二個for循環,即程序運行到break時,就跳出第二個for循環,然後執行語句3,執行完語句3後開始循環執行第一個for循環。就當第二個for不存在一樣。
但是需要注意的是,語句1執行了一次,語句2一次也沒有執行。語句3執行了n次n為第一個for循環的循環次數)
3)程序實例驗證2)
#include <stdio.h> main() { int m,n; for(m=1;m<10;m++){ for(n=1;n<=10;n++){ n=n+1; break; n=n+2; } m=m+3; } printf("m=%d,n=%d\n",m,n); }
2.continue語句
1)continue語句與break語句一樣,都必須在循環中。
2)continue語句的不同之處在於它的作用是結束本次循環,即跳過本層循環體中余下尚未執行的語句,接著再一次進行循環的條件判斷。也就是說執行continue語句並沒有使本次循環結束。
比如:
for(){ 第一個for循環
for(){ 第二個for循環
語句1;
continue;
語句2;
}
語句3;
}
上述程序中,執行到continue時,第二個for循環的這一次循環終止,進行第二個for循環的下一次循環,也就是說,語句2不執行了,再進行新的一輪循環。只是continue之後的語句不執行了,然後再進行第二個for循環中的下一次循環。
在上述程序中,語句1執行了n次n為第二個for循環循環的次數),語句2一次也沒有執行,語句3執行了m次m為第一個for循環循環的次數)
3)一個程序實例驗證2):
#include <stdio.h> main() { int m,n,x=1; for(m=1;m<10;m++){ for(n=1;n<=10;n++){ n=n+1; continue; x=x+1; } m=m+3; } printf("m=%d,n=%d,x=%d\n",m,n,x); }
本文出自 “趙玉強的博客” 博客,請務必保留此出處http://zhaoyuqiang.blog.51cto.com/6328846/1261201