T1蛇形矩阵
控制台输入 行数 和 列数
输出蛇形矩阵
答:
蛇形矩阵有较多形式,这是其中一种——回型矩阵
解题思路:
输入矩阵行m 和列n
可以理解为回型矩阵的每一环,都分成了上、右、下、中四个环节,分别在四个方向遍历,数字依次递增。
第一环遍历结束后,行坐标加一,列坐标加一,进入下一环的遍历,同样是在上右下左四个方向;
当最终数据个数为m*n时,循环结束
代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
int x=0,y=0;//行坐标与列坐标
int i=x,j=y,t=1,s=1;//t表示蛇形矩阵绕到了第几环 ,s表示当前坐标的数字
int a[10][10];
while(s<n*m)
{
for(;j<n-t;j++)//上
{
a[i][j]=s++;
}
for(;i<m-t;i++)//右
{
a[i][j]=s++;
}
for(;j>t-1;j--)//下
{
a[i][j]=s++;
}
for(;i>t-1;i--)//左
{
a[i][j]=s++;
}
x++;//绕一圈之后,行加一,列加一
y++;
i=x;
j=y;
t++; //圈数加一
//上、右、下、左再次循环
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cout<<setw(3)<<a[i][j];//对齐输出蛇形矩阵
}
cout<<endl;
}
return 0;
}
补充:关于矩阵对齐输出时使用到的setw(n)函数,包含在<iomanip>的头文件中,主要作用是在默认右对齐的情况下限制输出字符的域宽
T2有序单循环链表的插入
在节点值有序的单循环链表中插入指定结点,使插入后的链表依然有序。
大致效果:
答:
首先要使用结构体对链表的结点进行定义,其中包括data数据域,以及指针型变量next,指向的是struct Node的变量
struct Node
{
int data; // 数据域,可以自己定义类型;
Node *next; // 指针域,存放的是地址;
};
下一步是插入结点的操作,
思路大概是这样:
1.若链表为空,则需将插入的结点作为头结点
2.若插入结点小于头指针,就要插在头指针之前
主要操作就是
newNode->next=head; head=newNode;
需要注意的是要避免拿头指针进行遍历,因此我们选择了用 temp 复制 head ,用temp进行遍历
3.打印链表,操作如下
do
{
cout << curr->data << " ";
curr = curr->next;
}
while (curr != head);
代码如下:
#include <iostream>
using namespace std;
struct Node // 定义链表结点结构体
{
int data;
Node* next;
};
void insertNode(Node* head, int value)// 在有序循环链表中插入结点
{
Node* newNode = new Node;
newNode->data = value;
// 如果链表为空,直接将新节点作为头节点
if (head == NULL)
{
head = newNode;
head->next = head;
}
// 如果新结点的值小于头结点的值,将新结点插入到头结点之前
if (value < head->data)
{
newNode->next = head;
Node* temp = head;//避免破坏头指针,复制一个head
while (temp->next != head)
{
temp = temp->next;
}
temp->next = newNode;
head = newNode;
}
// 在链表中找到合适的位置插入新节点
Node* curr = head;
while (curr->next != head && value > curr->next->data)
{
curr = curr->next;//结点前移
}
newNode->next = curr->next;
curr->next = newNode;
}
// 打印链表
void printList(Node* head)
{
if (head == NULL) {
cout << "链表为空" << endl;
}
Node* curr = head;
do
{
cout << curr->data << " ";
curr = curr->next;
}
while (curr != head);
cout << endl;
}
int main() {
Node* head = NULL;
int choice;
cout << "1----有序插入单链表" << endl;
cout << "2----查看单链表" <<endl;
cout << " 退出, 输入0"<<endl;
do {
cin >> choice;
if (choice == 1) {
int value;
cout << "请输入要插入的节点值:";
cin >> value;
insertNode(head, value);
} else if (choice == 2) {
cout << "有序单链表为:";
printList(head);
}
} while (choice != 0);
return 0;
}
T3类设计题目
1.基类Account:
数据成员:
balance: double类型,表示账户余额;
构造函数:
构造函数接受一个初始余额参数,初始化数据成员balance,并能确认初始余额的有效性,保证它大于等于0,如果小于0,则将balance置为0,并显示出错信息,表示该初始化余额是一个无效的值;
成员函数:
credit:可以向当前余额加钱,
debit:负责从账户中取钱,并保证账户不会不会透支,如果提取金额大于账户余额,函数将保持balance不变,并打印信息“Debit amount exceeded account balance.”
getBalance:返回当前balance的值;
2.派生类SavingsAccount:
继承基类Account,并提供一个附加的double类型的数据成员rate表示这个账户的年利率和一个附加的int类型表示存款年份。
构造函数:
接收初始化余额和初始利率值
成员函数:
calculate:返回代表账户经过这些存款年后账户的总余额;
3.main.cpp函数中进行对类的测试,
- 要求一个账户能够创建账户(可以写在mian函数里),并对这个账户进行存取款操作(switch菜单操作)
- 可以输入存款年份和年利率(switch菜单操作),求这些年后可以得到的总余额
提示:balance和rate的乘积即为年利息(存款后每年的余额都会变)
答:
首先定义基类Account, 构造函数判断初始金额是否有效,类中有三个成员函数,分别为credit、 debit、getBalance
#include <iostream>
using namespace std;
class Account
{
protected://保护成员balance可继承访问
double balance;
public:
Account(double initialBalance) //确认初始余额的有效性
{
if (initialBalance < 0)
{
balance = 0;
cout << "初始化的余额是无效值" <<endl;
}
else
{
balance = initialBalance;
}
}
void credit(double amount) // 向当前余额加钱
{
balance += amount;
}
void debit(double amount) // 从账户中取钱,并保证账户不会透支
{
if (amount > balance)
{
cout << "Debit amount exceeded account balance." << std::endl;
}
else
{
balance -= amount;
}
}
double getBalance() //查询余额
{
return balance;
}
};
接下来就到了陌生的分文件了
分文件在侧边栏呈现如下形式:
#include "Account.cpp"
class SavingsAccount : public Account // 派生类SavingsAccount,继承基类Account
{
private:
double rate;//年利率
int Years;//存款年份
public:
SavingsAccount(double initialBalance, double initialRate) : Account(initialBalance), rate(initialRate) {}
double calculate()
{
double totalBalance = balance;
for (int i = 0; i < Years; i++)
{
totalBalance += totalBalance * rate;
}
return totalBalance;
}
};
int main()
{
double initialBalance, initialRate;
int choice, Years;
SavingsAccount account(0, 0);//初始金额和利率为零
cout << "initial balance: ";
cin >> initialBalance;//输入初始金额
account = SavingsAccount(initialBalance, 0);
cout << "Choose an operation:" <<endl;
cout << "1. 存款" << endl;
cout << "2. 取款" << endl;
cout << "3. 查询余额" << endl;
cout << "4. 设置年份和利率" << endl;
cout << "5. 计算本息和" << endl;
cout << "6. 退出" << endl;
do
{
cin >> choice;
switch (choice)
{
case 1:
double creditAmount;
cout << "存入金额数: ";
cin >> creditAmount;
account.credit(creditAmount);
break;
case 2:
double debitAmount;
cout << "提出金额数: ";
cin >> debitAmount;
account.debit(debitAmount);
break;
case 3:
cout << "当前余额为: " << account.getBalance() << endl;
break;
case 4:
cout << "输入存款年份: ";
cin >> Years;
cout << "输入初始利率 : ";
cin >> initialRate;
account = SavingsAccount(account.getBalance(), initialRate);
break;
case 5:
cout << Years << " 年后的本息和" << account.calculate() << endl;
break;
case 6:
cout << "退出" << endl;
break;
default:
cout << "Invalid choice" << endl;
}
}
while (choice != 6);
return 0;
}
通过学习,分文件时,要标注头文件 <Account.cpp>,
派生类的表示方法为
class 派生类名 : public 基类名
{
成员变量;
成员函数;
};
以上就是我对于考核内容的部分学习心得。