第六次作业解法二:两个类

本文介绍了一个使用两个类解决雨刷控制问题的程序设计案例。通过WindshieldWiper类管理和设置雨刷速度,以及Lever类感知并传递控制杆和刻度盘的位置变化,实现了根据控制杆和刻度盘的输入调整雨刷速度的功能。

以下代码实现用两个类解决问题,仅供参考

/**********************************************************/ //Function : main,雨刷控制程序 //parm : //comment : //return : void //Author : //date : 2011.11.8 /**********************************************************/ #include <iostream.h> #include <stdlib.h> class WindshieldWiper{ //雨刷类 private: int wiperSpeed; //雨刷速度 public: WindshieldWiper(int w = 0); //构造函数 int getWiperSpeed(); //获取雨刷速度,用于显示输出 void setWiperSpeed(int s); //设置雨刷速度 }; class Lever{ //控制杆类,将控制杆与刻度盘做成一个类 private: int leverPosition; //控制杆位置 int dialPosition; //刻度盘位置 WindshieldWiper m; //雨刷对象,实现将控制杆与雨刷类联系起来 public: Lever(int l,int d):leverPosition(l),dialPosition(d){} ~Lever(){} void senseLeverUp(); //感知控制杆升挡 void senseLeverDown(); //感知控制杆降挡 void senseDialUp(); //感知刻度盘升挡 void senseDialDown(); //感知刻度盘降挡 int getLeverPostion(); //获取控制杆位置 void setLeverPosition(int); //设置控制杆位置 int getDialPosition(); //获取刻度盘位置 void setDialPosition(int); //设置刻度盘位置 void sendspeed(); //向雨刷传递雨刷速度, //即判断雨刷以什么速度摆动由控制杆类完成 }; WindshieldWiper::WindshieldWiper(int w ) { wiperSpeed = w; } void WindshieldWiper::setWiperSpeed(int s) { wiperSpeed = s; } int WindshieldWiper::getWiperSpeed() { return wiperSpeed; } int Lever::getDialPosition() { return dialPosition; } int Lever::getLeverPostion() { return leverPosition; } void Lever::setDialPosition(int d) { dialPosition = d; } void Lever::setLeverPosition(int l) { leverPosition = l; } void Lever::sendspeed() { int s; if(leverPosition == 0) //控制杆位置为0挡 s = 0; //雨刷速度为0 else { if(leverPosition == 1) //控制杆位置为1挡 { if(dialPosition == 1) //刻度盘位置为1挡 s = 4; else { if(dialPosition == 2) //刻度盘位置为2挡 s = 6; else //刻度盘位置为3挡 s = 12; } } else { if(leverPosition == 2) //控制杆位置为2挡 s = 30; else //控制杆位置为3挡 s = 60; } } m.setWiperSpeed(s); cout<<"Lever position is: "<<leverPosition<<endl; //输出 cout<<"Dial position is: "<<dialPosition<<endl; cout<<"Wiper speed is: "<<m.getWiperSpeed()<<endl; } void Lever::senseDialDown() { switch(dialPosition) { case 1: break; case 2: setDialPosition(1);break; case 3: setDialPosition(2);break; } sendspeed(); } void Lever::senseDialUp() { switch(dialPosition) { case 1: setDialPosition(2);break; case 2: setDialPosition(3);break; case 3: break; } sendspeed(); } void Lever::senseLeverDown() { switch(leverPosition) { case 0: break; case 1: setLeverPosition(0);break; case 2: setLeverPosition(1);break; case 3: setLeverPosition(2);break; } sendspeed(); } void Lever::senseLeverUp() { switch(leverPosition) { case 0: setLeverPosition(1);break; case 1: setLeverPosition(2);break; case 2: setLeverPosition(3);break; case 3: break; } sendspeed(); } void menu() //菜单 { int flag; Lever obj(0,1); while(1) { cout<<"Please choose operation:"<<endl; cout<<endl<<"\t========1:Lever Up========"<<endl; cout<<"\t========2:Lever Down======"<<endl; cout<<"\t========3:Dial Up========="<<endl; cout<<"\t========4:Dial Down======="<<endl; cout<<"\t========0:Quit============"<<endl<<endl; cin>>flag; switch(flag) //选择操作 { case 1:obj.senseLeverUp();break; case 2:obj.senseLeverDown();break; case 3:obj.senseDialUp();break; case 4:obj.senseDialDown();break; case 0:exit(0); default: cout<<"Invalid number"<<endl; } } } //main函数 void main() { WindshieldWiper w(0); menu(); }


### 关于北京航空航天大学数据结构课程第六次作业的相关内容 根据提供的引用内容[^1],可以推测北京航空航天大学的数据结构课程注重理论与实践相结合,尤其在栈、队列、递归等基本概念上有较为深入的讲解。然而,具体关于第六次作业的内容并未直接提及。以下是对可能涉及的题目型及解答方法的推测和总结: #### 1. 栈与队列的应用 如果第六次作业涉及栈与队列的操作,通常会要求学生实现具体的算法或解决实际问题。例如: - **题目**:设计一个算法,将链中数据域值最小的那个节点移至链的最前面。 - **解答**: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def move_min_to_front(head): if not head or not head.next: return head min_node = head prev, curr = None, head while curr: if curr.val < min_node.val: min_node = curr prev_min = prev prev = curr curr = curr.next if prev_min: prev_min.next = min_node.next min_node.next = head return min_node ``` 此代码通过遍历链找到最小值节点,并将其移动到链头部。 #### 2. 递归与非递归算法 引用中提到的最大公因子问题[^2]是一个经典的递归与非递归结合的例子。以下是两种解法: - **递归解法**: ```python def gcd_recursive(m, n): if n == 0: return m return gcd_recursive(n, m % n) ``` - **非递归解法**: ```python def gcd_iterative(m, n): while n != 0: m, n = n, m % n return m ``` #### 3. 字符串操作 字符串插入问题是另一个常见题目,可以通过指针操作实现: ```c void insert(char *s, char *t, int pos) { int i, j; for (i = pos, j = 0; t[j] != '\0'; i++, j++) { s[i + j] = t[j]; } s[i + j] = '\0'; } ``` #### 4. 文件搜索与处理 文件搜索命令`sgrep`[^2]的实现涉及文件读取与模式匹配,以下是伪代码示例: ```c #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { if (argc < 3) return 1; FILE *file = fopen(argv[2], "r"); if (!file) return 1; char line[1024], search[1024]; strcpy(search, argv[3]); int lineno = 0; while (fgets(line, sizeof(line), file)) { lineno++; if (strstr(line, search)) { printf("Line %d: %s", lineno, line); } } fclose(file); return 0; } ``` ### 总结 上述内容基于引用材料中的知识点进行了扩展,涵盖了栈与队列、递归与非递归算法、字符串操作以及文件处理等内容。具体第六次作业的题目和解答需要进一步确认课程资料或官方发布内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值