1.统计候选人得票
题目:
编程统计候选人的得票数。设计有3个候选人zhang,li,wang,且不区分大小写,10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人选民,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
【样例输入】
zhang
li
wang
Wang
Li
Zhang
zhang
ZHANG
deng
Deng
【样例输出】
zhang 4
li 2
wang 2
Error 2
代码:
#include <iostream>
#include <string.h>
using namespace std;
struct candidate
{
char name[10];
int dp;
}CANDIDATE[4];
int main()
{
char xm[20];
strcpy(CANDIDATE[0].name,"ZHANG");
strcpy(CANDIDATE[1].name,"LI");
strcpy(CANDIDATE[2].name,"WANG");
strcpy(CANDIDATE[3].name,"Error");
CANDIDATE[0].dp = 0;
CANDIDATE[1].dp = 0;
CANDIDATE[2].dp = 0;
CANDIDATE[3].dp = 0;
while (cin >> xm){
int len = strlen(xm);
for(int i = 0; i < len; i ++)
{
if(xm[i] >= 'a' && xm[i] <= 'z')
{
xm[i] -= 32;
}
}
bool flag = true;
for(int j = 0; j < 3; j ++)
{
if(strcmp(CANDIDATE[j].name, xm) == 0)
{
CANDIDATE[j].dp ++;
flag = false;
}
}
if(flag)
{
CANDIDATE[3].dp ++;
}
}
strcpy(CANDIDATE[0].name, "zhang");
strcpy(CANDIDATE[1].name, "li");
strcpy(CANDIDATE[2].name, "wang");
cout << CANDIDATE[0].name << " " << CANDIDATE[0].dp << endl;
cout << CANDIDATE[1].name << " " << CANDIDATE[1].dp << endl;
cout << CANDIDATE[2].name << " " << CANDIDATE[2].dp << endl;
cout << CANDIDATE[3].name << " " << CANDIDATE[3].dp << endl;
return 0;
}
2.结构体数组的排序
题目:
请设计一个结构体存储学生的姓名、学号、英语成绩(ABCD)和数学成绩(百分制),请录入5个同学的成绩,原样输出后,再按照平均成绩从小到大进行排序后输出。英语成绩转换方法:A-90,B-80,C-70,D-60。
【要求】采用结构体数组存储数据,使用函数、循环等知识点,主函数需精炼,其他可自行拟定
【输入样例】
zhang 2001 A 80
WANG 2002 B 70
DENG 2004 D 99
LI 2003 A 88
QIAO 2005 A 76
【输出样例】
zhang 2001 A 80
WANG 2002 B 70
DENG 2004 D 99
LI 2003 A 88
QIAO 2005 A 76
WANG 2002 B 70 75
DENG 2004 D 99 79
QIAO 2005 A 76 83
zhang 2001 A 80 85
LI 2003 A 88 89
代码:
#include <iostream>
using namespace std;
struct student
{
char name[100];
int xh;
char English;
int math;
int averge;
}stu[5];
void Read()
{
int n = 0;
while(cin >> stu[n].name)
{
cin >> stu[n].xh;
cin >> stu[n].English;
int sum = 0;
switch(stu[n].English)
{
case 'A':sum += 90; break;
case 'B':sum += 80; break;
case 'C':sum += 70; break;
case 'D':sum += 60; break;
}
cin >> stu[n].math;
sum += stu[n].math;
stu[n].averge = sum / 2;
n ++;
}
}
void show1()
{
for(int i = 0; i < 5; i ++)
{
cout << stu[i].name << " ";
cout << stu[i].xh << " ";
cout << stu[i].English << " ";
cout << stu[i].math << endl;
}
cout << endl;
}
void paixu()
{
for(int i = 0; i < 5; i ++)
{
for(int j = 0; j < 5; j ++)
{
if(stu[i].averge < stu[j].averge)
{
swap(stu[j], stu[i]);
}
}
}
}
void show2()
{
for(int i = 0; i < 5; i ++)
{
cout << stu[i].name << " ";
cout << stu[i].xh << " ";
cout << stu[i].English << " ";
cout << stu[i].math << " ";
cout << stu[i].averge << endl;
}
}
int main()
{
Read();
show1();
paixu();
show2();
return 0;
}
3.单链表的创建
题目:
采用尾插法,建立一个包含5个结点的单向链表,每个结点包括:学号、姓名、性别、年龄。然后遍历该链表,进行数据的输出。
【输入形式】学生信息
【输出形式】遍历该链表的信息,请注意,尾插法创建的输出结果和输入一致,但是头插法创建的结果和输入刚好相反。
【样例输入】
1004 zhang f 18
1002 wang m 19
1003 zheng f 19
1001 wu m 20
1005 deng m 19
【样例输出】
1004 zhang f 18
1002 wang m 19
1003 zheng f 19
1001 wu m 20
1005 deng m 19
代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct student{
//定义一个结构体;
int xh;
char name[100]; // 数组别忘了申请长度;
char sex;
int age;
struct student* next; //别忘了申请指针域;
}STUDENT;
STUDENT* Build()
{
STUDENT*Pt ,*prePt ,*head;
head = NULL;
for(int i = 0; i < 5; i ++){
// 输入多组数据时,用循环;
Pt = (STUDENT*)malloc(sizeof(STUDENT)); //在函数里一定要申请空间;不然数据生存期短暂;
if(Pt != NULL){
//还要检验空间是否申请成功;
cin>>Pt->xh;
cin>>Pt->name;
cin>>Pt->sex;
cin>>Pt->age;
}
if(head == NULL){
head = Pt;
prePt = Pt; //一定要确定头指针指向;
}
else{
prePt->next = Pt; //记得用尾针保存下一节点的地址;
prePt = Pt; //移动pr指针;
}
}
Pt->next = NULL; //确定尾指针;
return head; //返回头指针的地址;
}
int Output(STUDENT* head){
while(head != NULL){
cout<<head->xh<<" ";
cout<<head->name<<" "; //用while循环遍历!!!
cout<<head->sex<<" ";
cout<<head->age<<" ";
head = head->next;
cout<<endl;
}
return 0;
}
int main(){
STUDENT *head;
head = Build();
Output(head);
return 0;
}
4.链表的插入排序
题目:
建立一个5结点的单向链表,每个结点包括:学号、姓名、性别、年龄。对其进行排序,采用插入排序法,按学号从小到大进行排列。
【输入形式】学生信息
【输出形式】排序后的信息
【样例输入】
1004 zhang f 18
1002 wang m 19
1003 zheng f 19
1001 wu m 20
1005 deng m 19
【样例输出】
1001 wu m 20
1002 wang m 19
1003 zheng f 19
1004 zhang f 18
1005 deng m 19
【样例输入】
1002 wu m 20
1001 wang m 19
1004 zheng f 19
1005 zhang f 18
1003 deng m 19
【样例输出】
1001 wang m 19
1002 wu m 20
1003 deng m 19
1004 zheng f 19
1005 zhang f 18
代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Node{
int xh;
char name[100];
char sex;
int age;
struct Node*next;
};
void Output(struct Node*head){
Node*p = head;
while(p != NULL){
cout<<p->xh<<" ";
cout<<p->name<<" ";
cout<<p->sex<<" ";
cout<<p->age<<" ";
cout<<endl;
p = p->next;
}
}
int main(){
struct Node*head = NULL;
for(int i = 0; i < 5; i ++){
struct Node*NewNode = (struct Node*)malloc(sizeof(struct Node));
cin>>NewNode->xh;
cin>>NewNode->name;
cin>>NewNode->sex;
cin>>NewNode->age;
NewNode->next = NULL;
if(head == NULL){
head = NewNode;
}
else{
struct Node*Order = head;
struct Node*Preorder = head;
while(Order!=NULL && NewNode->xh > Order->xh ){
Preorder = Order;
Order = Order->next;
}
if(Order == head){
NewNode->next = head;
head = NewNode;
}
else{
NewNode->next = Order;
Preorder->next = NewNode;
}
}
}
Output(head);
return 0;
}
5.两个链表的合并
题目:
定义两个同种单向链表(结点中包含一个整型数和一个指向本结点类型的指针),两个链表中的数据都已经从小到大排好序了,请编制程序,合并这两个有序链表。
【输入形式】两个链表的数据,以0作为输入结束
【输出形式】合并后的数据,重复的数据请删除。
【样例输入】
1 3 5 7 9 0
1 2 3 4 5 5 8 12 0
【样例输出】
1 2 3 4 5 7 8 9 12
代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct num{
int a;
struct num*p;
};
int main(){
struct num* head = NULL;
struct num* pt = NULL;
while(1){
struct num*node = (struct num*)malloc(sizeof(struct num));
cin>>node->a;
if(node->a == 0) break;
if(head == NULL){
head = node;
pt = node;
}
else{
pt->p = node;
pt = node;
}
pt->p = NULL;
}
while(1){
struct num*node = (struct num*)malloc(sizeof(struct num));
cin>>node->a;
if(node->a == 0)break;
struct num*order = head;
struct num*preorder = head;
while(order != NULL && node->a > order->a){
preorder = order;
order = order->p;
}
if(order == head){
node->p = head;
head = node;
}
else{
node->p = order;
preorder->p = node;
}
}
struct num*order = head;
struct num*preorder = head;
while(order != NULL){
if(order == head) {
cout<<order->a<<" ";
order = order->p;
}
else{
if(order->a == preorder->a){
preorder = preorder->p;
order = order->p;
continue;
}
cout<<order->a<<" ";
preorder = preorder->p;
order = order->p;
}
}
return 0;
}
欢迎提问,学弟学妹们加油~