一、設定域寬setw()
輸出的內容所佔的總寬度成為域寬,有些高階語言中稱為場寬。
使用setw()前,必須包含標頭檔案iomanip,即#include<iomanip>
標頭檔案iomanip,用來宣告一些“流運算子”,需要一定格式輸入輸出時,就需要用到它,比較常用的有設定域寬、設定左右對齊、設定實數的精確度等。
setw(n)的作用是設定輸出寬度為n,預設為右對齊,並且用空格填充。例如:cout << std::setw(5) << "0" << "1" << endl,該語句就是設定字串"0"的輸出寬度為5,預設為右對齊,空格填充。若想使用其他符號填充(例如用'*'填充),則可以用cout << std::setw(5) << setfill('*') << "0" << "1" << endl;如果想修改成左對齊,則只需要在std::setw(n)之前加上std::left即可。
setw()只對直接跟在後面的輸出資料起作用。
當要輸出的字串寬度大於setw設定的寬度n時,直接輸出想要輸出的字串即可(此時忽視setw設定的寬度)。
透過執行如下測試程式碼即可瞭解setw()的規則:
#include <iomanip>
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
/*預設為右對齊,此時加不加std::right都可以 */
cout << std::setw(5) << "0" << "1" << endl;
cout << std::setw(5) << "00" << "1" << endl;
cout << std::setw(5) << "000" << "1" << endl;
/*用<<left或者std::left改成左對齊*/
cout << std::left << std::setw(5) << "0" << "1" << endl;
cout << std::left << std::setw(5) << "00" << "1" << endl;
cout << std::left << std::setw(5) << "000" << "1" << endl;
/*當要輸出的字串寬度大於setw設定的寬度時,直接輸出想要輸出的字串即可*/
cout << std::right <<std::setw(5) << "0000000" << "1" << endl;
/*用其他符號填充*/
cout << std::right <<std::setw(5) << setfill('*') << "0" << "1" << endl;
cout << std::left << std::setw(5) << setfill('*') << "0" << "1" << endl;
return 0;
}
英漢小詞典:
iomanip:io是輸入輸出的縮寫;
manip:是manipulator(操縱器)的縮寫;
setw:set width的縮寫,設定域寬;
練習:
(1)為了讓計算機完成一個完整的任務而編寫的一系列指令序列稱為( )
A.命令 B.口令 C.程式 D.軟體
(2)閱讀程式寫結果。
1 #include <iostream>
2 #include <iomanip>
3 using namespace std;
4 int main()
5 {
6 int a,b,c;
7 a=3;
8 b=4;
9 c=a*a+b*b;
10 cout<<a<<'*'<<a<<'+'<<b<<'*'<<b<<'='<<setw(2)<<c<<endl;
11 return 0;
12 }
3.完善程式:已知a為15,b為3,輸出a-b的豎式計算。
1 #include <iostream>
2 /*標頭檔案iomanip,用來宣告一些“流運算子”,
3 需要一定格式輸入輸出時,就需要用到它,
4 比較常用的有設定域寬、設定左右對齊、
5 設定實數的精確度等。*/
6 #include <iomanip>
7 using namespace std;
8 int main()
9 {
10 int a,b,c;
11 a=15;
12 b=3;
13 c=a-b;
14 cout<<setw(5)<<a<<endl;
15 cout<<setw(2)<<'-'<<setw(3)<<____<<endl;
16 cout<<"------"<<endl;
17 cout<<________<<c<<endl;
18 return 0;
19 }
二、cin語句
cin>>a;輸入一個數並賦值給變數a。
習慣上,將"cin"和流提取運算子">>"實現的輸入語句簡稱為cin語句。
C++程式語言I/O流中的標準輸入流,需要包含iostream標頭檔案,即#include
cin代表標準輸入裝置,使用右移運算子 ">>" 從裝置鍵盤取得資料,送到輸入流物件cin中,然後送到記憶體。
使用cin可以獲得多個從鍵盤的輸入值,其具體使用格式如下:
cin >> 變數1 >>變數2...>>變數n
示例:風之巔小學向全校師生髮出“植樹造林,還我綠色”的倡議,鼓勵大家多植樹,創造綠色家園,同學們都積極響應。向日葵班有43人,平均每人種2棵樹;蘋果班42人,平均每人種3棵樹;草莓班45人,平均每人種2棵樹。
當程式執行時,每班人數和平均每人種的顆數由客戶輸入,程式算出該班種的總顆數。
每個班的學生人數是不一樣的,平均每人種樹的棵數也會不一樣,每次執行時都要更改程式,很不方便。能不能實現這樣的功能:當程式執行時,每個班的人數和平均每人種的棵數由我們自己輸入,程式能根據輸入的數值計算出總的棵數?
由cin來實現,如cin>a的作用是輸入一個數並賦值給變數a。
1 /*
2 試編一程式,分別計算出每個班總棵樹。
3 */
4
5 #include <iostream> //包含輸入輸出流標頭檔案iostream
6 using namespace std; //指明程式 使用名稱空間std(標準)
7 int main()
8 {
9 int a,b,s;
10 cout<<"請輸入人數和平均每人種的棵數:";
11 cin>>a;
12 cin>>b;
13 s=a*b;
14 cout<<"總的棵數:"<<s<<endl;
15 return 0;
16 }
英漢小詞典:
cin:由c和in兩個單片語成輸入流。
2、練習:
(1)下面裝置中,( )屬於計算機的輸入裝置。
A.顯示器 B.繪圖儀 C.印表機 D.滑鼠
(2)用cin語句重新編寫交換兩個變數的值的程式。
(3)閱讀程式寫結果
#include <iostream> //包含輸入輸出流標頭檔案iostream
using namespace std; //指明程式 使用名稱空間std(標準)
int main()
{
int s,a,b,c;
cin>>s>>a>>b>>c;
s-=a;
s-=b;
s-=c;
cout<<"ans="<<s<<endl;
return 0;
}
輸入:200 10 20 30 50
輸出:_________________
(4)完善程式
/*
3.完善程式
從鍵盤輸入長方形的長和寬,輸出長方形的周長。
*/
#include <iostream> //包含輸入輸出流標頭檔案iostream
using namespace std; //指明程式 使用名稱空間std(標準)
int main()
{
int a,b,c;
;
c=(a+b)*2;
cout<<"周長:"<< <<endl;
return 0;
}
三、輸入輸出.格式化
1. 輸出
對於格式化輸出,本節課將學習兩個函式 scanf() 、 printf() 來取代之前的cin和cout方法;
- 假如,我們要輸出一組運算等式:1 + 2 = 3,而1是變數a,2是變數b,3是a+b的運算結果;
int a = 1, b = 2;
// cout
cout << a << " + " << b << " = " << a + b;
cout << endl;
// printf
printf("%d + %d = %d", a, b, a + b);
-
printf() 函式極其方便的原因,它可以先按照自己的輸出格式,先寫出來,不需要頭腦翻譯;
-
然後把需要替換成變數的部分,用 %d 來表示即可,而後續對應的位置換成變數或表示式運算即可;
-
%d 這裡表示佔位的內容 是 整型,也有各種其它的佔位符,這裡羅列出常用的幾個:
佔位控制符 說明 %d 整數 %f 浮點數(float) %c 字元 %s 字串 -
最終的語法結構如下:
printf(格式控制符, 佔位替換列表)
2. 輸入
-
從上面例子中,我們使用 scanf() 函式來控制輸入:
int a, b; // scanf scanf("%d %d", &a, &b); // printf printf("%d + %d = %d", a, b, a + b);
-
先了解下輸入引數的格式需求:
scanf(格式控制符, 地址集)
-
暫時沒有辦法解釋這個地址是什麼意思?舉個並不恰當但好理解的說明:
- 快遞員給張三寄快遞,直接送到張三手上;這是 cin
- 快遞員給張三家地址寄快遞,不管是鳳巢、門衛代收還是家人收件,最終會交給張三;這是 scanf()
- 所以,a表示張三,&a表示張三家的地址;而sacanf() 引數要求是地址,故在變數前加&;
- 而這個知識點叫做 引用,是比較靠後的知識點,暫時不用理解;
- 後續,自然也會有 變數本身就是引用,反而引數不需要 & 符號;
3. 格式化
-
在使用 printf() 時,我們需要輸出各種特殊字元,比如百分號,換行,以及場寬精度問題等:
符號 說明和示例 \\ 輸出一個斜槓,printf("\\"); \n 換行,printf("\n"); %% 百分號,printf("%"); 數字 場寬,printf("%3d%5d"); 小數 精度,printf("%.2f", 3.1415926);
例程:
// 格式化
printf("%%\\\n");
// 場寬
printf("%3d%5d\n", a, b);
// 精度
printf("%.2f\n", 3.1415926);
// 場寬+精度
printf("%8.2f", 3.1415926);
參考閱讀:
一、格式化輸出函式:
格式化輸入函式和格式化輸出函式是C語言標準庫函式.
printf()函式的一般語法格式如下:
printf("<格式化字串>",<輸出列表>);
1.格式化字串:
用雙引號括起來的字串,字串包含的普通字元,printf()函式將其原樣輸出到螢幕上;
以"%"開頭的格式字元,printf()函式將資料轉換為指定的格式輸出到螢幕上。
輸出列表:需要輸出到螢幕的資料,資料可以是常量、變數或者表示式。
二、格式化輸入函式:
scanf()函式的一般語法格式如下:
scanf("<格式化字串>",<地址列表>);
格式化字串:
1.用雙引號括起來的字串,一般只有"%"開頭的格式字元。
2.地址列表:各個變數的地址,變數的地址透過取地址符號"&",陣列名本身就是地址。
scanf()函式也可以和printf()函式一樣可以接受多個值,變數之間需要用逗號隔開,需要一一對應。
三、常見格式控制字元
格式控制符以%開頭
格式控制字元 作用
%d 輸入或輸出int變數資料
%u 輸入或輸出unsigned int變數資料
%lld 輸入或輸出long long變數資料
%llu 輸入或輸出unsigned long long變數資料
%f 輸入或輸出float變數資料
%lf 輸入或輸出double變數資料
%c 輸入或輸出char變數資料
%s 輸入或輸出字串變數或字元陣列資料
%nd 以n字元寬度輸出整數,寬度不足時用空格補充
%0nd 以n字元寬度輸出整數,寬度不足時用0補充
%.nlf 輸出浮點數,精確到小數點後n位
......
例1:hello world
//C:格式化輸出
printf("hello world\n");
例2:a+b 問題
//C:格式化輸入輸出
int a,b;
long long s;
//cin>>a>>b;
scanf("%d%d",&a,&b);
s=a+b;
//cout<<s<<endl;
printf("%lld\n",s);
例3:溫度轉換
已知:設施溫度c,與華氏溫度f的轉換關係:9c=5(f-32).
輸入華氏溫度f,輸出設施溫度c
輸入:98.6
輸出:37
#include<iostream>
using namespace std;
int main ()
{
double c,f;
scanf("%lf",&f);
c=(f-32)*5/9;
printf("%lf",c);
return 0;
}
例4:輸入任意的兩個整數,兩個整數之間用+、-、*、/四種符號之一表示,根據符號計算結果。
輸入:8+2 輸出:10
輸入:8/5 輸出:1.6
提示:字元型別%c
#include<iostream>
using namespace std;
int main()
{
int a,b;
double s;
char x;
scanf("%d%c%d",&a,&x,&b);
if(x=='+')
s=a+b;
else if(x=='-')
s=a-b;
else if(x=='*')
s=a*b;
else if(x=='/')
s=(double)(a)/b;
printf("%lf",s);
return 0;
}
在C++中,cstdio和stdio.h這兩個標準輸入輸出標頭檔案裡面都有printf函式。
-[C/C++入門][printf輸出]5、詳解C語言和C++中的printf輸出
-【C語言】scanf()