九度中调用禁用的系统库函数 系统调用有哪些

九度POJ--ACM训练第二天
今天做的第一道ACM试题遇到了平时不怎么关注的问题,于是花了大量的时间进行查书和上网搜寻,总结如下:
& 1、C++编译器的选择
在POJ上做ACM题目的时候,我先把代码在微软的VC++编译器(VC6.0)运行,并输入给出的输入用例和自己设计好的用例,没问题后再复制张贴到九度代码提交页面提交,第一二道题都没遇到问题,但是第三题开始出现问题了。我仔细查看才发现是编译器的问题,九度的POJ编译C++的编译器是GNU,跟VC有些不同,比如国际VC++标准规定for(int
i++)循环中定义的变量i出了for循环就跳出其作用域,GNU是按照C++国际标准设计的,而VC则不一样,在跳出for循环后i可以继续使用,不能重新定义,否则出错。另外网上说的区别还有:
& GNU C++ 是linux平台上的. Visual C++是WINDOWS上的.
& GNU C++使用linux上的API, VC++使用WIN API.
& C++语法有微小的差别:
& 这里仅仅拿VC6来说明, VC6由于某种原因, 不能很好支持C++新标准, 而GNU
C++是完全支持的.&
& 都完全支持C++标准库:STL,C Runtime library.
& 因此,仅使用标准库编写的代码,可以不经任何修改,在这两个编译器下编译.
& 不知道其他国家的ACM竞赛是按哪个标准编译的,在国内DEV
C++已被全国青少年信息学奥林匹克联赛设为C++语言指定编译器。
2、定点数与浮点数的区别,以及设置数值的有效位输出
因为考研科目有计算机组成原理,其中详细的讲道了定点数与浮点数。今天我再次打开了王道的《计算机组成原理联考复习指导》,对定点数与浮点数的总结如下:
& 机器数的分类:
根据在计算机中参与运算的机器数有无符号分为:无符号数(unsigned)和有符号数(signed,默认);
根据机器数小数点的位置是否固定分为:定点数和浮点数;
&&下面详细介绍定点数与浮点数:
定点数:即约定机器数中的小数点的位置是固定不变的,小数点不再使用点(.)表示,而是约定它的位置。因此分为定点小数与定点整数。定点小数是纯小数,约定小数点位置在符号位之后、尾数最高有效位之前,即二进制定点小数机器数的表示形式为
X=x0.x1x2x3...xn(其中x0为符号位,x1-xn是数值的有效部分,也称尾数,x1为最高有效位,机器字长为n+1位,例如一个字节为8位,则按1+7分配)。定点整数是纯整数,约定小数点位置在尾数最低有效位之后,即二进制定点整数机器数的表示形式为
X=x0x1x2x3...xn.(其中x0为符号位,x1-xn为尾数,xn是尾数的最低有效位)。
另外,在机器内部一般都是用补码表示,这样便于数学运算,对于机器数0,补码和移码的表示唯一,原码与反码的表示不唯一。同时记住一个规律,对于同符号的补码,不论其符号为正还是负,数值位越大真值越大。所以补码定点整数最大的机器数为0
11...1.(0表示符号为+),最小机器数为1
00..0。补码定点小数最大的机器数为0.11...1,最小机器数为1.00...0&;用补码表示还有一个特点,不管是定点数还是浮点数,补码表示的整数和小数都要比原码与反码多一个,整数是多一个原码最小负值-1,小数是多一个-1。补码的符号位取反即的移码,所以移码的表示范围与补码相同。
浮点数:浮点数表示法是以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。这样,在位数有限的情况下,既扩大了数的表示范围,又保持了数的有效精度。首先想到我们小学学习的科学计数法,可以把一个上亿级的数值简单的表示,而不是一位一位的写出来,当然这可能会丢失精度,这也是计算机中的数值处理中所必须面对的问题。比如C++中提供了float(32位=8(1+7)+24(1+23)),只能保证6位有效数字)单精度浮点数与double(64位=11(1+10)+52(1+51),至少可以保证10位有效数字)双精度浮点数,在实际计算中由于尾数的限制要舍去一定的精度,对于科学计算所要求的高精度计算则有专用计算机可以实现,我们的个人PC没有这么高的精度。计算机中浮点数的表示为
(r为数值基数,因为计算机是2进制的,所以r=2,日常生活中都是用10进制,r=10;阶码E为幂的次数,M为尾数),IEEE754标准规定浮点数的存储格式为:尾数符号位+阶码(包括阶符和数值)+尾数,其中符号位为1位,阶码用移码表示,尾数用补码表示,并隐藏尾数最高有效位1,故可多表示一位尾数,所以flaot尾数的实际表示位数为23+1=24,double尾数的实际表示位数为51+1=52
。浮点数在存储之前其阶码要先转化为移码,转化规则为:阶码值 = 幂的原码(阶码真值)+偏置值。
& 3、整形类型与浮点类型的选择
对于实际的程序来说,float类型精度通常是不够的——float只能保证6位有效数字,而double型至少可以保证10位有效数字,能满足大多数计算的需要。要求高精度的科学计算需要专门的科学计算专用机。
决定使用种整形:在使用整形时,默认为有符号,如果需要的是无符号的,使用unsigned类型可以避免值越界导致结构为负数的可能性。当执行整形算数运算时,很少用short类型。大多数程序中short类型可能会隐含赋值越界的错误。这个错误取决于所使用的机器。虽然char类型是整形,但是char类型通常用来存储字符而不用于计算,在某些实现中char类型被当做signed类型,在另外一些实现中则被当做unsigned类型,因此把char类型作为计算类型使用时容易出问题。在大多数机器上,使用int类型进行整形计算不易出错,实际应用中通用机器都是使用和long
int类型一样长的32位来表示int类型。在整形运算时,用32位表示int类型和用64位表示long类型的机器会出现应该选择int类型还是long类型的难题,在这些机器上,用long类型计算的运行时代价远远高于用int类型进行同样计算的代价,所以选择类型前要先了解程序的细节并且比较long类型与int类型的实际运行时性能代价。
决定使用哪种浮点型:就容易多了,使用double类型基本上不会有错,在float类型中隐式的精度损失是不能忽视的,而双精度计算的代价相对于单精度可以忽略。事实上,有些机器double类型比float类型的计算要快得多。long
double类型提供的精度通常没有必要,而且还需要承担额外的运行代价。
综上,整形使用int型,浮点型使用double型,char行不进行算数运算是比较推荐的方式。
& 4、运算过程中的类型提升以及控制输出精度
一个运算表达式中若有不同类型的数据,则总的运算原则是低精度向高精度提升,短数据向长数据提升。
对于输出数的精度控制,有两个函数,分别是fixed和setprecision(n)
& 关于setprecision(int),MSDN上的解释为:
If the display format is scientific or fixed, then the precision
indicates the number of digits after the decimal point. If the
format is automatic (neither floating point nor fixed), then the
precision indicates the total number of significant digits. This
setting remains in effect until the next change.
当输出的是科学计数数(float、double)或定点数计数法表示的数时,setprecison(int)表示设置输出数小数点后的位数。当输出的数据类型为浮点型时,setprecision(int)表示设置输出数的有效位数,
故通常控制浮点数输出时小数点后的位数的做法为:
第一步:先将要输出的数设置为定点数:
第二步:用setprecison设置小数点后位数:&
setprecision(2)
& 5、几个常用的字符串操作函数
九度POJ上题号为1003的试题主要是关于字符串操作的,如果对字符串的操作函数不熟悉,这道题将花费你许多的时间,这道题我花了3个小时才被AC,主要原因是我对字符串的操作函数不熟悉,下面介绍我解决这个问题所用的字符串函数,也是常用的函数:
&&& c_str()函数:头文件为&cstring.h&。返回
const char*
常量字符指针类型,所以你只能对返回的常量字符指针数组进行读操作,不能进行写(修改)操作,这样如果我们想要修改数组很不方便,下面的函数是解决方案;
&&& strcpy(to,from):头文件为&cstring.h&。将from字符数组中的字符复制到to字符数组,所以如果给定字符串str="。。。";我们就可以通过char
*p = new char[str.length()]; strcpy(p,
str.c_str());& 来将字符串转化为字符数组;
&& atoi(char_array)函数:头文件为&stdlib.h&。将字符数串(string类型或者字符数组类型)转化为整形。
& 6、ACM测试数据范围
九度POJ第1004题,本身并不难,但是里面的测试数据范围让我检错检查了一个小时。
题目中说测试数据长度在long int之内,我知道在很多机器上int 和 long int
都是32位的,所以代码中我都用的int,多次提交代码都被定论为wrong
answer,最后查看其它网友的答案才发现是我定义的int类型大小不够,服务器上的int和long int 应该不一样,我猜测int是32位,而long
int是64位,全都改成long int之后就被AC了,这又是一次深刻的教训啊。别以为在VC中int和long
int都是32位就认为其它编译器都一样,引以为戒吧。服务器的测试数据数组值都是很大的, 如果直接申请一个1000000 long的数组
系统也会分配,估计测试里面有一个很大很大的数组用来测试 。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。九度OJ 1062 分段函数-中国学网-中国IT综合门户网站
九度OJ 1062 分段函数
来源:互联网 更新时间: 2:51:34 责任编辑:王亮字体:
题目1062:分段函数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2892
解决:1682
题目描述:
编写程序,计算下列分段函数y=f(x)的值。
y=-x+2.5; 0&=x&2
y=2-1.5(x-3)(x-3); 2&=x&4
y=x/2-1.5; 4&=x&6
一个浮点数N
测试数据可能有多组,对于每一组数据,
输出N对应的分段函数值:f(N)。结果保留三位小数
样例输入:
样例输出:
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
double y(double x){
if(0&=x&&x&2.0)
result=-1*x+2.5;
else if(2&=x&&x&4){
result=2-1.5*(x-3.0)*(x-3.0);
result=x/2-1.5;
int main(int argc, char *argv[])
while(~scanf(&%lf&,&N))
printf(&%.3lf\n&,y(N));
/**************************************************************
Problem: 1062
User: kirchhoff
Language: C
Result: Accepted
Time:10 ms
Memory:912 kb
****************************************************************/
相关文章:
上一篇文章:下一篇文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(1&=n&=1000000), n代表将要输入的操作的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,代表将k压入栈。
Ci=’o’时,弹出栈顶元素。
对应每个测试案例中的每个操作,
若栈不为空,输出相应的栈中最小元素。否则,输出NULL。
样例输入:
样例输出:
【解题思路】本题一个最笨的想法就是每次取出所有的栈中的元素然后输出其最小值,然后再从新压入栈,当然这也仅仅是第一反应而已,题目肯定不能这么去解。从最小元素和栈的特点出发,我们每次取的只能是栈顶的元素,那么是不是存在每次取的元素就是我们需要的元素呢,也就是说每次取出的元素都是当前状态下的最小元素。仔细思考一下,我们发现我们可以压栈的时候做文章,我们可以在每次压栈的时候,都压入当前栈状态下的最小元素。
& &如何做到?若栈为空,但让栈的最小元素就是要压入的元素,直接压入,这个时候我们发现最小元素在栈顶。若栈非空,我们判断即将要压入的元素与栈顶元素(也就是当前栈中的最小元素)哪个小,我们压入小的那个,这样也确保当前栈的最小元素在栈顶。按照此规律压栈,我们能确保每次栈的最小元素在栈顶。
& & 输出的时候只需要取栈顶元素即可。
#include &cstdio&
#include &stack&
#include &set&
#include &iterator&
int main()
while(scanf(&%d&,&n)!=EOF)
char c[2];
stack&int&
multiset&int&
for(int i=0;i&n;++i)
scanf(&%s&,c);
if(c[0]=='s')
scanf(&%d&,&tt);
stk.push(tt);
setk.insert(tt);
if(!stk.empty())
multiset&int&::iterator it=setk.find(stk.top());
setk.erase(it);
stk.pop();
if(!stk.empty())
printf(&%d\n&,*setk.begin());
printf(&NULL\n&);
/**************************************************************
Problem: 1522
User: huo_yao
Language: C++
Result: Accepted
Time:20 ms
Memory:1188 kb
****************************************************************/题目链接:
九度-剑指Offer习题全套答案下载:
阅读(...) 评论()当前访客身份:游客 [
Write the code, Change the world.
:这代码复制过来也要复制得专业一点好么?怎么都多...
:嗯?通篇pcntl都是和“多线程”搭配在一起,这样...
:然并卵~跑出pin分分钟破解一切密码
:①is()会遍历调用它的对象,有符合条件的就返回t...
:因为二进制所以出错这个地方有点晕... 还提出了一...
:我现在是windows server 2012 遇到了这个问题,改...
:引用来自“xiangfang”的评论不对,Zend Guard ...
:引用来自“xiangfang”的评论不对,Zend Guard ...
:我说是win下apache + php5.3+ Zend Guard Loade...
今日访问:298
昨日访问:773
本周访问:4344
本月访问:3614
所有访问:332134
PHP中exec,system等函数调用系统命令详解
发表于3年前( 00:36)&&
阅读(1285)&|&评论()
0人收藏此文章,
  php的内置函数exec,system都可以调用系统命令(shell命令),当然还有passthru,escapeshellcmd等函数。
  在很多时候利用php的exec,system等函数调用系统命令可以帮助我们更好更快的完成工作。比如前二天笔者在批量处理.rar文件时exec就帮我了大忙了。
  今天整理一下常用的调用系统函数发出来和大家分享经验。
  注意:要想使用这二个函数php.ini中的安全模式必须关闭,要不然为了安全起见php是不让调用系统命令的。
  先看一下php手册对这二个函数的解释:
  exec --- 执行外部程式
  语法 : string exec ( string command [, array &output [, int &return_var]] )
  exec函数解析
  exec语法:&string exec(string command, string [array], int [return_var]);
  exec返回值:&字符串
  Exec参数说明
  Command – 需要执行的命令
  Array – &是输出值
  return_var –是返回值0或1,如果返回0则执行成功,返回1则执行失败。
  exec不成功,调试方案
  一个技巧就是使用管道命令, 使用 2&&1, 命令就会输出shell执行时的错误到$output变量, 输出该变量即可分析。
  exec('convert a.jpg b.jpg', $output, $return_val);
  改为:
  exec('convert a.jpg b.jpg 2&&1', $output, $return_val);
  print_r($output);
  说明 :
  exec( )执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。
  如果有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 如果数组先前已经包含了一些元素的话,exec( )将会把它附加在数组的后面,如果你不想要此函数附加元素的话,你可以在传递此数组给exec( )之前呼叫unset( )。
  如果有给予参数array和return_var,则传回执行的状态命令将会写到这个变量。
  注意 : 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。
  注意 : 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。
  system --- 执行外部程式并且显示输出
  语法 : string system ( string command [, int &return_var] )
  说明 :
  system( )执行给予的命令command,并且输出结果。如果有给予参数return_var,则执行命令的状态码将会写到这个变量。
  注意 : 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。
  注意 : 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。
  如果PHP是运作成伺服器模组,在输出每一行后,system( )会试着自动地清除web伺服器的输出缓冲。
  成功则传回命令的最后一行,失败则传回false。
  如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。
  这二个都是用来调用系统shell命令,
  不同点:
  exec可以把执行的结果全部返回到$output函数里(数组),$status是执行的状态 0为成功 1为失败
  systerm不需要提供$output函数,他是直接把结果返回出来,同样$return_var是执行的状态码 0为成功 1为失败
&&&&exec示例:
&&&&&?php&
&&&&&&&&$a = exec(&dir&,$out,$status);&
&&&&&&&&print_r($a);&
&&&&&&&&print_r($out);&
&&&&&&&&print_r($status);&
$a = exec(&dir&,$out,$status);
print_r($a);
echo &&br&-----------------------------------------------------&br&&;
echo &&pre&&;
//print_r($out);
var_dump($out);
echo &&/pre&&;
echo &&br&-----------------------------------------------------&br&&;
print_r($status);
&&&&system示例:
&&&&&?php&
&&&&&&&&$a = system(&dir&,$out);&
&&&&&&&&print_r($a);&
&&&&&&&&print_r($out);&
$a = system(&dir&,$out);
echo &&pre&&;
//print_r($a);
var_dump($a);
echo &&/pre&&;
echo &&br&-----------------------------------------------------&br&&;
print_r($out);
 大家可以运行一下看效果
在php开发网站中,经常需要执行系统外部命令。php提供4种方法执行系统外部命令:exec()、passthru()、system()、 shell_exec()。下面一一介绍。在开始前,先检查下php配置文件php.ini中是有禁止这是个函数。找到 disable_functions,配置如下:
disable_functions =
如果“disable_functions=”后面有接上面四个函数,将其删除。默认php.ini配置文件中是不禁止你调用执行外部命令的函数的。
方法一:exec()
function exec(string $command,array[optional] $output,int[optional] $return_value)
&?php &&&&&&& echo exec(&ls&,$file); &&&&&&& echo &&/br&&; &&&&&&& print_r($file); ?&
执行结果:
test.php Array( [0] =& index.php [1] =& test.php)
exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一 行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空 这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。
方法二:passthru()
function passthru(string $command,int[optional] $return_value)
&?php &&&&&&& passthru(&ls&); ?&
执行结果:
index.phptest.php
passthru与system的区别,passthru直接将结果输出到浏览器,不需要使用 echo 或 return 来查看结果,不返回任何值,且其可以输出二进制,比如图像数据。
方法三:system()
function system(string $command,int[optional] $return_value)
&?php &&&&&&& system(&ls /&); ?&
执行结果:
binbootcgroupdevetchomeliblost+foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar
system和exec的区别在于system在执行系统外部命令时,直接将结果输出到游览器,不需要使用 echo 或 return 来查看结果,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。
方法四:反撇号`和shell_exec()
shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体
&?php &&&&&&& echo `pwd`; ?&
执行结果:
/var/www/html
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读九度OJ 1062 分段函数 (模拟)
题目1062:分段函数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2877
解决:1671
题目描述:
编写程序,计算下列分段函数y=f(x)的&#20540;。
y=-x&#43;2.5; 0<=x<2
y=2-1.5(x-3)(x-3); 2<=x<4
y=x/2-1.5; 4<=x<6
一个浮点数N
测试数据可能有多组,对于每一组数据,
输出N对应的分段函数&#20540;:f(N)。结果保留三位小数
样例输入:
样例输出:
double y(double x){
if(0<=x&&x<2.0)
result=-1*x+2.5;
else if(2<=x&&x<4){
result=2-1.5*(x-3.0)*(x-3.0);
result=x/2-1.5;
int main(int argc, char *argv[])
freopen("1062.in", "r", stdin);
while(~scanf("%lf",&N))
printf("%.3lf\n",y(N));

我要回帖

更多关于 函数调用和系统调用 的文章

 

随机推荐