codeup之C语言11.1 + C语言11.2 + C语言11.4 + 11.7 + C语言11.8(结构体
講真,這幾道題可以不做,頂多可以注意下結(jié)構(gòu)體和聯(lián)合體的區(qū)別
Description
完成一個(gè)對候選人得票的統(tǒng)計(jì)程序。假設(shè)有3個(gè)候選人,名字分別為Li,Zhang和Fun。使用結(jié)構(gòu)體存儲每一個(gè)候選人的名字和得票數(shù)。記錄每一張選票的得票人名,輸出每個(gè)候選人最終的得票數(shù)。結(jié)構(gòu)體可以定義成如下的格式:
struct person {
char name[20];
int count;
}leader[3] = {“Li”, 0, “Zhang”, 0, “Fun”, 0};
Input
第一行有一個(gè)整數(shù)n,表示以下有n張選票信息將會輸入。保證n不大于100。
以后的n行中,每一行包含一個(gè)人名,為選票的得票人。保證每一個(gè)人名都是Li,Zhang和Fun中的某一個(gè)。
Output
有三行,分別為Li,Zhang和Fun每人的得票數(shù)。格式為首先輸出人名,其后輸出一個(gè)冒號,最后輸出候選人的得票數(shù)。
請注意行尾輸出換行。
Sample Input Copy
10
Li
Li
Fun
Zhang
Zhang
Fun
Li
Fun
Zhang
Li
Sample Output Copy
Li:4
Zhang:3
Fun:3
solution1
#include <stdio.h>
#include <string.h>
struct person{
char name[20];
int count;
}leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
int main(){
int n;
scanf("%d", &n);
char a[n][6];
for(int i = 0; i <= n; i++){
gets(a[i]);
if(strcmp(a[i], "Li") == 0){
leader[0].count++;
}
else if(strcmp(a[i], "Zhang") == 0){
leader[1].count++;
}
else if(strcmp(a[i], "Fun") == 0){
leader[2].count++;
}
}
for(int i = 0; i < 3; i++)
printf("%s:%d\n", leader[i].name, leader[i].count);
return 0;
}
solution1
#include <stdio.h>
#include <string.h>
struct person{
char name[20];
int count;
}leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
int main(){
char str[20];
int n;
scanf("%d", &n);
getchar();
for(int i = 0; i < n; i++){
gets(str);
if(strcmp(str, leader[0].name) == 0)
leader[0].count++;
else if(strcmp(str, leader[1].name) == 0)
leader[1].count++;
else
leader[2].count++;
memset(str, '\0', sizeof(str));
}
for(int i = 0; i < 3; i++)
printf("%s:%d\n", leader[i].name, leader[i].count);
return 0;
}
Description
定義一個(gè)結(jié)構(gòu)體student,存儲學(xué)生的學(xué)號、名字、性別和年齡,讀入每個(gè)學(xué)生的所有信息,保存在結(jié)構(gòu)體中,并輸出。結(jié)構(gòu)體student的定義如下:
struct student {
int num;
char name[20];
char sex;
int age;
};
本題要求使用指向結(jié)構(gòu)體數(shù)組的指針進(jìn)行輸入和輸出。
Input
第一行有一個(gè)整數(shù)n,表示以下有n個(gè)學(xué)生的信息將會輸入。保證n不大于20。
以后的n行中,每一行包含對應(yīng)學(xué)生的學(xué)號、名字、性別和年齡,用空格隔開。保證每一個(gè)人名都不包含空格且長度不超過15,性別用M和F兩個(gè)字符來表示。
Output
有n行,每行輸出一個(gè)學(xué)生的學(xué)號、名字、性別和年齡,用空格隔開。
請注意行尾輸出換行。
Sample Input Copy
3
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20
Sample Output Copy
10101 LiLin M 18
10102 ZhangFun M 19
10104 WangMin F 20
solution
#include <stdio.h>
struct student{
int num;
char name[20];
char sex;
int age;
};
int main(){
int n;
scanf("%d", &n);
student s[n];
for(int i = 0; i < n; i++)
scanf("%d %s %c %d", &s[i].age, s[i].name, &s[i].num, &s[i].sex);
for(int i = 0; i < n; i++)
printf("%d %s %c %d\n", s[i].age, s[i].name, s[i].num, s[i].sex);
return 0;
}
Description
設(shè)有若干個(gè)人員的數(shù)據(jù),其中包含學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:號碼、姓名、性別、職業(yè)、班級。教師的數(shù)據(jù)包括:號碼、姓名、性別、職業(yè)、職務(wù)。可以看出,學(xué)生和教師所包含的數(shù)據(jù)是不同的。現(xiàn)在要求把這些數(shù)據(jù)放在同一個(gè)表格中儲存,使用結(jié)構(gòu)體中的共用體實(shí)現(xiàn)。結(jié)構(gòu)體定義如下:
struct {
int num;
char name[10];
char sex;
char job;
union {
int class;
char position[10];
}category;
};
在以上的結(jié)構(gòu)體中,如果job項(xiàng)為s(學(xué)生),則第5項(xiàng)為class(班級);如果job項(xiàng)是t(教師),則第5項(xiàng)為position(職務(wù))。
輸入幾個(gè)人員的數(shù)據(jù),將其保存在以上包含共用體的結(jié)構(gòu)體數(shù)組中,并輸出。
Input
第一行有一個(gè)整數(shù)n,表示以下n行分別表示n個(gè)人員的數(shù)據(jù)。保證n不超過100。
之后的n行,每行有5項(xiàng)用空格隔開的內(nèi)容。前4項(xiàng)分別為人員的號碼(整數(shù))、姓名(長度不超過9的無空格字符串)、性別(字符,m或f)和職業(yè)(字符,s或t)。如果第4項(xiàng)是s,則第5項(xiàng)為一個(gè)整數(shù),表示班級;如果第4項(xiàng)是t,則第5項(xiàng)為一個(gè)長度不超過9的無空格字符串,表示職務(wù)。
Output
共有n行,與輸入格式相同,輸出讀入的所有內(nèi)容。
請注意行尾輸出換行。
Sample Input Copy
2
101 Li f s 501
102 Wang m t prof
Sample Output Copy
101 Li f s 501
102 Wang m t prof
idea
結(jié)構(gòu)體struct vs 聯(lián)合體union(別名共用體等)
結(jié)構(gòu)體:把不同類型的數(shù)據(jù)組合成一個(gè)整體-------自定義數(shù)據(jù)類型
聯(lián)合體:使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋)
共用體和結(jié)構(gòu)體都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 共用體只存放一個(gè)被選中的成員, 而結(jié)構(gòu)體則存放所有的成員變量。
對于共用體的不同成員賦值,將會對其他成員重寫, 原來成員的值就不存在了, 而對于結(jié)構(gòu)體的不同成員賦值是互不影響的
內(nèi)存分配不同
solution
#include <stdio.h>
struct {
int num;
char name[10];
char sex;
char job;
union {
int sclass;
char position[10];
}category;
} info[100];
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %s %c %c", &info[i].num, info[i].name, &info[i].sex, &info[i].job);
if(info[i].job == 's'){
scanf("%d", &info[i].category.sclass);
}
else if(info[i].job == 't'){
scanf("%s", info[i].category.position);
}
}
for(int i = 0; i < n; i++){
printf("%d %s %c %c ", info[i].num, info[i].name, info[i].sex, info[i].job);
if(info[i].job == 's'){
printf("%d\n", info[i].category.sclass);
}
else if(info[i].job == 't'){
printf("%s\n", info[i].category.position);
}
}
return 0;
}
Description
編寫兩個(gè)函數(shù)input和print,分別用來輸入5個(gè)學(xué)生的數(shù)據(jù)記錄和打印這5個(gè)學(xué)生的記錄。對于每一個(gè)學(xué)生,其記錄包含了學(xué)號、名字、3門課程的成績共5項(xiàng)。用主函數(shù)分別調(diào)用input和print函數(shù)進(jìn)行輸入和輸出。
要求使用結(jié)構(gòu)體數(shù)組實(shí)現(xiàn),結(jié)構(gòu)體中包括了每個(gè)學(xué)生的5項(xiàng)記錄。
Input
共有5行,每行包含了一個(gè)學(xué)生的學(xué)號(整數(shù))、名字(長度不超過19的無空格字符串)和3門課程的成績(0至100之間的整數(shù)),用空格隔開。
Output
與輸入格式相同,每行輸出一個(gè)學(xué)生的所有記錄。
請注意行尾輸出換行。
Sample Input Copy
101 AAA 80 81 82
102 BBB 83 84 85
103 CCC 86 87 88
104 DDD 89 90 91
105 EEE 92 93 94
Sample Output Copy
101 AAA 80 81 82
102 BBB 83 84 85
103 CCC 86 87 88
104 DDD 89 90 91
105 EEE 92 93 94
solution
#include <stdio.h>
struct student{
int num;
char name[20];
int course[3];
} stu[5];
void Input(){
for(int i = 0;i < 5; i++){
scanf("%d %s", &stu[i].num, stu[i].name);
for(int j = 0; j < 3; j++){
scanf("%d", &stu[i].course[j]);
}
}
}
void Output(){
for(int i = 0;i < 5; i++){
printf("%d %s ", stu[i].num, stu[i].name);
for(int j = 0; j < 3; j++){
printf("%d ", stu[i].course[j]);
}
printf("\n");
}
}
int main(){
Input();
Output();
return 0;
}
Description
有10個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號、姓名、3門課程的成績。讀入這10個(gè)學(xué)生的數(shù)據(jù),要求輸出3門課程的總平均成績,以及個(gè)人平均分最高的學(xué)生的數(shù)據(jù)(包括學(xué)號、姓名、3門課程成績、平均分?jǐn)?shù))。
Input
共有10行,每行包含了一個(gè)學(xué)生的學(xué)號(整數(shù))、名字(長度不超過19的無空格字符串)和3門課程的成績(0至100之間的整數(shù)),用空格隔開。
Output
第一行包含了3個(gè)實(shí)數(shù),分別表示3門課程的總平均成績,保留2位小數(shù),每個(gè)數(shù)之后輸出一個(gè)空格。
第二行輸出個(gè)人平均分最高的學(xué)生的數(shù)據(jù),與輸入數(shù)據(jù)格式相同。如果有多位個(gè)人平均分最高的學(xué)生,輸出按照輸入順序第一個(gè)最高分的學(xué)生數(shù)據(jù)。
請注意行尾輸出換行。
Sample Input Copy
101 AAA 80 81 82
102 BBB 83 84 85
103 CCC 86 87 88
104 DDD 89 90 91
105 EEE 92 93 94
106 FFF 80 90 100
107 GGG 85 90 95
108 HHH 80 85 90
109 III 90 91 92
110 JJJ 91 88 87
Sample Output Copy
85.60 87.90 90.40
105 EEE 92 93 94
solution
#include <stdio.h>
struct student{
int num;
char name[20];
double grade[3];
} stu[10];
int main(){
double sum[3] = {0};
for(int i = 0;i < 10; i++){
scanf("%d %s %lf %lf %lf", &stu[i].num, stu[i].name, &stu[i].grade[0], &stu[i].grade[1], &stu[i].grade[2]);
}
for(int j = 0; j < 10; j++){
sum[0] += stu[j].grade[0];
sum[1] += stu[j].grade[1];
sum[2] += stu[j].grade[2];
}
for(int i = 0; i < 3; i++)
printf("%.2f ", sum[i]/10);
printf("\n");
double max = stu[0].grade[0] + stu[0].grade[1] + stu[0].grade[2], sum1[10];
int maxp = 0;
for(int j = 1; j < 10; j++){
sum1[j] = stu[j].grade[0] + stu[j].grade[1] + stu[j].grade[2];
if(sum1[j] > max){
max = sum1[j];
maxp = j;
}
}
printf("%d %s %.0f %.0f %.0f", stu[maxp].num, stu[maxp].name, stu[maxp].grade[0], stu[maxp].grade[1], stu[maxp].grade[2]);
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的codeup之C语言11.1 + C语言11.2 + C语言11.4 + 11.7 + C语言11.8(结构体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElementPlus插件的安装和使用
- 下一篇: 45分钟从零搭建私有MaaS平台和生产级