C語言程序設計基礎OJ練習題(實驗十結構體與共用體)

一、英文金曲大賽

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

我們在“淵子數”的題目中已經瞭解了淵子是個什麼樣的人了,他在大一的時候參加過工商學院的“英語聚樂部”。告訴你個祕密,這個俱樂部是個好地方,不但活動精彩而且有MM。
這不,英語俱樂部舉辦了一個叫做“英文金曲大賽”的節目。這個節目有好多人蔘加,這不,成績出來了,淵子當是很勇敢,自告奮勇接下了算出大家的總得分的任務。
當時有7個評委,每個評委都要給選手打分,現在要求去掉一個最高分和去掉一個最低分,再算出平均分。結果精確到小數點後兩位。

Input

測試數據包括多個實例。
每組數據包括7個實數,代表評委們對該選手的評分。緊接着是選手的名字,名字的長度不超過30個字符,且沒有空格。
輸入直到文件結束。

Output

算出每位選手名字和最終得分,結果保留兩位小數。

Sample Input

10 10 10 10 10 10 9 xiaoyuanwang
0 0 0 0 0 0 0 beast

Sample Output

xiaoyuanwang 10.00
beast 0.00

Hint

#include<stdio.h>
struct str{
    char name[30];
    int a[10];
    double grade;
};
int main()
{
    struct str s;
    while(scanf("%d%d%d%d%d%d%d%s",&s.a[0],&s.a[1],&s.a[2],&s.a[3],&s.a[4],&s.a[5],&s.a[6],s.name)!=EOF)
    {
        int sum,max,min;
        sum = max = min = s.a[0];
        for(int i=1;i<=6;i++)
        {
            sum = sum+s.a[i];
            if(s.a[i]>max)
                max = s.a[i];
            else if(s.a[i]<min)
                min = s.a[i];
        }
        sum = sum - max- min;
        s.grade = sum/5.0;
        printf("%s %.2lf\n",s.name,s.grade);
    }
    return 0;
}

 

二、名單真相

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

馬上就要考試了,小銀變的非常的緊張(平時不好好的聽課),昨天小銀得到了一個成績單,但是小銀在打印的時候將名單上人的順序倒置了,所以小銀想知道真正的順序。
成績單的每一行包括:姓名 城市 成績。姓名和城市保證全是小寫字母(不超過15個字符),成績不大於100.

Input

多組輸入,每組的第一行輸入一個n(1 <= n <= 1000).表示名單上人的數量,接下來n行每行包括人的姓名 城市 成績。

Output

輸出名單的真正的順序。

Sample Input

3
xiaotong ningbo 100
xiaoyin zhejiang 100
xiaojin jiangxi 100

Sample Output

xiaojin jiangxi 100
xiaoyin zhejiang 100
xiaotong ningbo 100

Hint

Source

2015級《程序設計基礎II》計科軟件期末上機考試1 - by 絕塵

#include<stdio.h>
struct str{
    char name[16];
    char city[16];
    int grade;
};
int main()
{
    struct str s[1001];
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%s %s %d",s[i].name,s[i].city,&s[i].grade);
        }
        for(int i=n-1;i>=0;i--)
        {
            printf("%s %s %d\n",s[i].name,s[i].city,s[i].grade);
        }
    }
    return 0;
}

 

三、選票統計

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

某校學生會主席由全校學生投票選舉產生,共有m名候選人報名參選,編號爲1到m(0<m<1000),全校有n名學生(0<n<30000),每人都可以投票。但每人只能投一票,每票只能選1名候選人。請你設計一個程序能夠統計出哪個候選人得票最高,得了多少票。不會出現得票數相同的情況。

Input

第一行輸入候選人數m和學生數n,以空格分開;
下面依次輸入每個學生所選的候選人的編號。

Output

第一行輸出得票最多的候選人編號;
第二行輸出該候選人所得的票數。

Sample Input

3 10
1 2 3 2 3 1 2 3 1 3

Sample Output

3
4

#include<stdio.h>
struct str
{
    int grade;
};
int main()
{
    struct str s[1001];
    int m,n,x,flag;
    scanf("%d%d",&m,&n);
    for(int i=1; i<=m; i++)
    {
        s[i].grade=0;
    }
    for(int i=0; i<n; i++)
    {
        scanf("%d",&x);
        s[x].grade++;
    }
    int max = 0;
    for(int i=1; i<=m; i++)
    {
        if(s[i].grade>max)
        {
            max = s[i].grade;
            flag = i;
        }
    }
    printf("%d\n%d\n",flag,max);
    return 0;
}

 

四、小鑫の日常系列故事(十)——排名次

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

小鑫在來到SDUT之後,經過十分刻苦的學習和努力終於進入了ACM集訓隊。很快又一次ACM集訓隊的選拔就要開始了,集訓隊員們又忙碌了起來。他也十分幸運的被學長抓來當苦力。  o(∩_∩)o 

這次學長給他分配的任務是寫一個自動排名的程序,我們知道當選拔賽結束的時候,每一個參與選拔的同學都會有一個自己的分數。而集訓隊需要根據大家的分數排名來決定誰能夠進入集訓隊,這個任務就落在了小鑫身上。

你能幫小鑫來完成這個程序麼?

Input

 輸入的第一行爲n  0<n<=50;

下面還有n行每行爲一個人名和ta所得到的分數。保證沒有相同的分數。

人名爲英文單詞,長度不超過10。

Output

 輸出爲n行,每行一個人名與他的得分。每一行最後沒有多餘的空格。

具體輸出格式見樣例。

Sample Input

3
Dan 10
John 50
Danny 30

Sample Output

John 50
Danny 30
Dan 10

Hint

#include<stdio.h>
struct str
{
    char name[20];
    int grade;
};
int main()
{
    struct str s[101];
    struct str flag;
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%s%d",s[i].name,&s[i].grade);
    }
    for(int i=0; i<n; i++)
    {
        for(int j = 0;j<n-i-1;j++)
        {
            if(s[j].grade<s[j+1].grade)
            {
                flag = s[j];
                s[j] = s[j+1];
                s[j+1] = flag;
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("%s %d\n",s[i].name,s[i].grade);
    }
    return 0;
}

 

五、最終排名

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

第四屆山東理工大學ACM網絡編程擂臺賽比賽完後需要產生一個最終排名,排名按照題數多少來決定。但是有太多的隊伍參與,手動計算排名已經不能滿足比賽的需求。現在有一份名單記錄各個隊伍的ID和做出的題目數,需要你寫一個程序,產生最終的排名。

爲了簡化題目,這裏的排名規則爲:做出題目數量多的隊伍排在前面,如果題數相等,保持輸入時的相對順序不要改變。

Input

第一行包含一個正整數T( 1 ≤ T ≤ 15),表示有T組測試數據。每組數據第一行有一個正整數N(1 <  N ≤ 10000),表示隊伍數量。接下來N 行包含兩個整數,1 ≤ ID ≤ 10^7, 0 ≤ M ≤ 100。ID爲隊伍的編號,M爲做出的題數。

 

Output

每組數據輸出包含N行,第i行有兩個整數,ID和M表示排在第i位的隊伍的ID和做出的題數。

 

Sample Input

1
8
1 2
16 3
11 2
20 3
3 5
26 4
7 1
22 4

Sample Output

3 5
26 4
22 4
16 3
20 3
1 2
11 2
7 1

#include<stdio.h>
struct str
{
    int name;
    int grade;
};
int main()
{
    struct str s[1000001];
    struct str flag;
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%d %d",&s[i].name,&s[i].grade);
        }
        for(int i=0; i<n; i++)
        {
            for(int j = 0; j<n-i-1; j++)
            {
                if(s[j].grade<s[j+1].grade)
                {
                    flag = s[j];
                    s[j] = s[j+1];
                    s[j+1] = flag;
                }
            }
        }
        for(int i=0; i<n; i++)
        {
            printf("%d %d\n",s[i].name,s[i].grade);
        }
    }
    return 0;
}

 

六、老--質價比

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

給出n件物品,每件物品有質量和價格兩種屬性。你要做的是按質量升序排序,若質量相同則按價格降序排序。

Input

多組輸入。每組先輸入一個正整數n(1<=n && n <= 100),代表有n件物品。接下來的一行有n個正整數Wi(1<= Wi && Wi <= 10000),代表每件物品的質量。再接下來的一行有n個正整數Pi(1 <= Pi && Pi <= 10000),代表每件物品的價格。

Output

對於每組數據輸出n行,每行兩個數Wi,Pi。順序爲題目描述所要求。

Sample Input

3
1 2 2
3 2 3

Sample Output

1 3
2 3
2 2

Hint

#include<stdio.h>
struct str
{
    int wi;
    int pi;
};
int main()
{
    struct str s[10001];
    struct str flag;
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&s[i].wi);
        }
        for(int i=0; i<n; i++)
        {
            scanf("%d",&s[i].pi);
        }
        for(int i=0; i<n; i++)
        {
            for(int j = 0; j<n-i-1; j++)
            {
                if(s[j].wi>s[j+1].wi)
                {
                    flag = s[j];
                    s[j] = s[j+1];
                    s[j+1] = flag;
                }
                else if(s[j].wi==s[j+1].wi)
                {
                    if(s[j].pi<s[j+1].pi)
                    {
                        flag = s[j];
                        s[j] = s[j+1];
                        s[j+1] = flag;
                    }
                }
            }
        }
        for(int i=0; i<n; i++)
        {
            printf("%d %d\n",s[i].wi,s[i].pi);
        }
    }
    return 0;
}

 

七、共用體練習

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

 給定n和m,接下來有n個描述,每個描述包含一個類型標誌和一組相應的數據。類型標誌共3種:INT DOUBLE STRING,然後對應一組相應的數據。緊接着有m個詢問,每個詢問僅包含一個整數x,要求輸出第x個描述對應的數據(STRING類型保證不含空格,每組對應STRING數據不會超過19個字符)。

 

Input

輸入的第一行爲兩個整數,n和m (n<=100000, m<=100000),分別代表描述的個數和詢問的個數。接下來爲 n 行描述,最後爲m行詢問,具體格式見樣例輸入輸出。

Output

對於每個詢問,輸出對應的結果,注意:浮點數保留兩位小數。

Sample Input

5 4
INT 456
DOUBLE 123.56
DOUBLE 0.476
STRING welcomeToC
STRING LemonTree
0
1
2
4

Sample Output

456
123.56
0.48
LemonTree

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
union data
{
    char str[20];
    double number;
    int number2;
};
struct                                                                        
{
    char type[20];
    union data num;                                                      //共用體嵌入在結構體裏
}s[100001];
int main()
{
    int n,m,x,i;
    scanf("%d %d",&n,&m);
    for(i = 0 ; i<n ; i++)
    {
        scanf("%s",s[i].type);
        if(strcmp(s[i].type,"STRING")==0)
            scanf("%s",s[i].num.str);
        else if(strcmp(s[i].type,"INT")==0)
            scanf("%d",&s[i].num.number2);
        else if(strcmp(s[i].type,"DOUBLE")==0)
            scanf("%lf",&s[i].num.number);
    }
    for(i = 0; i <m ; i++)
    {
        scanf("%d",&x);
        if(strcmp(s[x].type,"STRING")==0)
            printf("%s\n",s[x].num.str);
        else if(strcmp(s[x].type,"INT")==0)
            printf("%d\n",s[x].num.number2);
        else if(strcmp(s[x].type,"DOUBLE")==0)
            printf("%.2lf\n",s[x].num.number);
    }
    return 0;
}

 

、選夫婿2

Time Limit: 1000 ms Memory Limit: 32768 KiB

Submit Statistic

Problem Description

       傾國傾城的大家閨秀潘小姐要選夫婿啦!武林中各門各派,武林外各大戶人家,聞訊紛紛前來,強勢圍觀。前來參與競選的男生藏龍臥虎,高手雲集,才子遍佈,帥哥紛紜,更不乏富二代,官二代,可謂聲勢空前。

 

       每個人參與競選的帥哥除了進行一段激情洋溢的求婚演講以外,還要報上自己姓名、身高,以及個人簡歷。最後再進行文武選拔,最後奪魁者方能得到潘小姐的芳心。

       潘小姐不愛名利,只看人,第一關就是身高要合格,即必須在其要求的範圍內,否則直接排除在外,不允許參加下一輪的選拔。

       作爲一個程序員,你沒有錢也沒有權,擅長的也就是編程了。潘小姐也發現了這一點,所以把首輪根據身高進行選拔的任務交給了你,如果完成的好,你可以直接進入下一輪選拔,你笑了。

 

Input

       潘小姐給你了所有報名男生的信息。輸入數據的第一行是一個正整數N(0 < N < 100)。然後N行數據,每行包含兩部分,用空格隔開。第一部分是報名者的姓名name(長度小於20的字符串),然後是整數身高h(0 < h < 300)。最後一行是兩個整數a,b.表示身高的合格範圍是[a,b]。

Output

       你需要把合格的男生信息按照身高從低到高輸出,格式跟輸入一樣,也是每行兩個信息,共N行,若沒有合格人選則輸出No,具體格式見樣例。

Sample Input

8
武大郎 70
西門慶 182
李逵 160
燕青 175
魯智深 195
武松 180
小泉純一狼 30
孫二孃 169
165 190

Sample Output

孫二孃 169
燕青 175
武松 180
西門慶 182

#include<stdio.h>
struct str
{
    char name[21];
    int h;
};
int main()
{
    struct str s[10001];
    struct str st;
    int n,x,y,flag;
    flag = 0;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%s%d",s[i].name,&s[i].h);
    }
    for(int i=0; i<n; i++)
    {
        for(int j = 0; j<n-i-1; j++)
        {
            if(s[j].h>s[j+1].h)
            {
                st = s[j];
                s[j] = s[j+1];
                s[j+1] = st;
            }
        }
    }
    scanf("%d%d",&x,&y);
    for(int i=0; i<n; i++)
    {
        if(s[i].h>=x&&s[i].h<=y)
        {
            printf("%s %d\n",s[i].name,s[i].h);
            flag = 1;
        }
    }
    if(flag==0)
        printf("No\n");
    return 0;
}

 

九、選夫婿1

Time Limit: 1000 ms Memory Limit: 32768 KiB

Submit Statistic

Problem Description

    傾國傾城的大家閨秀潘小姐要選夫婿啦!武林中各門各派,武林外各大戶人家,聞訊紛紛前來,強勢圍觀。前來參與競選的男生藏龍臥虎,高手雲集,才子遍佈,帥哥紛紜,更不乏富二代,官二代,可謂聲勢空前。

    每個人參與競選的帥哥除了進行一段激情洋溢的求婚演講以外,還要報上自己姓名、身高和體重,以及個人簡歷。最後再進行文武選拔,最後奪魁者方能得到潘小姐的芳心。

       潘小姐不愛名利,只看人,第一關就是身高和體重要合格,即必須在其要求的範圍內,否則直接排除在外,不允許參加下一輪的選拔。

       作爲一個程序員,你沒有錢也沒有權,擅長的也就是編程了。潘小姐也發現了這一點,所以把首輪根據身高體重進行選拔的任務交給了你,如果完成的好,你可以直接進入下一輪選拔,你笑了。

Input

        潘小姐給你了所有報名男生的信息。輸入數據的第一行是一個正整數N(0 < N < 1000)。然後N行數據,每行包含三部分,用空格隔開。第一部分是報名者的姓名name(長度小於20的字符串),然後是整數身高h(0 < h < 300),第三部分是整數體重w (0 < w < 200)。

最後一行是四個整數a,b,c,d.表示身高的合格範圍是[a,b],體重的合格範圍是[c,d](0 < a < b < 200, 0 < c < d < 300)。

 

Output

        你需要把合格的男生信息按照身高從低到高輸出,格式跟輸入一樣,也是每行三個信息,共N行,如果身高相同則按體重從輕到重輸出,若沒有合格人選則輸出No,具體格式見樣例。

 

Sample Input

8
武大郎 70 40
西門慶 180 70
李逵 160 150
燕青 175 69
魯智深 180 100
武松 180 75
小泉純一狼 30 20
孫二孃 169 60
165 190 60 90

Sample Output

孫二孃 169 60
燕青 175 69
西門慶 180 70
武松 180 75

Hint

#include<stdio.h>
struct str
{
    char name[21];
    int h;
    int w;
};
int main()
{
    struct str s[10001];
    struct str st;
    int n,x,y,p,q,flag;
    flag = 0;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%s%d%d",s[i].name,&s[i].h,&s[i].w);
    }
    for(int i=0; i<n; i++)
    {
        for(int j = 0; j<n-i-1; j++)
        {
            if(s[j].h>s[j+1].h)
            {
                st = s[j];
                s[j] = s[j+1];
                s[j+1] = st;
            }
            else if(s[j].h==s[j+1].h)
            {
                if(s[j].w>s[j+1].w)
                {
                    st = s[j];
                    s[j] = s[j+1];
                    s[j+1] = st;
                }
            }
        }
    }
    scanf("%d%d%d%d",&x,&y,&p,&q);
    for(int i=0; i<n; i++)
    {
        if(s[i].h>=x&&s[i].h<=y&&s[i].w>=p&&s[i].w<=q)
        {
            printf("%s %d %d\n",s[i].name,s[i].h,s[i].w);
            flag = 1;
        }
    }
    if(flag==0)
        printf("No\n");
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章