IOS实验室第一次考核

 T1

 

思路:1.设置两个变量存入行数和列数 2.所有要输出的数字就是行列之积 3.定义一个数组存放这些数字

障碍:不知道如何下标规律变化使得数字成回型放置


所以我学习了几种方式来实现这样的蛇形放置:

其中第一篇https://blog.csdn.net/qq_39208237/article/details/116833004

题主介绍了这种输入方式的底层逻辑,还使用了四个变量来控制输入,运用vector数组,但由于我对vector数组掌握水平一般,这种解法复杂程度让我有些难以理解,所以我尝试寻找别的解决方法。

于是我搜索到了第二篇https://zhuanlan.zhihu.com/p/596918489

这种解法巧妙地利用了数组的下标,将一个个数字想象成放在平面上的点,从而用较为简单的方法实现了数组的输入,便于理解,所以最终我采用了类似的方法。

以下是我实现该题的代码

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	int m,n;
	cin >> m >> n;
	int arr[m][n];
	
	int dx[4] = {-1,0,1,0} ,dy[4] = {0,1,0,-1};//↑ → ↓ ← 
	
	int x = 0,y = 0,d = 1;//坐标为(x,y) 用d控制填数方向,刚开始向右 
	
	for(int i = 0;i < m;i++)//初始化,为后面条件判断做准备 
	{
		for(int j = 0;j < n;j++)
		{
			arr[i][j] = 0;
		}
	 } 
	
	for(int i = 1;i <= m*n;i++) //数字总共mn个
	{
		arr[x][y] = i;

        //每次a,b指下一个填数坐标
        int a = x + dx[d],b = y + dy[d];

        //如果超出数组边界或者前方即将填的空格已经被填充了,则立即转变方向,改写a,b
        if(a<0 || a >= m || b < 0 || b >= n || arr[a][b] != 0)
        {
            d = (d + 1) % 4;
            a = x + dx[d],b = y + dy[d];
        }
        x = a,y = b;
	} 
	for(int i = 0;i < m;i++)
	{
        for(int j = 0;j < n;j++)
        {
        	cout <<setw(3) << arr[i][j] << " ";
		}
           
        cout << endl;  
    }
    
	return 0;
} 

T2

一开始看到cpp链表我是觉得很茫然的,以至于一开始都想放弃这一题,但是距离截止时间还有一段时间,加之之前学习过一部分的python 对这个python中的列表还有一些印象,运用python还是可以较快解决这个问题的

思路:1.建立一个列表 2.利用append函数来向列表中插入新的数,在插入时末尾添加即可,不考虑大小关系 3.每一次插入新的数字后对该列表进行冒泡排序,使得列表有序

障碍:1.关于python的知识遗忘地有些多,需要复习笔记才能想起来 2.冒泡排序的python解法不太熟悉,这里参考了Python实现冒泡排序_冒泡排序python-CSDN博客的解法

以下是我实现该题的代码:

def bubble_sort(array):
    for i in range(1, len(array)):
        for j in range(0, len(array) - i):
            if array[j] > array[j + 1]:
                array[j], array[j + 1] = array[j + 1], array[j]
    return array


a = list()
print("******* Data Structure *******")
print("1----有序插入单链表")
print("2----查看单链表")
print("    退出,输入0")
choice = int(input())
while True:
    if choice == 1:
        num = int(input("请输入要插入的值:"))
        a.append(num)
        bubble_sort(a)
    elif choice == 2:
        index = 0
        while index < len(a):
            print(a[index]," ",end='')
            index += 1
    elif choice == 0:
        break

    choice = int(input())


T3

第三题的主要内容是类的构造,初看与我们最近学习的内容颇为相近,但是在实现过程中还是遇到了问题:1.不清楚派生类及派生类的使用  2.不懂如何创建Header

针对第一个问题:不清楚派生类及派生类的使用

我搜索了相关知识并学习:

C++-基类与派生类_c++派生类和基类-CSDN博客

c++ 继承与派生(2)——通过派生类的对象调用基类的函数_c++ 派生类调用基类方法-CSDN博客

C++类——派生类的定义、构成及访问控制_c++派生类-CSDN博客

暂时能够满足本题的需求,但是关于派生类的其他内容,还需要继续加深学习。

针对第二个问题:不懂如何创建Header

依稀记得以前有接触过这部分知识,但已经遗忘,我先是凭借印象自行尝试创建,未果,最后学习了一下网上的创建方式,如

理解 C++ 中的头文件和源文件的作用 | 菜鸟教程 (runoob.com)

头文件header file和源文件 source file_类的头文件和源文件-CSDN博客

code::block 新建项目(project)并建立 Sources 和 Headers 子目录-CSDN博客

C/C++不同文件夹下包含头文件的方法及#include的使用_在c++中如何包含不在同一个文件夹下的头文件-CSDN博客

并结合了自己的理解,最终完成了这个项目,但对于其中的底层逻辑,我还有些疑惑,所以仍需要继续学习。

以下是我实现该题的代码

#include <iostream>
#include "Account.h"
#include "SavingsAccount.h"

using namespace std;

int main()
{
	Account a;
	char choice = ' ';
	cout << "------------------------------------------------"<<endl;
	cout << "                   菜单栏                       "<<endl;
	cout << "1、存款请输入“1”"<<endl;
	cout << ""<<endl;
	cout << "2、取款请输入“2”"<<endl;
	cout << ""<<endl;

	cin >> choice;
	double amount = 0;
	switch(choice)
	{
		case'1':
			cout << "请输入存款金额" << endl;
			cin >> amount;
		 	a.credit(amount);
		 	cout <<"您当前的余额是:" << endl;
			a.getBalance();
			cout << endl;
			break;
		case'2':
			cout << "请输入取款金额" << endl;
			cin >> amount;
			a.debit(amount);
		 	cout <<"您当前的余额是:" << endl;
			a.getBalance();
			cout <<endl;
			break;
	}



	if(choice == '1')
	{
		cout << "请输入您想存款的年份及当前的年利率" << endl;
		int y = 0;
		double r = 0;
		cin >> y >> r;
		SavingsAccount a1(y,r);
		a1.balance = a.balance;
		a1.calculate();
	}
	return 0;
}

其中定义的基类是

#ifndef ACCOUNT_H_INCLUDED
#define ACCOUNT_H_INCLUDED
#include <iostream>
using namespace std;

class Account
{
public:
	double balance;

	Account()
	{
		if(balance < 0)
		{
			balance = 0;
			cout << "Wrong Balance!" << endl;
		}
	}

	void credit(double num)
	{
		balance = balance + num;
	}
	void debit(double num)
    {
        if (balance >= num)
        {
            balance -= num;
        }
        else
        {
            cout << "Debit amount exceeded account balance." << endl;
        }
    }
	void getBalance()
	{
		cout << balance;
	}
};


#endif // ACCOUNT_H_INCLUDED

派生类是

#ifndef SAVINGSACCOUNT_H_INCLUDED
#define SAVINGSACCOUNT_H_INCLUDED
#include <iostream>
using namespace std;

class SavingsAccount : public Account
{
public:
	double rate;
	int year;

	SavingsAccount(int y,double r)
	{
		rate = r;
		year = y;
	}
	double interest = 0;
	void calculate()
	{
		for(int i = 1;i <= year;i++)
		{
			cout << balance << " " << rate << endl;
			interest = balance * rate;
			cout << interest;
			balance = balance + interest;
		}
		cout << "存款 " << year<< " 年后的余额是:" << balance << endl;
	}
};


#endif // SAVINGSACCOUNT_H_INCLUDED

总结

不管本次实验室招新结果如何,本次任务的完成都让我学习到了一些先前没有接触过的知识,也培养了自己的学习能力。当然,更期待能够加入实验室在学长学姐和同学们的帮助下,更好地学习新知识。

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值