04C++順序結構(3)

gdyyx發表於2024-10-18

一、設定域寬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 分為兩個音節 讀為 "c in",音標 "/si:ɪn/"。
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()

相關文章