【C/PTA】結構體專項練習

本文結合PTA專項練習帶領讀者掌握結構體,刷題為主注釋為輔,在代碼中理解思路,其它不做過多敘述。

目錄

    • 6-1 選隊長
    • 6-2 按等級統計學生成績
    • 6-3 學生成績比高低
    • 6-4 綜合成績
    • 6-5 利用“選擇排序算法“對結構體數組進行排序
    • 6-6 結構體的最值
    • 6-7 復數相乘運算
    • 7-5 一幫一
    • 7-6 考試座位號

6-1 選隊長

小明最近喜歡玩一款新游戲。在該游戲中,需要組建隊伍去完成任務以獲取獎勵。小明挑出了所有的隊員(每個人能力不同),需要一個函數挑出隊長(能力最強的隊員)。
函數接口定義:

void showCaptain(TeamMember team[], int n);

參數說明:team中從下標0開始存放n個TeamMember,n>0。
函數功能:找出隊長并輸出其各項信息
裁判測試程序樣例:

#include<stdio.h>#include<stdlib.h>#define NAME_LEN 100#define SEX_LEN 6typedef struct {int id;//身份證號碼char lastname[NAME_LEN+1];//姓char firstname[NAME_LEN+1];//名char sex[SEX_LEN];//性別double ability;} TeamMember;void showCaptain(TeamMember team[], int n);int main(){TeamMember *team;int n;int i;scanf("%d",&n);team = (TeamMember *)malloc(n*sizeof(TeamMember));for(i=0;i<n;i++){scanf("%d %s %s %s %lf",&team[i].id,team[i].lastname, team[i].firstname, team[i].sex, &team[i]. ability);}showCaptain(team, n);return 0;}/* 您提交的代碼將放置在這里 */

輸入樣例:

3
123456 zhang san male 100
123457 li si female 200.5
123458 wang ming male 159.1

輸出樣例:

123457 li si female 200.50

void showCaptain(TeamMember team[], int n)
{double x=team[0].ability;int y=0;for(int i=0;i<n;i++){if(x<team[i].ability){x=team[i].ability;y=i;}}printf("%d %s %s %s %.2f",team[y].id,team[y].lastname,team[y].firstname,team[y].sex,team[y].ability);
}

6-2 按等級統計學生成績

本題要求實現一個根據學生成績設置其等級,并統計不及格人數的簡單函數。
函數接口定義:

int set_grade( struct student *p, int n );

其中p是指向學生信息的結構體數組的指針,該結構體的定義為:

struct student{int num;char name[20];int score;char grade;
};

n是數組元素個數。學號num、姓名name和成績score均是已經存儲好的。set_grade函數需要根據學生的成績score設置其等級grade。等級設置:85-100為A,70-84為B,60-69為C,0-59為D。同時,set_grade還需要返回不及格的人數。
裁判測試程序樣例:

#include <stdio.h>#define MAXN 10struct student{int num;char name[20];int score;char grade;};int set_grade( struct student *p, int n );int main(){   struct student stu[MAXN], *ptr;int n, i, count;ptr = stu;scanf("%d\n", &n);for(i = 0; i < n; i++){scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);} count = set_grade(ptr, n);printf("The count for failed (<60): %d\n", count);printf("The grades:\n"); for(i = 0; i < n; i++)printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);return 0;}/* 你的代碼將被嵌在這里 */

輸入樣例:

10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78

輸出樣例:

The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B

int set_grade( struct student *p, int n )
{int count=0;for(int i=0;i<n;i++){if(p[i].score<=100&&p[i].score>=85)p[i].grade='A';if(p[i].score<=84&&p[i].score>=70)p[i].grade='B';if(p[i].score<=69&&p[i].score>=60)p[i].grade='C';if(p[i].score<=59&&p[i].score>=0){p[i].grade='D';	count++;}}return count;
}

6-3 學生成績比高低

學生結構體定義如下:

struct Student{int sid;int C;int English;
};

其中sid是學號,C是C語言課程成績,English是英語課程成績。學生的成績按照這樣的規則比較:

先比較兩門課的總成績,總成績高的為優;
若總成績相同,再比較C語言成績,C語言成績高的為優;
若C語言成績也相同,則說明兩名學生成績相等。

編寫函數實現成績的比較。
函數接口定義:

int compareScore(const struct Student *s1, const struct Student *s2);

其中s1和s2是傳入的參數,分別指向兩名學生的結構體變量。函數返回值為int型,

若s1所指學生成績優于s2所指學生,返回1;
若s2所指學生成績優于s1所指學生,返回-1;
若兩學生成績相等,返回0。

裁判測試程序樣例:

/* 此測試程序僅為示例,實際的測試程序可能不同。

注意:實際的測試程序可能有多組輸入、進行多次比較,輸入格式也有可能不同,

因此不要針對測試程序樣例編寫代碼,而應當編寫符合題目要求的函數 */

#include <stdio.h>struct Student{int sid;int C;int English;};int compareScore(const struct Student *s1, const struct Student *s2);int main(){struct Student zs, ls;scanf("%d%d%d", &zs.sid, &zs.C, &zs.English);scanf("%d%d%d", &ls.sid, &ls.C, &ls.English);int r;r = compareScore(&zs, &ls);if(r < 0) printf("Less\n");else if(r > 0) printf("Greater\n");else printf("Equal\n");return 0;}/* 你所編寫的函數代碼將被嵌在這里 */

輸入樣例1:

對于樣例測試程序的輸入格式:

1 95 90
2 90 91

輸出樣例1:

對于樣例測試程序的輸出格式:

Greater

輸入樣例2:

對于樣例測試程序的輸入格式:

1 90 95
2 95 90

輸出樣例2:

對于樣例測試程序的輸出格式:

Less

int compareScore(const struct Student *s1, const struct Student *s2){if(s1->C+s1->English>s2->C+s2->English)return 1;else if(s1->C+s1->English<s2->C+s2->English)return -1;else if(s1->C+s1->English==s2->C+s2->English){if(s1->C>s2->C)return 1;else if(s1->C<s2->C)return -1;else if(s1->C==s2->C)return 0;}
}

6-4 綜合成績

小明的公司為了招聘新員工設計了一套考試方案。從表達能力、邏輯能力、人文素質、科學素質、計算思維5個方面進行考察。綜合成績 = 表達能力0.4+邏輯能力0.5+人文素質0.3+科學素質0.6+計算思維*0.8。要求定義一個計算綜合成績的函數。
函數接口定義:

double getAverage(Applicant *a);

a中存放一個應聘者的考試成績。要求返回綜合成績。
裁判測試程序樣例:

#include <stdio.h>#include <stdlib.h>typedef struct{int presentation;int logical;int humanistic;int scientific;int computational;}Applicant;double getAverage(Applicant* a);int main(){Applicant a;double overall;scanf("%d%d%d%d%d", &a.presentation,&a.logical,&a.humanistic,&a.scientific,&a.computational);overall = getAverage(&a);printf("%.2f\n",overall);return 0;}

/* 您提交的代碼將放置在這里 */

輸入樣例:

100 100 100 100 100

輸出樣例:

260.00

double getAverage(Applicant *a)
{double sum=0;sum=0.4*a->presentation+0.5*a->logical+0.3*a->humanistic+0.6*a->scientific+0.8*a->computational;return sum;
}

6-5 利用“選擇排序算法“對結構體數組進行排序

本題:補充函數 sortByChoose()的剩余部分,其要求是利用選擇排序算法根據學生成績(score)實現對結構體數組元素降序排序。
函數接口定義:

void sortByChoose(struct Student *pData,int n)

裁判測試程序樣例:

#include<stdio.h>#include<stdlib.h>#define N 10struct Student{int num;int score;};    void sortByChoose(struct Student *pData,int n);int main(void){    struct Student data[10],*p;int i;for(p=data,i=0;i<N;i++){scanf("%d %d",&p->num,&p->score);p++;}sortByChoose(data,N);for (p=data,i=0;i<N;i++){printf("%2d-%-5d", p->num, p->score);p++;}return 0;}void sortByChoose(struct Student *pData,int n){struct Student *p1,*p2,*p;int num, score,i,j;for(p1=pData;p1<pData+n-1;p1++) {/* 請在這里填寫答案 */}}

輸入樣例:

29 90
15 80
87 55
65 84
35 80
33 55
44 79
99 80
89 80
41 55

輸出樣例:

29-90 65-84 15-80 35-80 99-80 89-80 44-79 87-55 33-55 41-55

p=p1;
for(p2=p1+1;p2<pData+n;p2++)
{if(p2->score>p->score)//判斷{p=p2;}
}if(p!=p1)//交換
{num=p->num;p->num=p1->num;p1->num=num;score=p->score;p->score=p1->score;p1->score=score;
}

6-6 結構體的最值

學生類型ST的定義如下:

typedef struct student{
char name[10],id[10];
int gender;
int age;
double scored;
} ST;

編寫函數,返回指定學生數組中的男生或女生的最高分的地址(約定:整數0和1分別代表男和女)。
函數接口定義:

ST* MaxST(ST d[],int n,int k);//k=0|1

其中 d 是學生數組的初地址, n是數組的長度, k 是查找的性別描述(值確保是0或1),函數須返回指定類型學生中的最高分者的地址,如果不存在,返回空地址。
裁判測試程序樣例:

在這里給出函數被調用進行測試的例子。例如:

#include <stdio.h>#include <stdlib.h>typedef struct student{char name[10],id[10];int gender;int age;double scored;} ST;void output(ST *d){//輸出一個記錄if(d==NULL) {printf("null\n");return;}printf("%s,%s,%d,%d,%4.2f\n",d->name,d->id,d->gender,d->age,d->scored);}ST* InitData(int n);//從輸入設備上輸入相關數據,略去不表ST* MaxST(ST d[],int n,int k);//k=0|1  <--需要完成的函數:找最值int main(){int i,n;scanf("%d\n",&n);ST *p=InitData(n);output(MaxST(p,n,0));    output(MaxST(p,n,1));free(p);return 0;}/* 請在這里填寫答案 */

輸入樣例:

第一行是記錄個數,余下若干行是相關數據(以空格分隔,每行一個)。

6
Marry.MK 20201125 0 19 92.86
J.Mark 20201185 0 17 90.93
rouh.M 20201102 1 18 79.51
byi.beee 20201129 1 17 90.28
floyd.Fd 20201150 0 17 81.16
grdda 20201146 1 19 85.52

輸出樣例:

輸出男,女同學中的最高分(只需要找出并返回其地址,輸入,輸出由測試程序完成)。

Marry.MK,20201125,0,19,92.86
byi.beee,20201129,1,17,90.28

ST* MaxST(ST d[],int n,int k)
{double max=-1;//初始化最高分為一個較小的值int index=-1;//初始化索引為-1,表示不存在滿足條件的學生for(int i=0;i<n;i++){if(d[i].gender==k)//根據輸入的性別條件進行篩選{if(d[i].scored>max)//找到性別符合條件的學生中的最高分{max=d[i].scored;index=i;//更新最高分的索引}}}if(index!=-1){return &d[index];//返回最高分學生的地址}else{return NULL;//如果不存在滿足條件的學生,返回空地址}
}

6-7 復數相乘運算

本題要求實現一個函數,可計算兩個復數相乘的積。
函數接口定義:

PLEX multi(PLEX a,PLEX b);

其中 a 和 b 都是復數,返回值也為復數,值為a*b的值。
裁判測試程序樣例:

#include <stdio.h>typedef struct{float re,im;}PLEX;PLEX multi(PLEX a,PLEX b);int main(){PLEX x,y,z;scanf("%f%f",&x.re,&x.im);scanf("%f%f",&y.re,&y.im);z=multi(x,y);if(z.im>=0)printf("%.2f+%.2fi",z.re,z.im);elseprintf("%.2f%.2fi",z.re,z.im);return 0;}/* 請在這里填寫答案 */

輸入樣例:

1 2
3 4

輸出樣例:

-5.00+10.00i

PLEX multi(PLEX a,PLEX b)
{PLEX T;T.re=a.re*b.re-a.im*b.im;T.im=a.re*b.im+a.im*b.re;return T;
}

7-5 一幫一

“一幫一學習小組”是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠后的學生排在一組。本題就請你編寫程序幫助老師自動完成這個分配工作,即在得到全班學生的排名后,在當前尚未分組的學生中,將名次最靠前的學生與名次最靠后的異性學生分為一組。
輸入格式:

輸入第一行給出正偶數N(≤50),即全班學生的人數。此后N行,按照名次從高到低的順序給出每個學生的性別(0代表女生,1代表男生)和姓名(不超過8個英文字母的非空字符串),其間以1個空格分隔。這里保證本班男女比例是1:1,并且沒有并列名次。
輸出格式:

每行輸出一組兩個學生的姓名,其間以1個空格分隔。名次高的學生在前,名次低的學生在后。小組的輸出順序按照前面學生的名次從高到低排列。
輸入樣例:

8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

輸出樣例:

Amy Jack
Tom Linda
Bill Maya
Cindy John

#include <stdio.h>
int main()
{int n;scanf("%d",&n);int sex[n];char name[n][9];for(int i=0;i<n;i++){scanf("%d %s",&sex[i],name[i]);}int exist[n]={0};for(int p=0;p<n/2;p++)//與后面的printf相呼應,保證輸出的時候名次高的在前{for(int q=n-1;q>=n/2;q--){if(sex[p]!=sex[q]&&exist[p]==0&&exist[q]==0)//如果性別不同且沒組過隊{printf("%s %s\n",name[p],name[q]);exist[p]=exist[q]=1;}}}
}

7-6 考試座位號

每個 PAT 考生在參加考試時都會被分配兩個座位號,一個是試機座位,一個是考試座位。正常情況下,考生在入場時先得到試機座位號碼,入座進入試機狀態后,系統會顯示該考生的考試座位號碼,考試時考生需要換到考試座位就座。但有些考生遲到了,試機已經結束,他們只能拿著領到的試機座位號碼求助于你,從后臺查出他們的考試座位號碼。
輸入格式:

輸入第一行給出一個正整數 N(≤1000),隨后 N 行,每行給出一個考生的信息:準考證號 試機座位號 考試座位號。其中準考證號由 16 位數字組成,座位從 1 到 N 編號。輸入保證每個人的準考證號都不同,并且任何時候都不會把兩個人分配到同一個座位上。

考生信息之后,給出一個正整數 M(≤N),隨后一行中給出 M 個待查詢的試機座位號碼,以空格分隔。
輸出格式:

對應每個需要查詢的試機座位號碼,在一行中輸出對應考生的準考證號和考試座位號碼,中間用 1 個空格分隔。
輸入樣例:

4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

輸出樣例:

3310120150912002 2
3310120150912119 1

#include <stdio.h>
int main()
{int n;scanf("%d",&n);char sfz[n][20];int sj[n],ks[n];for(int i=0;i<n;i++){scanf("%s",sfz[i]);scanf("%d %d",&sj[i],&ks[i]);}int m;scanf("%d",&m);int chaxun[m];for(int i=0;i<m;i++){scanf("%d",&chaxun[i]);int s=chaxun[i];for(int j=0;j<n;j++){if(s==sj[j]){printf("%s %d\n",sfz[j],ks[j]);}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206619.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

香港商標注冊申請所需資料及辦理流程

作為東方明珠&#xff0c;自由港香港是世界上較自由的貿易通商口岸&#xff0c;再加上本身良好的基礎設施和健全的法律制度&#xff0c;這給企業家提供了得天獨厚的營商環境。在香港注冊商標&#xff0c;可以迅速提高企業的知名度&#xff0c;提升企業不斷成長的競爭力&#xf…

全新UI彩虹外鏈網盤系統源碼V5.5/支持批量封禁+優化加載速度+用戶系統與分塊上傳

源碼簡介&#xff1a; 全新UI彩虹外鏈網盤系統源碼V5.5&#xff0c;它可以支持批量封禁優化加載速度。新增用戶系統與分塊上傳。 彩虹外鏈網盤&#xff0c;作為一款PHP網盤與外鏈分享程序&#xff0c;具備廣泛的文件格式支持能力。它不僅能夠實現各種格式文件的上傳&#xff…

CLASS60 DM藍牙5.2雙模熱插拔PCB

鍵盤使用說明索引&#xff08;均為出廠默認值&#xff09; 軟件支持&#xff08;驅動的詳細使用幫助&#xff09;一些常見問題解答&#xff08;FAQ&#xff09;首次使用步驟藍牙配對規則&#xff08;重要&#xff09;藍牙和USB切換鍵盤默認層默認觸發層0的FN鍵配置的功能默認功…

使用word中的VBA 批量設置Word中所有圖片大小

在VBA編輯器中&#xff0c;你可以創建、編輯和運行VBA宏代碼&#xff0c;以實現自動化任務和自定義Word 功能。如果你是VBA編程初學者&#xff0c;可以在VBA編輯器中查看Word VBA宏代碼示例&#xff0c;以便更好地了解如何使用VBA編寫代碼。 要打開VBA編輯器&#xff0c;你可以…

【Vue】修改組件樣式并動態添加樣式

文章目錄 目標修改樣式動態添加/刪除樣式樣式不生效 注意&#xff1a;類似效果el-step也可以實現&#xff0c;可以不用手動實現。這里只是練習。 目標 使用組件庫中的組件&#xff0c;修改它的樣式并動態添加/刪除樣式。 修改樣式 組件中的一些類可能添加樣式無法生效。如Ele…

[java學習日記]反射、動態代理

目錄 一.反射的簡單解釋與獲取字節碼文件對象 二.獲取構造方法對象Constructor 三.反射獲取字節碼文件中的成員變量Field 四.反射獲取字節碼文件中的成員方法&#xff1a;Method 五.反射練習&#xff1a;保存信息 六.反射練習&#xff1a;利用配置文件&#xff08;存儲類名…

《python每天一小段》-- (11)操作 Excel 詳解

歡迎閱讀《Python每天一小段》系列&#xff01;在本篇文章中&#xff0c;將使用Python編寫自動化 Excel 操作的程序。 文章目錄 &#xff08;1&#xff09;Python 操作 Excel 詳解&#xff08;2&#xff09;創建 DataFrame 對象&#xff08;3&#xff09;讀取 Excel 文件&#…

day8 翻轉字符串中的每個單詞

void reverse(string& s, int start, int end){ //翻轉&#xff0c;區間寫法&#xff1a;左閉右閉 [] for (int i start, j end; i < j; i, j--) { swap(s[i], s[j]); } } void removeExtraSpaces(string& s) {//去除所有空格并在相鄰單詞之間添加空格, 快慢指針。…

第21章:網絡通信

21.1 網絡程序設計基礎 21.1.1 局域網與互聯網 為了實現兩臺計算機的通信&#xff0c;必須用一個網絡線路連接兩臺計算機。如下圖所示 21.1.2 網絡協議 1.IP協議 IP是Internet Protocol的簡稱&#xff0c;是一種網絡協議。Internet 網絡采用的協議是TCP/IP協議&#xff0…

Google Bard vs. ChatGPT 4.0:文獻檢索、文獻推薦功能對比

在這篇博客中&#xff0c;我們將探討和比較四個不同的人工智能模型——ChatGPT 3.5、ChatGPT 4.0、ChatGPT 4.0插件和Google Bard。我們將通過三個問題的測試結果來評估它們在處理特定任務時的效能和響應速度。 導航 問題 1: 統計自Vehicle Routing Problem (VRP)第一篇文章發…

netty源碼:(4)ServerBootstrap

ServerBootstrap的group方法用來給成員變量賦值&#xff0c;如下圖 AbstractBootstrap為ServerBootstrap的父類。 ServerBootstrap的channel方法用來設置channelFactory成員變量(在父類AbstractBootstrap里&#xff09; ServerBootstrap的childHandler方法用來給本類的成員…

WT588F02B單片機語音芯片在磁療儀中的應用介紹

隨著健康意識的普及和科技的發展&#xff0c;磁療儀作為一種常見的理療設備&#xff0c;受到了廣大用戶的關注。為了提升用戶體驗和操作便捷性&#xff0c;唯創知音WT588F02B單片機語音芯片被成功應用于磁療儀中。這一結合將為磁療儀帶來智能化的語音交互功能&#xff0c;為用戶…

軟件開發的代碼審查工具

在進行軟件開發時&#xff0c;代碼審查&#xff08;Code Review&#xff09;是一種非常重要的實踐&#xff0c;它有助于發現潛在的問題、提高代碼質量&#xff0c;并促使團隊成員之間的知識共享。有許多工具可用于簡化和優化代碼審查過程。以下是一些常見的代碼審查工具&#x…

【Pyqt】QObject::connect: Cannot queue arguments of type ‘QTextCursor‘

問題說明 文本框接收到新的數據 不會自動滾動&#xff0c;并提示警告 QObject::connect: Cannot queue arguments of type ‘QTextCursor’ (Make sure ‘QTextCursor’ is registered using qRegisterMetaType().) 原因 線程回來的槽函數里面 調用了ui的代碼 我們不能通過線程…

ArcGIS Pro中怎么設置標注換行

在ArcGIS Pro中進行文字標注的時候&#xff0c;如果標注的字段內容太長&#xff0c;直接標注的話會不美觀&#xff0c;而且還會影響旁邊的標注顯示&#xff0c;這里為大家介紹一下在ArcGIS Pro中設置文字換行的方法&#xff0c;希望能對你有所幫助。 數據來源 本教程所使用的…

深入淺出理解kafka ---- 萬字總結

1.Kafka簡介 Kafka 本質上是一個 MQ&#xff08;Message Queue&#xff09;&#xff0c;使用消息隊列的優點&#xff1a; 解耦&#xff1a;允許獨立的擴展或修改隊列兩邊的處理過程。可恢復性&#xff1a;即使一個處理消息的進程掛掉&#xff0c;加入隊列中的消息仍然可以在系…

【無線網絡技術】——無線個域網(學習筆記)

&#x1f4d6; 前言&#xff1a;手機、PC機、電視等消費類產品非常普及&#xff0c;人們希望有一種短距離、低成本、小功耗的無線通信方式&#xff0c;實現不同功能單一設備的互聯&#xff0c;提供小范圍內設備的自組網機制&#xff0c;并通過一定的安全接口完成自組小網與廣域…

Spring 依賴注入的三種方式優缺點

小王學習錄 前言屬性注入1. 屬性注入的優點2. 屬性注入的缺點 Setter注入Setter注入的優點Setter注入的缺點 構造方法注入1. 構造方法的優點 總結補充Aurowired注解和Resource注解的區別 前言 在前面的文章中介紹了基于注解的方式將Bean存儲到Spring中, 接下來介紹如何基于注解…

第一百九十四回 自定義百分比布局

文章目錄 1. 概念介紹2. 實現方法3. 代碼與效果3.1 示例代碼3.2 運行效果4. 內容總結我們在 上一章回中介紹了"滾動布局的使用實例"相關的內容,本章回中將介紹 自定義百分比布局.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本章回中介紹的百分比布…

Redis保證高可用的三種方式

Redis保證高可用主要有三種方式&#xff1a;主從、哨兵、集群。 主從復制了解嗎&#xff1f; Redis主從復制簡圖 主從復制&#xff0c;是指將一臺 Redis 服務器的數據&#xff0c;復制到其他的 Redis 服務器。前者稱為 主節點(master)&#xff0c;后者稱為 從節點(slave)。且…