PTA計算平均值( 一波三折)
現在為若干組整數分別計算平均值。
已知這些整數的絕對值都小於100,每組整數的數量不少於1個,不大於20個。
輸入格式:首先輸入K(不小於2,不大於20)。接下來每一行輸入一組數據(至少有一組數據),每組至少有一個數據,在有多個數據時,兩個數據之間有1到3個空格。最后一行輸入100,標志輸入的結束。
輸出格式:對於每一組數據,輸出其前K個數據的均值,如果該組數據個數少於K時,則輸出該組所有數據的均值。輸出的均值只輸出整數部分,直接忽略小數部分。
樣例輸入:
3
10 30 20 40
-10 17 10
10 9
100
樣例輸出:
20
5
9
話說這次的題目已經明示考察的是數據的輸入以及輸出的知識,當然和以往我們所寫的代碼題沒有很大的區別,就是數據的輸入最后通過100來判斷輸入的結束;在一開始看到這題的時候,我覺得是可以不用通過字符串就能夠完成,因此就沒有考慮用字符串解題,通過一個整形數組的形式嘗試了一遍,以平時做的C題目習慣來看輸入輸出應該是都已經成功了的,可是提交的時候不知道為什么卻出現段錯誤的結果:

聽說挺多同學是這里出現了段錯誤,到現在還是不知道為什么會出現這樣的結果,如果哪位大哥看到這問題正好知道是怎么回事的話希望可以教教我哈,跪謝跪謝!
經過多次的嘗試之后,我就詢問了助教(不知道是為什么助教在聊了幾下,了解了我的問題之后就不回我了hhh,尷尬)后面挺多同學在群里討論這個題目的那些坑點,就再測試了一下我的程序,發現如果輸入遺傳數據之后最后加一個空格的話,就不會有輸出:

這應該是一個bug,但是對於它所提示的段錯誤我還是不能理解,下面是我最開始的通過整形數組實現的代碼。
#include<iostream>
using namespace std;
int main()
{
int number, len,aver,over=0;
int num[999],i,sum,n,j;
cin >> number;
for (i = 0; i < 999; i++)
{
cin >> num[0];
if (num[0] != 100)
{
j = 1;
sum = num[0];
aver = sum;
n = 1;
while (getchar() != '\n')
{
cin >> num[j];
sum += num[j];
n++;
aver = sum / n;
j++;
if (n == number)
{
printf("%d", aver);
}
// else
// over = 0;
}
if (n < number)
printf("%d", aver);
}
else if (num[0] == 100)
{
break;
}
}
return 0;
}
不知道其他人有沒有一種這樣的感覺就是在一開始如果用一種方法實現了一個問題(但是不知道為什么就是沒過),后面再要通過另一種方法重新實現的時候,會感覺特別別扭,並且做的時候思路會受到很大影響,感覺很艱難。但是沒辦法啊,咱總還是得做吧,無奈之下我只能是重新嘗試用字符串的方法實現,最開始我認為通過字符串的方法處理數字之間的空格可以通過判斷兩個數字之間有幾個空格來實現(因為題目說每兩個數字之間是1~3個空格),但是想了想,似乎這種方法可行度不是很高,畢竟整形數組那樣處理到頭來都還沒過,於是我就搜了有關於用字符串轉換數字其中數字之間的空格的處理方法,十分湊巧,百度的時候居然意外的看到了咱們的許郁楊大哥的博客!!!(尷尬的是最開始我還不知道這是他的博客hhh)
下面是這次意外看到的一種我認為挺好的通過字符串轉換數字時處理數字之間的空格的方法:
for(i=0;i<len;i++)
{
if(num[i]=='-')
{
temp=-1;
continue;
}
else if(num[i]>='0'&&num[i]<='9')
{
while(num[i]>='0'&&num[i]<='9')
{
num0=10*num0+(num[i]-'0');
i++;
}
numbers[j]=num0*temp;
j++;
temp=1;
}
num0=0;
}
這是借鑒許郁楊同學的方法之后我寫的代碼,
這里巧妙的通過一個while()來處理字符串中數字之間的其他字符(包括空格);然后其他后續的我想應該就很簡單了。
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
int number,aver,temp;
int i,sum,k,j,len,num0=0,numbers[100];
char num[1000];
cin >> number;
getchar();
for(k=0;k<999;k++)
{
j=0;
sum=0;
temp=1;
cin.getline(num,1000);
len=strlen(num);
// cout<<len<<endl;
for(i=0;i<len;i++)
{
if(num[i]=='-')
{
temp=-1;
continue;
}
else if(num[i]>='0'&&num[i]<='9')
{
while(num[i]>='0'&&num[i]<='9')
{
num0=10*num0+(num[i]-'0');
i++;
}
numbers[j]=num0*temp;
j++;
temp=1;
}
num0=0;
}
if(j==1&&numbers[0]==100)
break;
if(j==0)
continue;
if(j<number)
{
for(i=0;i<j;i++)
{
// cout<<numbers[i]<<endl;
sum+=numbers[i];
// cout<<sum<<endl;
}
aver=sum/(i);
cout<<aver<<endl;
}
else
{
for(i=0;i<number;i++)
{
// cout<<numbers[i]<<endl;
sum+=numbers[i];
// cout<<sum<<endl;
}
aver=sum/number;
cout<<aver<<endl;
}
}
return 0;
}
話說這次的作業是通過最后輸入一個100來判斷截止,輸入輸出問題還有許多和我們平時不太一樣的,比如說輸入的數據是不定數量的;我推薦一篇有關輸入的博客
其實幾天前就像寫一下這次作業的看法的,拖得有點久似乎。
