第一次作业

T2.基本计算器

使用了数组栈——数字栈和符号栈

T5.全排列输出(permutation)

使用了标准写法——字典序算法

void reverse(int left,int right);/*逆转a[left]~a[right]顺序*/
int nextPermutation(int n)/*1~n的全排列*/
{
int i,j;
for(i=n-1;i>0 && a[i]<a[i-1];i--); //从后向前,找到当前排列中首个a[i-1]<a[i](升序)的位置——即子列峰值
if(i==0) return 0;
else
{ //从a[i]开始向后,找到子排列中首个比a[i-1]小的a[j],这样a[j-1]就是最小的比a[i-1]大的数,是a[i-1]下一个全排列的目标值(我们就是这么想的)
//于是交换a[i-1]和a[j-1]的值,再将其后的子列逆序以期得到极小的排列增长(其实就有递归的思想)
for(j=i;j<n && a[j]>a[i-1];j++);
a[j-1]^=a[i-1],a[i-1]^=a[j-1],a[j-1]^=a[i-1];
reverse(i,n-1);
return 1;
}
}
/*主体操作,a[0]~a[n-1]全排列输出*/
do{
for(i=0;i<n;i++) printf("%d ",a[i]);
puts(""); //输出
}while(nextPermutation(n)); //得到下一个排列
return 0;

e.g.

1  3  5  4  2

1  3  5  4  2  a[i-1]=3 从后向前首个升序处,也是下一个排列的目标更改出

1  3  5  4  2  a[j-1]=4 大于a[i-1]的极小值

1  4  5  3  2  此后子列必倒序逆序排列即可

1  4  2  3  5  < FINAL

第二次作业

选填

关于优先级:

[] , () , . , -> * , & ,++/--
从左向右 1 从右向左 2

一些可移植性差的函数警惕

feof() fflush()

第三次作业

T3.链表存储多项式时,野指针读入的错误及其衍生错误

typedef struct node
{
int coef;
int exp;
struct node *link;
} PNode, *PLinklist; /*链表形式*/ PLinklist readPoly() /*读入多项式*/
{
PLinklist list=NULL;
//应为想用作接口,使用了局部的变量list来普遍化操作,结果忘记赋值成了野指针,在配合上本地CodeBlocks编译器的环境优化,产生了千奇百怪的错误结果
PLinklist p,r;
do
{
p=(PLinklist)malloc(sizeof(PNode));
scanf("%d%d",&p->coef,&p->exp);
p->link=NULL;
if(list==NULL) list=p; //若为野指针,此处list==NULL就挂了
else r->link=p;
r=p;
}while(getchar()!='\n');//当检测到行末'\n'后结束
return list;
}

此次大失误让人进一步了解了自己编译器的尿性(猜测)



咱的编译器会给野指针沿用之前历史的值,若没有历史则赋为NULL;

然后如果中间有些扰动(在其他域申明了相同名字的变量时)就会丢弃历史值。

因而两个链表连缀起来了

然而有些错误尚无法解释,需进一步研究:



加入printf("sf");后只读入前半,直接爆炸

加入printf("sf\n");就不会如此

T1.多线段连缀,找最长连续线段

由于数据点弱,感觉什么算法都能过,但自己竟然卡了那么久;

使用了自创的想法:单链表表示线段,单循环链表记录每条线段的头结点(方便顺次循环比较)

因为忽视了循环链表表头丢失的可能性

typedef struct node
{ /* 记录一条连续线段*/
int x;
int y;
struct node *link;
} LNode, *Line; typedef struct circleHead
{
Line head; /* 记录每个连续线段头结点*/
int num; /* 记录该连续线段的组成线段数*/
struct circleHead *link;
} CNode, *hCoord; int doConnect(int last) //还是无脑的循环比较,直至线段集合不再变动
{
int i=0;
hCoord p=Clist,q,pre;
Line pp,rr; while(i<last)
{
pp=p->head;
while(pp->link!=NULL) pp=pp->link;
rr=pp; for(q=p->link,pre=p;q!=p;pre=q,q=q->link)
{
if(isConnect(q->head,rr))
{
rr->link=q->head->link;
p->num+=q->num;
pre->link=q->link;
last--;
i=0;//清零,否则会有跳过的可能性(好傻!)
break;
}
}
if(q==p) i++;
else
{
free(q);
continue;
}
p=p->link;
Clist=p; /* 注意当p不是Clist时,可能会因为Clist所指的结点移动到p结点后而导致Clist丢失*/
}
return last;
}

此题助教推荐了并查集,学学去

第三次作业的两个重大失误,源自于对链表指针的忽视,今后要特别注意

【练习回顾】DS前三次作业的更多相关文章

  1. OPP前三次作业总结

    OPP前三次作业总结 目录 前言: 第一次OOP训练: 7-7 有重复的数据 设计与分析: 具体代码 踩坑心得 改进建议 7-8 从一个字符串中移除包含在另一个字符串中的字符 设计与分析: 具体代码 ...

  2. OO前三次作业总结

    一.第一次作业 1.程序设计分析 ![img](s1.ax1x.com/2018/04/02/CSgoSU.png) 图1 第一次作业类图 ![name](https://images2018.cnb ...

  3. Blog总结(前三次作业总结)

    前三次作业总结 1.前言 (1)第一次题目集共有8道题目,难度较为简单,知识点为JAVA的一些编程基础知识点,如输入输出,选择,循环,一维数组等. (2)第二次题目集共有5道题目,难度较第一次题目集有 ...

  4. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  5. OO课程第一阶段(前三次作业)总结Blog1

    OO课程第一阶段(前三次作业)总结Blog1 前言:学习OOP课程的第一阶段已经结束了,在此进行对于知识点,题量,难度的个人看法. (1)相比于另外两次作业,第一次作业基本上是基本的编程的语法训练,题 ...

  6. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  7. 第一次码java感想及前三次作业总结

    写在前面 嗯,首先是java,这学期第一次oo作业布置下来的周末才开始看的,第一次作业因此写得有些手忙脚乱.不过大概看了一遍后发现比c好用,入门更简单吧,好多操作直接import一下就能用了,码代码的 ...

  8. OO第四次作业-对前三次作业总结

    第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...

  9. OO前三次作业简单总结

    随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...

  10. oo前三次作业博客总结

    第一次作业 实现多项式的加减运算,主要问题是解决输入格式的判断问题. 输入实例: {(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-199,2), (29,3 ...

随机推荐

  1. Qt设置运行时动态库路径的几点说明

    随着需求的不断增加,程序不断变大,用到的动态库也越来越多,到了发布程序的时候你会发现和可执行文件同一目录下文件数量真多(比如著名的金融软件 https://www.webull.com/ 哎呀我去,目 ...

  2. Qt开发经验小技巧131-140

    Qt新版本往往会带来一些头文件的更新,比如以前使用QPainter绘制,不需要额外包含QPainterPath头文件,而5.15版本开始就需要显示主动引入#include "qpainter ...

  3. [转]vue 项目npm install 报错 npm ERR! enoent undefined ls-remote -h -t ssh://git@github.com/sohee-lee7/Sq

    npm install出错的解决办法 很多小伙伴可能跟我一样是个小白,还不知道怎么启动vue,然后就照着README一阵乱搞,然后npm install的时候就报了以下的错误,网上的解决办法也看不懂, ...

  4. C# 设置label(标签)控件的背景颜色为透明

    有时候,我们需要将控件的背景颜色设定为透明,比如说label(标签)控件.那么,如何将控件的背景颜色设定为透明?是不是只要将控件的BackColor属性设为Transparent(透明)就可以了呢?答 ...

  5. Python 添加类型标注 | 散发着自由松散气息的代码

    Python 添加类型标注 | 散发着自由松散气息的代码 Python 如此简洁,书写者在声明变量时甚至无需考虑类型. 但是简洁与复杂间,是存在一个平衡点的.当我们书写较为复杂的项目时,还是希望可以拥 ...

  6. ls小技巧

    一.ls -rt ls的功能是列出指定路径下的所有文件,但是有时候文件太多,不方便查找哪些是新生成的文件时,可以使用ls -t或ls -rt命令. ls -t ls -rt 那是什么意思呢?这里-t就 ...

  7. c# set Webbowser version with WPF/Winform app

    <Window x:Class="TestWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...

  8. linux-杂项

    1.常用基础 防火墙systemctl status firewalldsystemctl stop firewalldsystemctl start firewalld find / -size + ...

  9. RocketMQ的架构设计、关键特性、与应用场景详解

    内容大纲: 1.RocketMQ的简介与演进 2. RocketMQ的架构设计 3.RocketMQ的关键特性 4.RocketMQ的应用场景 RocketMQ的简介 RocketMQ一个纯java. ...

  10. Redis组件的特性,实现一个分布式限流

    分布式---基于Redis进行接口IP限流 场景 为了防止我们的接口被人恶意访问,比如有人通过JMeter工具频繁访问我们的接口,导致接口响应变慢甚至崩溃,所以我们需要对一些特定的接口进行IP限流,即 ...