C++程序设计基础3:数组

前言

本文为笔者大一《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;
	}
}

  • 结果:
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅若清风cyf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值