解题思路及收获

本文介绍了如何使用动态二维数组表示蛇形矩阵并控制转向,展示了有序单循环链表的插入方法,以及C++中的类设计,包括基类Account和派生类SavingAccount的实现,通过实际问题学习了链表、数组和面向对象编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T1蛇形矩阵

  首先,从这个矩阵看出,它可以用动态二维数组来表示。其次,蛇形矩阵的走向是右、下、左、上,反复循环。那么,在我看来,这道题的难点在于如何控制方向。(我就是试了好几次都没成功😓,所以借鉴了一下其他大佬的方法)

方法就是再定义一个偏移量数组,分别表示向右,向下,向左,向上。

6b2b4011af334fdca74d0612abb4cf4b.jpg

 同时,也要判断何时换方向。即当下一个元素超出边界或遇到之前填过的数字时,需要转向。

11d202764375429f92aa2f260bc4d656.jpg

最后,再通过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结构体。然后,根据输入的值的不同,进行三种不同的操作。其中最棘手的还是有序插入单链表。对此,我先将它插入时,分为空循环链表和非空循环链表的两种情况。当插入时,为空循环链表,应直接成为第一个节点。

3070a971220147e8af36a63e7c3ecee9.jpg

 当插入时,为非空。再分为当只有一个节点和有多个节点两种情况。

同时对每种情况,再细分为两种情况:是否比第一个节点的数值大。若插入的值比第一个节点的值大,则向后进行,满足比前一个节点的值大,比后一个节点的值小,即可插入。并且还要注意,若比最后一个节点的值大,则直接成为最后一个节点。

完整代码如下:

  #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的用法,并且更加熟悉基类和派生类的应用。总之,虽然结果还有瑕疵,但确实收获了许多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值