前言
本文为笔者大一《C++程序软件设计》课程章节实验报告,现将题目整理并分享,希望能够帮助正在学习C++的小伙伴!本文将学习到的编程技能包括:静态/动态数组的创建、基于随机数生成测试数组数据、字符串的输入与输出、数据排序…
知识提纲
数组
生成动态数组
函数
排序
生成随机数
控制台读取字符串
一、学生期末成绩统计
- 题目:某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求:
(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。 - 代码
#include "pch.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void RankMark(int MT[], int EN[], int PH[], int n);
void Input(int MT[], int EN[], int PH[], int n);
void Order2(int Order[], int n);
void TotalAverage(int MT[], int EN[], int PH[], int Total[], int Average[], int n);
void Sort(int Total[],int Order[],int Ranking[],int n);
void Connect(int MT[], int EN[], int PH[], int Order[], int Average[], int n, int *piMT[], int *piEN[], int *piPH[], int *piAverage[]);
int main()
{
int n; //人数
cout << "请输入参加考试的人数:";
cin >> n;
int *MT = nullptr;
MT=new int[n];
int *EN = nullptr;
EN = new int[n];
int *PH = nullptr;
PH = new int[n];
int *Total = nullptr; //总分
Total = new int[n];
int *Average = nullptr; //平均分
Average = new int[n];
int *Order = nullptr; //学号数组
Order = new int[n];
int *Ranking = nullptr; //名次数组
Ranking = new int[n];
int **piMT = nullptr; //指针数组;指向对应学号的MT成绩
piMT = new int*[n];
int **piEN = nullptr; //指针数组;指向对应学号的EN成绩
piEN = new int*[n];
int **piPH = nullptr; //指针数组;指向对应学号的PH成绩
piPH = new int*[n];
int **piAverage = nullptr; //指针数组;指向对应学号的平均分
piAverage = new int*[n];
int choose;
cout << "请选择成绩产生模式:随机生成or手动输入(1 or 2):";
cin >> choose;
if (choose != 1 && choose != 2) { cout << "输入有误!请重新输入:"; }
if (choose == 1) RankMark(MT, EN, PH, n); //产生随机分数(方便测试)
if (choose == 2) Input(MT, EN, PH, n);// break; //输入数据(应用)
Order2(Order, n); //学号数组
TotalAverage( MT, EN, PH, Total, Average,n); //计算总分、平均分
Sort(Total,Order, Ranking,n); //总分排序,序号排序
Connect(MT, EN, PH, Order, Average, n, piMT,piEN, piPH, piAverage); //把学号与成绩对应
cout << endl << "成绩打印如下:" << endl; //打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
cout << "名次" << '\t' << "学号" << '\t' << "MT" << '\t' << "EN" << '\t' << "PH" << '\t' << "总分" << '\t' << "平均分" << endl;
for (int i = 0; i < n; ++i)
{
cout <<Ranking[i]<< '\t' << Order[i] + 1 << '\t' << *piMT[i] << '\t' << *piEN[i] << '\t' << *piPH[i] << '\t' << Total[i] << '\t' << *piAverage[i] << endl;
}
cout << endl;
for (;;)
{
int z;
cout << "要查找成绩,请输入学号:";
cin >> z;
if (z<0 || z>n)
{
cout << "输入有误!";
break;
}
--z;
int y = z;
for (int i = 0; i < 30; ++i)
{
if (z == Order[i]) { z = i; break; }
}
cout << y + 1 << "号同学的成绩:" << "学号:" << Order[z] + 1 << '\t' << "名次:" << Ranking[z] << '\t' << "MT:" << *piMT[z] << '\t' << "EN:" << *piEN[z] << '\t' << "PH:" << *piPH[z] << '\t' << "总分:" << Total[z] << '\t' << "平均分:" << *piAverage[z] << endl;
}
delete []MT;
delete []EN;
delete []PH;
delete []Total;
delete []Average;
delete []Order;
delete []Ranking;
delete []piMT;
delete []piEN;
delete []piPH;
delete []piAverage;
}
void RankMark(int MT[], int EN[], int PH[], int n)
{
srand((int)time(0));
for (int i = 0; i < n; ++i)
{
MT[i] = rand() % 100;
}
for (int i = 0; i < n; ++i)
{
EN[i] = rand() % 100;
}
for (int i = 0; i < n; ++i)
{
PH[i] = rand() % 100;
}
}
void Input(int MT[],int EN[],int PH[],int n)
{
for (int i = 0; i < n; ++i)
{
cout << "请输入" << i + 1 << "号同学的各科成绩(MT,EN,PH):" << '\t';
cin >> MT[i] >> EN[i] >> PH[i];
}
}
void Order2(int Order[],int n)
{
int q = 0;
for (int i = 0; i < n; ++i, ++q) //对下标数组赋值
{
Order[i] = q;
//cout << Order[i] << endl; //测试
}
}
void TotalAverage(int MT[],int EN[],int PH[],int Total[],int Average[],int n)
{
for (int i = 0; i < n; ++i) //计算总分,平均分
{
Total[i] = MT[i] + EN[i] + PH[i];
Average[i] = Total[i] / 3;
// cout << i + 1 << "号同学 总分为:" << Total[i] << " 平均分为:" << Average[i] << '\t';
// if ((i + 1) % 2 == 0) cout << endl;
}
}
void Sort(int Total[], int Order[],int Ranking[],int n)
{
int max = 0;
for (int i = 0; i < n-1; ++i) //总分排序:对总分进行选择排序
{ //排序过程:例如:5 6 3 7 5 8 ...
//下标 0 1 2 3 4 5 ...
max = Total[i];
int t = i + 1;
int m = i; //记录max所在的位置t
for (; t < n; ++t)
{
if (max < Total[t]) { max = Total[t]; m = t; } //8 7 6 5 5 | 3 4 2 ...
}
//OrderNumber[i] = t; //成绩排序后对应原来的序号(学号)数组
if (m != i)
{
int p = Order[m];
Total[m] = Total[i]; Order[m] = Order[i];
Total[i] = max; Order[i] = p;
//cout << "[" << i << "]=" << Order[m] << endl; //测试排序是否成功
}
}
int s = 1; //排名
for (int i = 0; i < n; ++i)
{
int k = 0; //记录重复分数个数
int t = i + 1;
while (Total[i] == Total[t]) //k记录重复分数个数 用while语句计算重复个数
{
++k;
++t;
}
cout << "第" << s << "名:" << Total[i] << "分" << '\t';
int f = k; //防止k被修改,导致后面程序错误
for (int t = i; f >= 0; --f)
{
t = i + f;
Ranking[t] = s; //名次数组
}
if ((i + 1) % 5 == 0) cout << endl;
s = s + 1 + k;
i = i + k;
}
}
void Connect(int MT[], int EN[], int PH[],int Order[],int Average[],int n,int *piMT[],int *piEN[],int *piPH[], int *piAverage[])
{
for (int i = 0; i < n; ++i)
{
int t;
t = Order[i];
piMT[i] = &MT[t];
}
for (int i = 0; i < n; ++i)
{
int t;
t = Order[i];
piEN[i] = &EN[t];
}
for (int i = 0; i < n; ++i)
{
int t;
t = Order[i];
piPH[i] = &PH[t];
}
for (int i = 0; i < n; ++i)
{
int t;
t = Order[i];
piAverage[i] = &Average[t];
}
}
- 结果
二、字符串连接
- 题目:不用字符串处理函数将两个字符串连接,即将字符串b连接到字符串a的后面,变成字符串c。
- 代码:
以下代码仅对两个两个字符串依次打印到控制台,呈现连接效果;若需要保存到一个新的数组,则需要创建一个长度为两个子数组长度的新数组,然后根据索引依次赋值
/*以下代码仅对两个两个字符串依次打印到控制台,呈现连接效果;若需要保存到一个新的数组,则需要创建一个长度为两个子数组长度的新数组,然后根据索引依次赋值*/
#include "pch.h"
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char a[30];
char b[30];
cout << "请输入字符串1:";
cin.getline(a, 30);
cout << "请输入字符串2:";
cin.getline(b, 30);
int i = 0,t=0;
while (a[i] != '\0')
{
// cout << a[i++];
i++;
++t;
}
while (i<30)
{
a[i] = '\0';
i++;
}
i = 0;
while (b[i] != '\0')
{
a[t++] = b[i++];
}
i = 0;
while (a[i] != '\0')
{
cout << a[i];
++i;
}
}
- 结果: