T1蛇形矩阵
首先,从这个矩阵看出,它可以用动态二维数组来表示。其次,蛇形矩阵的走向是右、下、左、上,反复循环。那么,在我看来,这道题的难点在于如何控制方向。(我就是试了好几次都没成功😓,所以借鉴了一下其他大佬的方法)
方法就是再定义一个偏移量数组,分别表示向右,向下,向左,向上。
同时,也要判断何时换方向。即当下一个元素超出边界或遇到之前填过的数字时,需要转向。
最后,再通过right和setw(3)来输出。
完整代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int x,y;
cin >> x >> y;
int f[x][y];
for (int i=0;i<x;i++)
{
for (int j=0;j<y;j++)
{
f[i][j]=0;
}
}
int g[4][2]={
{0,1},
{1,0},
{0,-1},
{-1,0}};
int a=0,b=0;
int d=0;
for (int i=1;i<=x*y;i++)
{
f[a][b]=i;
int m=a+g[d][0];
int n=b+g[d][1];
if (m==x||n==y||f[m][n]>0||m<0||n<0)
{
d=(d+1)%4;
}
a+=g[d][0];
b+=g[d][1];
}
for (int i=0;i<x;i++)
{
for (int j=0;j<y;j++)
{
cout << right << setw(3) << f[i][j];
}
cout << endl;
}
}
T2有序单循环链表的插入
(我是通过学长发的B站视频学的链表,所以操作还不是很熟练,代码可能写的有些复杂,但我已经尽可能简化了😢)
首先,先声明一个typedef类型的LNode结构体。然后,根据输入的值的不同,进行三种不同的操作。其中最棘手的还是有序插入单链表。对此,我先将它插入时,分为空循环链表和非空循环链表的两种情况。当插入时,为空循环链表,应直接成为第一个节点。
当插入时,为非空。再分为当只有一个节点和有多个节点两种情况。
同时对每种情况,再细分为两种情况:是否比第一个节点的数值大。若插入的值比第一个节点的值大,则向后进行,满足比前一个节点的值大,比后一个节点的值小,即可插入。并且还要注意,若比最后一个节点的值大,则直接成为最后一个节点。
完整代码如下:
#include <iostream>
using namespace std;
void input(int &x)
{
cin >> x;
}
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;
void ListInsert1(LinkList &L,int y)
{
L=(LNode *) malloc(sizeof(LNode));
L->data=y;
L->next=L;
}
void ListInsert2(LinkList &L,int y)
{
LNode *p;
p=L;
if (L->next==L)
{
if (L->data>y)
{
LNode *r;
r=(LNode *) malloc(sizeof(LNode));
L->next=r;
r->next=L;
r->data=L->data;
L->data=y;
}
else
{
LNode *r;
r=(LNode *) malloc(sizeof(LNode));
L->next=r;
r->next=L;
r->data=y;
}
}
else
{
if (y<=L->data)
{
LNode *r;
r=L->next;
while (r->next!=L)
{
r=r->next;
}
LNode *s;
s==(LNode *) malloc(sizeof(LNode));
L->next=s;
r->next=L;
s->next=L->next;
s->data=L->data;
L->data=y;
}
else
{
while(y>p->next->data&&p->next!=L)
{
p=p->next;
}
LNode *q;
q=(LNode *) malloc(sizeof(LNode));
q->next=p->next;
p->next=q;
q->data=y;
}
}
}
void print(LinkList &L)
{
LNode *p;
p=L;
cout << p->data << " ";
p=p->next;
while (p!=L)
{
cout << p->data << " ";
p=p->next;
}
}
int main()
{
cout << "******* Data String ******" << endl;
cout << "1----有序插入单链表" << endl;
cout << "2----查看单链表" << endl;
cout << " 退出,输入0" << endl;
LinkList L;
int a=0;
int x;
cin >> x;
while (x!=0)
{
if (x==1)
{
cout << "请输入要插入的值:";
a++;
int y;
cin >> y;
if (a==1)
ListInsert1(L,y);
else
ListInsert2(L,y);
cin >> x;
}
else if(x==2)
{
print(L);
cin >> x;
}
}
}
T3类设计题目
从题目来看,该代码分为三部分,main函数,基类Account和派生类Savingaccount。按题目要求,构造相应的成员函数。同时,也要向用户提供存款,取款,查询余额和推出的操作,提示用户输入相关数据。
完整代码如下:
#include <iostream>
using namespace std;
class Account
{
private:
double balance;
public:
Account()
{
}
Account(double x)
{
if (x>=0)
balance=x;
else
{
balance=0;
cout << "输入有误";
}
}
void credit(double x)
{
balance+=x;
}
void debit(double x)
{
if (x>balance)
{
cout << "Debit amount exceeded account balance.";
}
else
{
balance-=x;
}
}
double getBalance()
{
return balance;
}
};
class SavingAccount:public Account
{
private:
double rate;
int year;
double v;
public:
SavingAccount()
{
}
SavingAccount(double r,double b)
{
rate=r;
v=b;
}
void setyear(int y)
{
year=y;
}
double calculate()
{
for (int i=1;i<=year;i++)
{
v=v+v*rate;
}
return v;
}
};
int main()
{
double balance;
cout << "请输入余额:";
cin >> balance;
Account s(balance);
if (balance==0)
{
while (balance==0)
{
cout << "请重新输入余额:";
cin >> balance;
}
}
int n;
cout << "0-----退出" << endl;
cout << "1-----存款" << endl;
cout << "2-----取款" << endl;
cout << "3-----查询余额" << endl;
while(cin >> n)
{
int m=0;
if (n>3||n<0)
{
cout << "您的输入无效,请重新输入" << endl;
}
else
{
switch(n)
{
case 0:
m=1;
break;
case 1:
cout << "请输入您要存款的金额:" << endl;
double x;
cin >> x;
s.credit(x);
balance+=x;
break;
case 2:
cout << "请输入您要取出的金额:" << endl;
double y;
cin >> y;
s.debit(y);
balance-=y;
break;
case 3:
cout << "请输入您要存储的年份:" << endl;
int year;
cin >> year;
cout << "请输入年利率:" << endl;
double rate;
cin >> rate;
SavingAccount s1(rate,balance);
s1.setyear(year);
cout << year << "年后,您的余额为" << s1.calculate();
break;
}
}
if (m==1)
break;
}
return 0;
}
收获:在这次测试中,初步了解了链表的建立,头插和尾插,循环等知识点。同过蛇形矩阵,加强了我对二维数组的使用,同时学到了新的表示转向的方法和解题思路。通过类设计题目,一定程度上回忆了switch的用法,并且更加熟悉基类和派生类的应用。总之,虽然结果还有瑕疵,但确实收获了许多。