北邮的上机复试环境用的是标准c/c++,而我从大一开始就用vc6.0,很痛苦的出现了很多不同情况。今天用DEV c++解决了一些问题,总结一下。

1. gets() 和 scanf()

gets() 可以接收一行字符串直到EOF结束。而scanf("%s")接收一行的时候碰到空格等等的就会结束。但是可以用scanf模拟gets,即scanf("%[^/n]%*c",s).详见:http://blog.csdn.net/yinxusen/archive/2011/04/03/6300426.aspx

2. vc的编译器不是标准c/c++,其中有很大的出入。就拿科学计算器这道题来说吧,我的程序逻辑性不好是一方面,编译器不同也有很大的原因。题目如下:http://boj.me/onlinejudge/showproblem.php?problem_id=1511

我的vc程序

// 科学计算器

// 符号优先级 '*' >= '/' > '+' >= '-'

// 相同优先级按照左右顺序运算

// '=' 代表着输入结束

#include

#include

#define MAX 10000

double numStack[MAX];

int numTop=0;

char opStack[MAX];

int opTop=0;

double compute() {

double a,b,res;

switch(opStack[--opTop])

{

case '*':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a*b);break;

case '/':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b/a);break;

case '+':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a+b);break;

case '-':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b-a);break;

default:

break;

}

return res;

}

int main() {

char s[MAX];

double num=0;

int k=0,n=0,j=0;

scanf("%[^/n]%*c",s);

for (int i=0; s[i]!='/0';++i)

{

if (s[i] <= '9' && s[i] >= '0') // 识别数字

{

sscanf(&s[i],"%lf",&num);

while ((s[i]>='0')&&(s[i]<='9')) {++i;}

--i;

numStack[numTop++] = num;

} else if(s[i] == '=') {

while (opTop)

{

numStack[numTop++] = compute();

}

printf("%d/n",(int)(numStack[--numTop]));

} else if(s[i] == ' ') {

continue;

} else {

if(!opTop) opStack[opTop++] = s[i];

else {

if((s[i] == '*' || s[i] == '/') && (opStack[opTop-1] == '+' || opStack[opTop-1] == '-') ) {

opStack[opTop++] = s[i]; // 压栈

}

else {

numStack[numTop++] = compute();

opStack[opTop++] = s[i];

}

}

}

}

return 0;

}

这个程序在vc上面跑是没有问题的,结果非常非常的正确。但是在OJ上一直都是WA,很沮丧~

下面是我的DEV c程序

// 科学计算器

// 符号优先级 '*' >= '/' > '+' >= '-'

// 相同优先级按照左右顺序运算

// '=' 代表着输入结束

#include

#include

#define MAX 10000

double numStack[MAX];

int numTop=0;

char opStack[MAX];

int opTop=0;

void compute() {

double a,b,res;

switch(opStack[--opTop])

{

case '*':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a*b);break;

case '/':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b/a);break;

case '+':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a+b);break;

case '-':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b-a);break;

default:

break;

}

numStack[numTop++] = res;

}

int main() {

char s[MAX];

double num=0;

int k=0,n=0,j=0;

scanf("%[^/n]%*c",s);

for (int i=0; s[i]!='/0';++i)

{

if (s[i] <= '9' && s[i] >= '0') // 识别数字

{

sscanf(&s[i],"%lf",&num);

while ((s[i]>='0')&&(s[i]<='9')) {++i;}

--i;

numStack[numTop++] = num;

} else if(s[i] == '=') {

while (opTop)

{

compute();

}

printf("%d/n",(int)(numStack[--numTop]));

} else if(s[i] == ' ') {

continue;

} else {

if(!opTop) opStack[opTop++] = s[i];

else {

if((s[i] == '*' || s[i] == '/') && (opStack[opTop-1] == '+' || opStack[opTop-1] == '-') ) {

opStack[opTop++] = s[i]; // 压栈

}

else {

compute();

opStack[opTop++] = s[i];

}

}

}

}

// system("Pause");

return 0;

}

看出什么不同来了吗?

是的,compute() 函数有改动。我把原来的那句numStack[numTop++] = compute(); 改成了compute(); ,把原来的compute() 函数double compute() {

double a,b,res;

switch(opStack[--opTop])

{

case '*':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a*b);break;

case '/':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b/a);break;

case '+':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a+b);break;

case '-':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b-a);break;

default:

break;

}

return res;

} 改成了void compute() {

double a,b,res;

switch(opStack[--opTop])

{

case '*':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a*b);break;

case '/':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b/a);break;

case '+':

a= numStack[--numTop];

b= numStack[--numTop];

res = (a+b);break;

case '-':

a= numStack[--numTop];

b= numStack[--numTop];

res = (b-a);break;

default:

break;

}

numStack[numTop++] = res;

} 。

当然,程序的冗余性我们暂时不管他。这种改动有很大的不同。在vc中,编译器编译程序后的寻址方式是这样的。对于 numStack[numTop++] = compute();这句话,vc中是先做compute()这个函数,函数退出之后再做numStack[numTop++]的赋值工作。DEV c(standard c/c++)恰恰相反,他先做numStack[numTop++],再去运算compute() 函数。

最致命的问题是:我的numStack[numTop++]这句话和compute()函数中都有对堆栈的操作,这个堆栈和栈顶指针恰恰又都是全局变量!!

所以程序设计的时候一定要由软件工程的思想。一个函数做什么工作,那么他就只做这件事,不要让他做两件事。例如上面的compute函数,做运算就不要做出栈进栈的操作。

另外,全局变量一定要少用,很容易出问题。在一个编译器中可能看不出来,但是放到不同的编译器中就是问题。

像numStack[numTop++]这样的语句还是少些,你不知道什么时候就会出问题。还是乖乖的写成numStack[numTop];numTop++;算了。

3. 堆栈的问题,最好多使用程序库中有的东西吧,想堆栈,用vector模拟一下是比较好的,最好不要自己写。还有,如果让你排序的话,最好用自带的qsort()函数,不要自己写一遍。

4. 这个题目还要注意一点:1/2*2=1,但是如果用int存数据的话结果是0,所以这个程序要用double或者float去存。

还没几天就要复试了,这两天要多熟悉DEV啊~~

用了4年vc 的人你伤不起 啊,有木有有木有~~~~~~

c 科学计算机 优先级计算,北邮上机复试 科学计算器 —— 由编译器的不同引发的数十次 WA,最后终于AC——总结...相关推荐

  1. 自荐信当计算机课代表,北邮自主招生自荐信

    北邮自主招生自荐信 尊敬的老师: 您好! 我叫***,男,今年17岁,在河北省实验中学高三(**)理科实验班读书,感谢您在百忙之中审阅我的自荐材料. 我知道,北京邮电大学是新中国第一所邮电高等学府,是 ...

  2. 计算机专业去北邮还是天大,北京邮电大学的通信工程专业好还是天津大学的通信工程专业好?...

    北京邮电大学的通信工程专业好还是天津大学的通信工程专业好?这两个学校的专业经常会被拿来进行比较,直接回答这个问题,北京邮电大学的通信工程专业更好一些,但是天大的通信工程专业更好考.意思大家都明白了吧, ...

  3. 北邮计算机考研复试往年题目,北邮考研复试笔试题目汇总

    [实例简介] 北邮复试笔试的真题 今年考到的原题有很多 包括人工智能,数据库,编译原理,计算机体系结构等真题 [实例截图] [核心代码] 考研资料 └── 考研资料 ├── 2005年复试题目_fil ...

  4. 武大计算机就业与北邮比怎么样,武汉大学、北邮、厦门大学哪个比较好?这是我听过最好的回答...

    网友一: 武汉大学和厦门大学是985大学都是属于A类,北京邮电大学是211大学,不过这三所大学都是我国顶尖的高校.虽然北邮是211,但并不妨碍它出色的学科实力,以及地域的加成.北京作为首都拥有更多的就 ...

  5. 北科大和北京工业大学计算机专业咋样,北邮、北交大、北科大和北工大,4所211大学,谁更强?...

    原标题:北邮.北交大.北科大和北工大,4所211大学,谁更强? 北京邮电大学.北京交通大学.北京科技大学和北京工业大学,是四所非常有名的工科211大学,今天对这四所大学进行简单的对比介绍. 根据教育部 ...

  6. 北邮考研复试机试准备过程(已上岸)

    纯自用请勿转载,用来给自己最后复习和捋思路用的,主要参考牛客网+王道机试指南,C.C++混用.考研人太久不写代码了-什么都不记得了,从头开始过一遍吧. 黑色代码段是要记住的重点函数/方法.每天下午做几 ...

  7. 科学计算机如何输入x的n次方,科学计算器使用-20210321170247.docx-原创力文档

    第一章科学计算器使用 第一节计算器下载与安装及标准型的界面打开简介 科学计算器在 华军软件园 > 教育教学 > 理科工具 > 科学计算器多功能版可下载安装. 科学计算器在计算机中本身 ...

  8. 计算机5800计算道路标高程序,Casio fx-5800P计算器三个公路基本测量程序编写与应用...

    原标题:Casio fx-5800P计算器三个公路基本测量程序编写与应用 引论:casiofx-5800P计算器测量程序在计算机网络上多有流传,但有的测量主程序算法复杂,编程繁琐:有的程序内容表达错误 ...

  9. 算盘算筹计算机论文,计算工具的认识和算盘-计算器

    <计算工具的认识和算盘-计算器>由会员分享,可在线阅读,更多相关<计算工具的认识和算盘-计算器(39页珍藏版)>请在人人文库网上搜索. 1.数是个神秘的领域,人类最初对数并没有 ...

最新文章

  1. 3.2 表达式的类别与类型
  2. 类中成员函数声明后面的const的含义
  3. JAVA源码优化、分析工具
  4. C 库函数 - atoi()
  5. 2天,我把数据分析的Python+Tableau+Excel工具撸干净了!
  6. 华科考研834计算机网络,2018年华中科技大学834计算机专业基础综合 (模)...
  7. 【JAVA线程间通信技术】
  8. 深层神经网络——多层网络解决异或运算
  9. Hibernate性能优化
  10. mac读写ntfs工具
  11. 蓝桥杯 ADV-14 算法提高 卡勒沃夫之弱水路三千(提高型)
  12. 手机自动化测试IDE --手把手教你用Airtest模拟器来连接手机
  13. 分类模型的精确率(precision)与召回率(recall)(Python)
  14. javacv 人脸追踪_JavaCV开发详解之5:基于 JavaCV 的人脸识别
  15. 有什么好的搜图软件推荐吗?
  16. android 路由器,无线路由器上跑Android怎么样?
  17. 中国象棋总体设计 中国象棋课设02
  18. php trum,口碑曝光TrumoAurora评测如何?怎么样呢?使用报告曝光评测
  19. kepp-alive的作用?keep-alive的属性?路由元信息?白名单黑名单?keep-alive的钩子函数
  20. Nginx反向代理及域名解析访问本地项目

热门文章

  1. 华为神秘进军车联网   抱团传统车企后能否顺利占领C位?
  2. 解决SP3自定义桌面里没有IE选项的办法
  3. 台式计算机配置单文档,2012详尽台式电脑配置单.doc
  4. html图片下载链接怎么弄_html如何给图片加链接
  5. CentOS一键安装jdk17
  6. MATLAB美图软件算法研究,【网络多媒体学】matlab实现美图秀秀基本功能.ppt
  7. linux 下载软件wget,Linux下载工具wget和axel简介
  8. 微信小程序简单小日历
  9. leetcode股票问题
  10. 当数字遇上奇思妙想:探究力扣“最小偶倍数”解题思路