PAT B1038/B1039 統(tǒng)計同成績學生 (20分) 、到底買不買 (20分)

今天起晚了,八點多起的,所以心情不是很好,感覺時間白浪費了。
今天又因為一點小失誤,造成我在編程題目上白白浪費幾個小時。
趁我還很有感觸,趕緊寫下來。
ps,今天題目還是散列,仍舊很簡單,我不進行代碼解釋了,因為還有抽出時間復習其他科目。

B1038

1038 統(tǒng)計同成績學生 (20分)
本題要求讀入 N 名學生的成績,將獲得某一給定分數(shù)的學生人數(shù)輸出。

輸入格式:
輸入在第 1 行給出不超過 10
?5
?? 的正整數(shù) N,即學生總?cè)藬?shù)。隨后一行給出 N 名學生的百分制整數(shù)成績,中間以空格分隔。最后一行給出要查詢的分數(shù)個數(shù) K(不超過 N 的正整數(shù)),隨后是 K 個分數(shù),中間以空格分隔。

輸出格式:
在一行中按查詢順序給出得分等于指定分數(shù)的學生人數(shù),中間以空格分隔,但行末不得有多余空格。

輸入樣例:
10
60 75 90 55 75 99 82 90 75 50
3 75 90 88
輸出樣例:
3 2 0


這個題目經(jīng)典送分,可以一遍過的

#include <cstdio>
using namespace std;

int totalStudent;
int personalScore;
int queryNumber;
int question;
int scores[101] = {0};

int main()
{
    scanf("%d", &totalStudent);
    for (int i = 0; i < totalStudent; i++)
    {
        scanf("%d", &personalScore);
        scores[personalScore]++;
    }
    //讀入數(shù)據(jù),述標初始化完畢
    
    //讀入查詢
    scanf("%d", &queryNumber);
    for (int i = 0; i < queryNumber; i++)
    {
        scanf("%d", &question);
        if (i==0)
        {
            printf("%d", scores[question]);
        }
        else
        {
             printf(" %d", scores[question]);
        }
        
    }
    return 0;
}

不講了,省省時間。下面看看我是怎么錯的1039的吧

image.png

B1039

錯誤非常不應該,我遇到問題之后就努力進行錯誤排查,從思路上,從代碼拼寫上,以及從空間時間上都進行了考慮,并且做了N次對照試驗(把一些代碼注釋替換,并提交,從而尋找問題),都沒能成功。
很懊喪,
然后我就先睡一會,睡之前我把代碼發(fā)給自己的qq,可以醒來翻看
睡的時候,我腦子仍然在動畫演示流程,想想到底是哪里出了錯誤
沒想出來
醒來之后,翻看qq上的代碼
一看,發(fā)現(xiàn)....
(下面是正確的代碼)


#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
/* 
就今天我要弄清楚cstring和string的區(qū)別
*/
/* 
分清楚hashTable申請的字節(jié)空間1024和hashTable本身int的大小256
*/

using namespace std;

int hashTable[256] = {0};
string forSale;
string wannaMake;

int main()
{
    // freopen("write.in","r",stdin);
    // freopen("ans.out","w",stdout);
    // while (getline(cin, forSale))

    getline(cin, forSale);
    getline(cin, wannaMake);
    for (int i = 0; i < forSale.length(); i++)
    {
        hashTable[forSale[i]]++;
    }
    for (int i = 0; i < wannaMake.length(); i++)
    {
        hashTable[wannaMake[i]]--;
    }



    bool flag = true;
    for (int i = 0; i < 256; i++)
    {
        if (hashTable[i] < 0)
        {
            flag = false;
            break;
        }
    }




    if (flag == true)
    {
        printf("Yes ");

        int sum=0;//sum記錄多余的
        for (int i = 0; i < 256; i++)
        {
            sum += hashTable[i];
        }
        printf("%d", sum);
    }
    else
    {
        printf("No ");

        int sum=0;//sum記錄缺少的
        for (int i = 0; i < 256; i++)
        {
            if (hashTable[i] < 0)
            {
                sum += hashTable[i];
            }
        }
        printf("%d", -sum);
    }


    //     cout<<endl;

    // fclose(stdin);
    // fclose(stdout);
    return 0;
}
image.png

image.png

只是因為這兩處sum忘記初始化成0了


著實浪費感情
一朝被蛇咬,十年怕草繩
以后這種錯誤我會堅決避免的

最后,補上一個知識點

課代表??


#include <cstring> //不可以定義string s;可以用到strcpy等函數(shù)
using namespace std;

#include <string> //可以定義string s;可以用到strcpy等函數(shù)
using namesapce std;

#include <string.h> //不可以定義string s;可以用到strcpy等函數(shù)
我以前一直是抱著以防萬一的心態(tài),把string和cstring都包含進來的
但其實
簡單總結(jié)一下,以后直接包含進來string頭文件就可以了

1)文件cstring,和string.h對應,c++版本的頭文件,包含比如strcpy之類的字符串處理函數(shù)
2)文件string.h,和cstring對應,c版本的頭文件,包含比如strcpy之類的字符串處理函數(shù)
3)文件string,包含std::string的定義,屬于STL范疇
4)CString,MFC里的的字符串類


行了,今天到這,光速更新我是萬萬沒想到的
可能這就是高產(chǎn)吧

Chant

886~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容