由於各種程序設計大賽使用的輸入輸出一般使用的都有多組輸入輸出,且輸入輸出對於格式的規范性要求很高(便於判題自動測試驗證),下面我們舉幾個例子演示基本的輸入輸出的技巧。
例1,沒有說明測試數據輸入的組數
題目內容:
已知數大於零兩個整數a和b,求a和b的和。
輸入描述:
輸入兩個大於零整數a和b。a,b都是整型(int),a,b以空格隔開。
輸出描述:
輸出整數a和b的和,並換行。
輸入樣例:
12
34
45
輸出樣例:
3
7
9
應對策略:
沒有說明輸入的測試數據的組數,那麼我們默認是一值輸入測試數據直到人為停止或者測試輸入用完,在windows下按ctr+c組合鍵即可。實現代碼如下。
C語言版:
[cpp]
#include<stdio.h>
int main()
{
int a,b;
while(scanf(“%d%d”,&a,&b) != EOF)
{
<span style="white-space:pre"> </span> printf(“%d\n”,(a+b)); //注意輸出描述要換行哦
}
return 0;
}
->知識要點
scanf函數返回值就是讀取的變量個數,如:scanf( “%d %d”, &a,&b );
如果只有一個整數輸入,返回值是1,如果有兩個整數輸入,返回值是2,如如果一個都沒有,則返回值是-1。EOF是一個預定義的常量,等於-1
試著說出下面例子的輸出結果:
[cpp]
#include<stdio.h>
int main()
{
int a,b,c;
printf("scanf(...,&a,&b)=%d\n",scanf("%d%d",&a,&b));
[cpp]
printf("scanf(...,&a,&b,&c)=%d\n",scanf("%d%d%d",&a,&b,&c));
return 0;
}
->課後思考???
作為C語言的標准輸入scanf()函數有返回值,那麼他的老搭檔標准輸出printf()是否有返回值呢?返回值的又是什麼呢?
[cpp]
C++版:
#include<iostream>
using namespace std;
int main()
{
inta,b;
while(cin>>a>>b)
{
<span style="white-space:pre"> </span>cout<<a+b<<endl;
}
return0;
}<span style="color: blue; font-family: FangSong_GB2312;font-size:16px; "> </span>
->知識要點
例2,手動輸入測試數據的組數
題目內容:
已知輸入大於零兩個整數a和b,求a和b的和。
輸入描述:
先輸入測試數據組數n,在輸入n組兩個整數a和b。a,b都是整型(int)且都大於零,a,b以空格隔開。每一組數據輸完後換行
輸出描述:
輸出一組整數a和b的和,並換行。
輸入樣例:
3
1 2
3 4
4 5
輸出樣例:
3
7
9
應對策略:
我們只要設置兩個變量分別用來接受我們測試數據的組數和記錄輸入測試數據的組數。實現代碼如下:
C語言版:
[cpp]
#include<stdio.h>
int main()
{
inta,b,n;
inti = 0; //記錄測試數據輸入的組數
scanf(“%d”,&n);//首先輸入測試數據的組數
while(i<n)
{
<span style="white-space:pre"> </span> scanf(“%d%d”,&a,&b);
<span style="white-space:pre"> </span>printf(“%d\n”,(a+b)); //注意輸出描述要換行哦
<span style="white-space:pre"> </span>++ i; //別掉了哦,否則就會陷入死循環哦
}
return 0;
}
C++版:
[cpp]
#include<iostream>
using namespace std;
int main()
{
inta,b,n;
inti = 0;
cin>>n;
while(i<n)
{
<span style="white-space:pre"> </span> cin>>a>>b;
<span style="white-space:pre"> </span>cout<<a+b<<endl;
<span style="white-space:pre"> </span>++ i;
}
return0;
}
例3,沒有說明測試數據輸入的組數,但是給出了輸入結束的標識
題目內容:
已知數兩個整數a和b,求a和b的和。
輸入描述:
輸入多組兩個整數a和b。a,b都是整型(int)且都大於零,a,b以空格隔開。直至輸入0 0結束。
輸出描述:
輸出整數a和b的和,並換行。
輸入樣例:
1 2
3 4
4 5
0 0
輸出樣例:
3
7
9
應對策略:
我們只需要每次輸入完一組測試數據後檢查測試數據本身是否為結束符即可。如果是則結束,否則繼續。
C語言版:
[cpp]
#include<stdio.h>
int main()
{
inta,b;
while(scanf(“%d%d”,&a,&b), a!=0&&b!=0)
{
<span style="white-space:pre"> </span> printf(“%d\n”,(a+b)); //注意輸出描述要換行哦
}
return 0;
}
->知識要點
這裡我們要注意的是while(scanf(“%d %d”,&a,&b), a!=0&&b!=0)裡的“,”逗號運算符的規則。
C++版:
[cpp]
#include<iostream>
using namespace std;
int main()
{
inta,b;
while(cin>>a>>b,a!=0&&b!=0)
{
<span style="white-space:pre"> </span> cout<<a+b<<endl;
}
return0;
}
->知識要點
例4,字符串輸入
題目內容:
將字符串完美再次呈現
輸入描述:
輸入多組字符串然
輸出描述:
按照輸入完全一模一樣的輸出字符串
輸入樣例:
Whlcome to c club
string
ni ho_no
輸出樣例:
Whlcome to c club
string
ni ho_no
應對策略:
沒有說明輸入的測試數據的組數,那麼我們默認是一值輸入測試數據直到人為停止或者測試輸入用完,但是我們不是要說這個問題。我們需要注意的是接收一整行字符串要注意的問題,C或者C++提供的標准輸入函數,以及輸入函數之間的差別。或者C++的getline()函數。
C語言版:
[cpp]
#include<stdio.h>
#define N 80
int main()
{
charstr[N];
while(gets(str)!= NULL)
{
<span style="white-space:pre"> </span>printf(“str\n”,str); //注意輸出描述要換行哦
}
return 0;
}
->知識要點
gets()函數的返回值是函數的參數,也就是說gets(str)的返回值是str。if the return value isANULL pointer indicates an error or end-of-file condition.(引用於MSDN)我們決不能直接用scanf()因為空格也可以作為他的分隔符,那麼字符串在“ni shi shui a”用scanf()接受則為四個字符串,顯然是不符合題意的。我們可以用gets()函數,因為此函數的分隔符是“\n”。
->課後思考???
printf("%s\n",gets(str));輸出的是什麼?
C++版:
[cpp]
#include<iostream>
using namespace std;
int main()
{
inta,b;
while(cin>>a>>b)
{
<span style="white-space:pre"> </span> cout<<a+b<<endl;
}
return0;
}