qq三国符咒碎片怎么用如何让环宇咒引伤害最大化

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 2970 人关注过本帖
标题:求一套C语言试题答案!
不要分析!
等 级:新手上路
&&已结贴√
&&问题点数:20&&回复次数:4&&&
求一套C语言试题答案!
不要分析!
C语言模拟试卷(4)
一、选择题
1.c语言中字符型(char)数据在内存中的形式存储是(&&&&&&)。
&&& A)原码&&& B)补码&&& c)反码&&& D)ASCII码
2.c语言中,长整型1ong数据在内存中的存储形式是(&&&&&)。
&&& A)ASCII码&&& E)原码&&& C)反码&&& D)补码
3.c语言的运算符按运算对象的数目可以分为(&&&&&&)。
&&&A)单目运算符一种&&&&&&&&&&&&B)单目和双目运算符
&&&C)单目、双目和三目运算符&&& D)单目、双目、三目和四目运算符
4.运算符有优先级,在c语言中关于运算符优先级的正确叙述是(&&&&&)。
&&& A)逻辑运算符高于算术运算符,算术运算符高于关系运算符
&&& B)算术运算符高于关系运算符,关系运算符高于逻辑运算符
&&& c)算术运算符高于逻辑运算符,逻辑运算符高于关系运算符
&&& D)关系运算符高于逻辑运算符,逻辑运算符高于算术运算符
5.c语言并不是非常严格的算法语言,在以下关于c语言的不严格的叙述中,错误的说法是(&&&&&&)。
大写字母和小写字母的意义相同
B)有些不同类型的变量可以在一个表达式中运算
C)在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型
D)同一个运算符号在不同场合可以有不同的含义
6.在c语言中,错误的int类型的常数是(&&&&&&)。
A)&&32768&&&&&& B)&&0&&&&&&&&C)&&037&&&&&&&&&D)0xAF
7.设int类型的数据长度为2个字节,则unsigned int类型数据的取值范围定(&&&&&)
A)0至255&&&&&&B)0至65535&&&&&&C)—3&&&&&& D)—256至255
8.以下(&&&&&&)是错误的转义字符。
A)’\\’&&&&&&&&B)’\’ ’&&&&&&&&&&&c)’\81’&&&&&&&&&D)’\0’
9.已知:char&&w;int x;float y;double z 则表达式w*x+z-y结果的类型是(&&&&&&).
A)float&&&&&&&&& B)char&&&&&&&&&&&&c)int&&&&&&&&&&&& D)double
10.sizeoff(double)是(&&&&&&)
A)函数调用&&& B) double型表达式&&C) int型表达式&&&D)非法表达式
11.已知:char ch=’A’;则下列表达式值是(&&&&&&)。
&&& Ch=(ch&=’A’&&ch&=’Z’)?(ch+32):
A)&&A&&&&&&&&&&&&&&&B)a&&&&&&&&&&&&&&C)&&&Z&&&&&&D) z
12.选出使变量i的运行结果为4的表达式(&&&&&&)。
A)&&int&&i:0,&&j=0:&&&&&&&&B)&&int&&i=1,&&j=0
&&&&&(i=3,(j++)+i);&&&&&&&&&&&&&&& j=i=((i=3)*2);
C)&&int&&i=0,&&j=1;&&&&&&&&& D)&&int&&i=1,&&j=1
&&&&&(j==1)?(i=1):(i=4);&&&&&&&&&&&i+=j+=2;
13.已知:int w=3,x=10,z=7;则执行下面语句后的结果为(&&&&&&)
&&& printf&&(”%d”,&&x>10?x+100:x-10 );
&&& printf&&(”%d”, w++||z++);
&&& printf(“%d”,! w>z);
&&& printf(“%d”,w&&z);
A)&&0111&&&&&& B)&&11111&&&&&& C)&&0101&&&&&&&&& D)0100
14.执行以下语句后的输出结果为(&&&&&&)
&&& enum&&weekday&&{sun, mon=3,tue,wed,thu};
&&& enum&&weekday&&workday;
&&& workday=wed&&;
&&& printf(”%d\n”,workday);
A)5&&&&&&&&&&&B)3&&&&&&&&& c)4&&&&&&&&&D)编译时出错
15.若有定义:enum weekday {mon,tue,wed,thu,fri} 则错误的语句是(&&& )。
A) workday= (enum&&weekday)3;&&& B)workday=&&(enum&&weekdoy) (4-2)
C) workday=3 ;&&&&&&&&&&&&&&&&&& D) workday=thu;
16.以下正确的描述为(&&&&&&)。
A)每个c语言程序必须在开头用预处理命令:#include<stdio.h&
B)预处理命令必须位于c源程序的首都
C)在C语言中预处理命令都以”#”开头
D)c语言的预处理命令只能实现宏定义和条件编译的功能&&&&&&&&&
17.以下有关宏替换叙述中,错误的是(&&&&&&)。
A)宏替换不占用运行时间&&&&&& B)宏名无类型
C)宏替换只是字符替换&&&&&&&&&D)宏名必须用大写字母表示
18.c语言对嵌套if语句的规定是:el se总是与(&&&&&&)配对。
A)其之前最近的if&&&&&&&&&&&& B)第一个if
C)缩进位置相同的if&&&&&&&&&&&D)其之前最近的且尚未配对的if
19.为了判断两个字符串s1和s2是否相等,应当使用(&&&&&&)。
A)&&if(s1= =s2)&&&&&&&&&&&&&&&&&B)&&if&&(s1=s2)
C)&&if(strcpy(s1,s2))&&&&&&&&&&&&D)if(strcmp(sl,s2)==0
20.下列关于switch语句和break语句的结论中,正确的是(&&&&&&)
A)break语句是switch语句的一部分
B)在switch语句中可以根据需要使用或不使用break语句
C)在switch语句中必须使用break语句
D) 在switch语句中不能使用break语句
21.以下错误的描述是(&&&&&&)。
A)break语句不能用于循环语句和switch语句外的任何其它语句
B)在switch语句中使用break语句或continue语句的作用相同
C)在循环语句中使用continue语句是为了结柬本次循环,而不是终止整个循环
D)在循环语句中使用break语句是为了使流程跳出循环体,提前结束循环
22.以下错误的描述是(&&&&&)。
A)使用while和do_while循环时,循环变量初始化的操作应在循环语句之前完成
B)while循环是先判断表达式,后执行循环体语句
c)do_while和for循环均是先执行循环体语句,后判断表达式
D)for、while和do—while循环中的循环体均可以由空语句构成
23.若int i=10:执行下列程序后,变量i的正确结果是(&&&&&&)。
&&& switch&&(i)&&
{&&case&&9:&&i+1;
&&&&&& case&&10:&&i+=1;
&&&&&& case&&11:&&i+=1;
&&&&&& default:&&i+=1;
A)10&&&&&&&&B)11&&&&&&&&&c)12&&&&&&&&& D)13
24.以下不是死循环的语句为(&&&&&&)。
A) for(;;x+=i);
B) while(x=1)&&{x++;}
C) for(i=10;;i- -)sum+=i;
D) for (;(c=getchar())!=’\n’;)&&printf( “%c”,c);
25.c语言程序由函数组成。它的 (&&&&&&)。
A) 主函数必须在其它函数之前,函数内可以嵌套定义函数
B) 主函数可以在其它函数之后,函数内不可以嵌套定义函数
C) 主函数必须在其它函数之前,函数内不可以嵌套定义函数
D) 主函数必须在其它函数之后,函数内可以嵌套定义函数
26.一个c语言程序的基本组成单位是 (&&&&&&)
A)主程序&&&&&&&&B)子程序&&&&&&&&C) 函数&&&&&&&&&D)过程
27.一个c语言程序总是从 (&&&&&&)开始执行。
A)主过程&&&&&& B)主函数&&&&&&&&C) 第一个函数&&&&&D)第一行
28.以下说法中正确的是——。
A) c语言程序总是从第一个定义的函数开始执行
B) 在c语言程序中,要调用的函数必须在main()函数中定义
C) c语言程序总是从main()函数开始执行
D) c语言程序中的main()函数必须放在程序的开始部分
29.若有以下说明,则数值为4的表达式是(&&&&&)
&&&&&&&&&&&& int&&&a[l2]={1,2,3,4,5,6,7,8,9,10,11,l 2};
&&&&&&&&&&&& char&&c=’a’,d,g;
A) a[g-c]&&&&&&B) a[4]&&&&&& C)&&&a[’d’-‘c’]&&&&&&&&&D)a[‘d’-c]
30.以下程序的输出结果是(&&&&&)
&&&main( )
&&& {&&& int&&& n[2]={0}, i, j,k=2;
&&&&&&&&&for (i=0;i<k;i++)&&
for (j=0;j<k;j++) n[j]=n[i]+1;
&&&&&&&&&printf(“%d\n”,n[k] );
A) 不确定的值&&& B) 3&&&&&& C) 2&&&&&&&&&&&&&&&&&&&&&D)1
31.以下程序的输出结果是(&&& )
{&&&int a[ ]={2,4,6,8,10}, y=1,x,*p;
&&& p=&a[1];
&&& for (x=0;x&3;x++)&&&y+=*(p+x);
&&& printf(“%d\n”,y);
A) 17&&&&&&&&&&&B) 18&&&&&&&&&&&&C) 19&&&&&&&&&&&&D) 20
32.以下程序的输出结果是(&&& )
# include&&“stdio.h”
{&&&x=try(5);
&&& printf (”%d\n”,x);&&&}
try(int n)
{ if&&(n>0)
&&&&&return&&(n*try(n-2));
&&& return&&(1);&&}
A)&&&15&&&&&B) 120&&&&&&C)&&&1&&&&&&&&&D)前面三个答案均是错误的
33.当说明一个结构变量时系统分配给它的内存是(&&&&&& )。
A) 成员所需内存量的总和&&&&&&&&&&&& B)结构中第1个成员所需内存量
C)成员中占内存量最大的所需的容量&&&D)结构中最后一个成员所需内存量
34.以下对结构类型变量的定义中错误的是(&&& )。
A)#define&&STUDENT&&&struct&&student&&&&&&&&&&&&&&&B) struct student
STUDENT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&{&&int num;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&float&&age;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&}&&stdl;
C)&&struct&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&D)&&struct
&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& struct&&student&&
35.在下列结论中,只有一个是正确的,它是(&&& ).
A)递归函数中的形式参数是自动变量
B)递归函数中的形式参数是外部变量
C)递归函数中的形式参数是静态变量
D)递归函数中的形式参数可以根据需要自己定义存储类型
36.下面程序段的运行结果是(&&&&&& )
&&char&&c[ ]=”\t\v\\\0will\n”;
&&print(”%d”, strlen(c));
A) 14&&&&&& B) 3&&& C) 9&&&&&&&&& D)字符串中有非法字符,输出值不确定
37.若有以下程序段:
&&& int a[ ]={4,0,2,3,l},i,j,t;
&&& for&&(i=1; i<5; i++)
&&& {&&&t=a[i];j=i-1;
while(j>=0&& t>a[j])
I&&&&&& {&&a[j+1]=a[j];j- -;}
a[j+1]=t;
&&&&&&&&&&&& }
38.则该程序段的功能是(&&&&&)。
A) 对数组a进行冒泡排序(升序)&&&&&&&&& B)对数组a进行冒泡排序(降序)
C) 对数组a进行选择排序(升序)&&&&&&&&& D)对数组a进行选择排序(降序)
39.已知:char b[5],*p=b;则正确的赋值语句是(&&& )。
A) b=“abcd”;&&& B)*b=“abcd“;&&C) p=“abcd”;&&& D)*p=“abcd”;
已知:char *aa[2]={“abcd”,“ABCD”};则以下说法正确的是(&&&&&)。
A) aa数组元素的值分别是“abcd”和“ABCD”
B) aa是指针变量,它指向含有两个数组元素的字符型一维数组
C) aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
D)aa数组的两个元素中各自存放了字符‘a’和‘A’的地址
40.若要用fopen函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应该是(&&&&&)。
A)“ab+”&&&&&& B)“wb+”&&& C) “rb+”&&&&&& D) “ab”
二、写结果题:
1.下面程序的运行结果是:
#include <stdio.h>
{&&int&&&i=0,j=0;
&&&while (i&10)
&&&&&&i++;
while (j++<10);
printf (“i=%d,j=%d\n”,i,j);
结果:&&&&&&&&&&&&&&&&&&&&&&&&&&&
2.阅读下面的程序并回答问题。
# include&&<stdio.h>
{ int&&a,b,m,n;
&&scanf (“%d%d”,&a,&b);
if&&(a>0〕&&m=m+n;
if&&(a<b)&&&n=2*m;
else&&if (a= =b)&&n=5;
&&& e1se&&n=m+n;
printf (“m=%d&&&n=%d\n”,m,n);
(1)当输入为-1&&-2<回车>,程序的运行结果为&&&&&&&&&&&&&&&&&
(2)当输入为l&&0<回车>,程序的运行结果为&&&&&&&&&&&&&&&&&
(3)为了输出n=4,变量a和b应具备条件&&&&&&&&&&&&&&&&&
3.下面程序的运行结果为
&&&# include&&<stdio.h>
&&& void&&main( )
&&& {&&int&&j,i,k=0;
&&&&&& for (j=11;j<=30;j++)
&&&&&& {&&if(k%10= =0)&&printf (“\n”);
for (i=2;i<j;i++)
&&&&&&&&&&&&&&if (!(j%i) )&&&break;
if (i&= j-1)
{&&printf (“%d\t”,j );
4.写出下面程序运行结果。
# include <stdio.h>
{&&int&&x=1;
void f1 ( ),f2( );
f1( );&&&
printf (“x=%d\t”,x);
printf (“x=%d\t”,x);
void&&f1 ( )
{&&int x=3;
printf (“x=%d\t”,x);}
void&&f2 ( int&&x)
{&&printf (“x=%d\t”,++x);}
三、程序填空题
1.下面的程序输出3到100之间的所有素数。
#tnclude<stdio.h>
&{&&int&&i,j;
for&&(i=3;i<=100;i++)
&&&{&&for(j=2;j<=i-1;j++)
if (________ )&&&
if (________)
printf&&(“%4d”, i )
&&&&&&&&&&&&&&&&&& }
2.下面的函数gcd (a, b)计算两个整数a和b的最大公因子。
gcd&&(&&int num,&&int den)
{&&int temp;
&&&while(den)
&&&{&&temp=________;
&&&&&&num=den&&;
den=temp;
return (___________);
3.函数primedec(m)是求整数m的所有素数因子,并输出。例如:m为120时,输出的素数因子为:2,2,2,3,5
primedec (int m)
{&&int k=2;
&&&&&&&&&&&&&&&&&&while(k<m)&&&&&
&&&&&&&&&&&&&&&&&&&&& if (m%k_________)
{ printf (“%d,”k);
&&&&&&&&____________;
else&&&__________;
&&&&&&&&&&&&&&&&&&}
4.己知:nx和ny的末3位数字相同,并见x≠y, x、y、n均为自然数,本程序的功能是:由键盘输入n.求满足上述条件的x、y,并使x+y为最小。
# include <stdio.h>
pow3 (int n,int&&x)
{&&int&&i,1ast;
&&&for (1ast=l,i=1;i&=x;i++ )
1ast=&&&&&&&&&&&& ;
&&&return (last );
{&&int&&x,n,min,flag=1;
&&&scanf (“%d”,&n);
&&&for ( min=2;flag;min++)
for( x=1;x&min&&falg;x++)
&&if (&&&&&&&&&&&&&&&&pow3 (n,x)= =pow3(n, min-x) )
&&{&&printf (“min=%d=%d+%d \n”,min,x,min-x );
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;
搜索更多相关主题的帖子:
等 级:论坛游民
帖 子:63
专家分:39
DBCBAABCDABD
等 级:新手上路
回复 2楼 parkour
大哥&&回答完啊&&&谢谢谢谢啦·········
等 级:论坛游民
帖 子:517
专家分:40
典型的不劳而获类,汗~~~飘过!
〖ΦγЙ┅给梦一把梯子,现实与梦想之间的距离即可忽略,不可跨越的迢迢银河举步便可迈过Й┅Φ〗
等 级:论坛游民
帖 子:26
专家分:18
我晕用手机上网无法回答你况且你的问题太多了。
版权所有,并保留所有权利。
Powered by , Processed in 0.046275 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved查看:1081|回复:6
如题,最近遇到一道笔试题,没什么思路,请大家能给点思路免费内容:
(726.38 KB)
(782.07 KB)
本帖最后由 itmonky 于
17:08 编辑
引用:原帖由 itmonky 于
17:04 发表
如题,最近遇到一道笔试题,没什么思路,请大家能给点思路
不考虑运算复杂度的话,直接循环遍历链表不就可以么
这个题说难不难,但也不是简单的遍历,否则你后面得重新组合链表。会相当麻烦。补多少了。我附上代码吧。
& & & & POLYNODE* clone(POLYNODE* toClone)
& & & & & & & & POLYNODE* node = new POLYNODE;
& & & & & & & & node-&index = toClone-&
& & & & & & & & node-&coef = toClone-&
& & & & & & & & node-&next =
& & & & & & & &
& & & & POLYNODE* copy(POLYNODE* toCopy)
& & & & & & & & if (toCopy == nullptr)
& & & & & & & & & & & &
& & & & & & & & clone(toCopy)-&next = copy(toCopy-&next);
& & & & POLYNODE* add(POLYNODE* one, POLYNODE* two)
& & & & & & & & if (one == nullptr)
& & & & & & & & & & & & return copy(two);
& & & & & & & & if (two == nullptr)
& & & & & & & & & & & & return copy(one);
& & & & & & & & if (one-&index & two-&index)
& & & & & & & & & & & & return add(two, one);
& & & & & & & & POLYNODE* nodeRet = clone(one);
& & & & & & & & if (one-&index & two-&index)
& & & & & & & & & & & & nodeRet-&next = add(one-&next, two);
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & nodeRet-&coef += two-&
& & & & & & & & & & & & nodeRet-&next = add(one-&next, two-&next);
& & & & & & & & }
& & & & & & & & return nodeR
& & & & POLYNODE* multify(POLYNODE* one, POLYNODE* two)
& & & & & & & & if (one == nullptr)
& & & & & & & & & & & &
& & & & & & & & POLYNODE* nodeRet = copy(two);
& & & & & & & & POLYNODE* temp = nodeR
& & & & & & & & while (temp != nullptr)
& & & & & & & & {
& & & & & & & & & & & & temp-&coef *= one-&
& & & & & & & & & & & & temp-&index += one-&
& & & & & & & & & & & & temp = temp-&
& & & & & & & & }
& & & & & & & & if (two-&next != nullptr)
& & & & & & & & & & & & return add(nodeRet, multify(one-&next, two));
& & & & & & & & return nodeR
& & & & & & & &
这纯粹递归做的。效率不高,add表示两个多项式相加, multify表示两个多项式相乘,另:我妹考虑析构,计算过程中有内存没析构。
引用:原帖由 点苍苔 于
14:55 发表
这个题说难不难,但也不是简单的遍历,否则你后面得重新组合链表。会相当麻烦。补多少了。我附上代码吧。
& && &&&POLYNODE* clone(POLYNODE* toClone)
& && && && && & POLYNODE* node = new POLYNODE;
& && && && && & node-&index = toClone-&
& && && &... 重新组合链表很简单呢。#include &stdio.h&
typedef struct elem{
& & struct elem *
}& &POLYNODE;
void insert_node(POLYNODE** list, POLYNODE* item){
& & if (NULL == *list){
& && &&&*list =
& & if (NULL == item){
& & POLYNODE* loop_item = *
& & while(loop_item){
& && &&&if(loop_item-&index == item-&index){
& && && && &loop_item-&coef += item-&
& && && && &
& && && && &
& && &&&else if(NULL == loop_item-&next){
& && && && &loop_item-&next =
& && && && &
& && &&&else if (loop_item-&index & item-&index && loop_item-&next-&index & item-&index){
& && && && &item-&next = loop_item-&
& && && && &loop_item-&next =
& && && && &
& && && &}
& && &&&loop_item = loop_item-&
void multify_node(POLYNODE* left, POLYNODE* right, POLYNODE* result){
& & if (NULL == left || NULL == right){
& && &&&result = NULL;
& & if (NULL == result){
& && &&&result = new POLYNODE();
& & result-&index = left-&index + right-&
& & result-&coef = left-&coef * right-&
& & result-&next = NULL;
void init_poly(POLYNODE** f, POLYNODE** g){
& & POLYNODE* d = new POLYNODE({0,3,NULL});
& & POLYNODE* c = new POLYNODE({1,6,d});
& & POLYNODE* b = new POLYNODE({3,9,c});
& & POLYNODE* a = new POLYNODE({5,12,b});
& & d = new POLYNODE({0,4,NULL});
& & c = new POLYNODE({2,5,d});
& & b = new POLYNODE({4,6,c});
& & a = new POLYNODE({6,7,b});
void free_poly(POLYNODE** l){
& & POLYNODE* item = *l;
& & while(NULL != *l){
& && &&&*l = (*l)-&
& && &&&item = *l;
& & l = NULL;
void print_poly(const char* f_name, POLYNODE* l){
& & POLYNODE * loop_item =
& & printf(&%s=&, f_name);
& & while(NULL != loop_item){
& && &&&if(loop_item-&coef != 0){
& && && && &if(loop_item-&index == 0 && loop_item-&coef != 0){
& && && && && & printf(&%.2f&, loop_item-&coef);
& && && && &}
& && && && &else if(loop_item-&coef == 1){
& && && && && & printf(&x^%d&, loop_item-&index);
& && && && &}
& && && && &else{
& && && && && & printf(&%.2f*x^%d&,loop_item-&coef, loop_item-&index);
& && && && &}
& && &&&loop_item = loop_item-&
& && &&&if (NULL != loop_item){
& && && && &printf(& + &);
& & printf(&\r\n&);
void multify(POLYNODE** left_list, POLYNODE** right_list, POLYNODE** result){
& & print_poly(&f(x)&, *left_list);
& & print_poly(&g(x)&, *right_list);
& & POLYNODE * l_loop_item = *left_
& & while(NULL != l_loop_item){
& && &&&POLYNODE * f_loop_item = *right_
& && &&&while(NULL != f_loop_item){
& && && && &POLYNODE* r_item = new POLYNODE();
& && && && &multify_node(l_loop_item, f_loop_item, r_item);
& && && && &insert_node(result, r_item);
& && && && &f_loop_item = f_loop_item-&
& && &&&l_loop_item = l_loop_item-&
& & print_poly(&r(x)&, *result);
int main()
& & POLYNODE* f = NULL;
& & POLYNODE* g = NULL;
& & POLYNODE* r = NULL;
& & init_poly(&f, &g);
& & multify(&f, &g, &r);
& & free_poly(&f);
& & free_poly(&g);
& & free_poly(&r);
& & return 0;博客访问: 73245
博文数量: 23
博客积分: 1069
博客等级: 准尉
技术积分: 240
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
===========================================
一个函数找出一个整数数组中,第二大的数
分析:利用选择排序法,一趟即可找出
int find_se_max( int data[] , int count){&&& int maxnumber = data[0] ;&&& int se_max = -32767 ;& //int类型中最小的整数 &&& for ( int i = 1 ; i < i++)&&& {&&&&&&& if ( data[i] > maxnumber )&&&&&&& {&&&&&&&&&&&& se_max =&&&&&&&&&&&& maxnumber = data[i] ;&&&&&&& }&&&&&&& else if ( data[i] > se_max )&&&&&&& {&&&&&&&&&&&& se_max = data[i] ;&&&&&&& }&&& }&&& return se_}
===========================================
===========================================
===========================================
void print9_9(void){&&&&& int i,j,&&&&& printf("\n");&&&&& for (i=1;i<10;i++)&&&&& {&&&&&&&&& for(j=1;j<=i;j++)&&&&&&&&& {&&&&&&&&&&&&& result=i*j;&&&&&&&&&&&&& printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/&&&&&&&&& }&&&&&&&&& printf("\n");/*每一行后换行*/&&&&& }}
===========================================
void&printData(int&data[],int&n)0n,组成n位数就组织n重循环& 0n 0n; &&&data[]data[]data[]data[j]data[j]data[]&&&&data[]data[j]data[k]
===========================================
从M个数中取出N个最大的数(M>=N)
思路:从M个数据中取出N个数据放到存储量为N的数组中,然后继续遍历直到比数组中最小的元素大时,数组中最小的元素替换为M当前元素,遍历到末尾,数组中的数据即是最终结果。
常用堆排序法维护N个数据,网上的方法很多,先记住这个!
===========================================
一次遍历单向链表找到中间节点:
思路:设计两个指针,一个走两步,一个走一步,两步的到尾时,一步的到中间
inode_p *get_middle_node(inode_p *head)
& inode_p *p1=
& inode_p *p2=p1;
& while(p2)
&&& p2=p2->
&&& if(p2)
&&&&& p2=p2->
&&&&& p1=p1->
& return p1;
一次遍历单向链表找到倒数第n个节点:
思路:设计两个指针p1、p2,p1先走n步,然后一起走,p1到尾时,p2到倒数第n个。
inode_p *get_middle_node(int n,inode_p *head)
& inode_p *p1=
& inode_p *p2=NULL;
& while((p1 != NULL)&&(--n)>0)&
&&&&p1=p1->
& if((p1==NULL)&&(n==0)) //节点数量刚好够
& else if(p1!=NULL)&&&&& //节点数量够
& while(p1 != NULL)
&&& p1=p1->
&&& p2=p2->
& return p2;
inode_p *get_middle_node(int n,inode_p *head)
& inode_p *p1=
& inode_p *p2=
& for(counter=0;(counter<n)&&(p1!=NULL);counter++)
&&& p1=p1-
& if(n != counter)
&&& return NULL;
& while(p1 != NULL)
&&& p1=p1->
&&& p2=p2->
& return p2;
====================================
确定CPU是大端还是小端:
int check_CPU(void)
& return (c.b==1);//c.b==1则返回1,是小端;否则返回0,是大端
所谓的大端模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中,& 这样的存储模式有点儿类似于把数据当作字符串顺序处理,地址由小向大增加,而数据从高位往低位放;所谓的小端模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,& 这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
====================================
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上两个操作中,要保持其它位不变。解答:采用#defines 和 bit masks 操作;这是一个有极高可移植性的方法,是应该被用到的方法;最佳的解决方案如下:
#define BIT3 (0x1<<3)
void set_bit3(void)
{ & a |= BIT3; } void clear_bit3(void)
{ & a &= ~BIT3; } 一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。主要考点:说明常数、|=和&=~操作。
====================================
试题:写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)解答:int Sum( int n ){ & return ( (long)1 + n) * n / 2; //或return& (1l + n) * n / 2;}
============================================
访问固定的内存位置(Accessing fixed memory locations)
嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
ptr = (int *)0x67a9;
*ptr = 0xaa55;
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;
建议采用第一种方法;
=======================================
交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;有两种解法, 一种用算术算法, 一种用^(异或)a = a +b = a -a = a - ora = a^b;// 只能对int,char..b = a^b;a = a^b;ora ^= b ^=
===================================
int a,b,c 请写函数实现C=a+b ,不可以改变数据类型,如将c改为long int,关键是如何处理溢出问题bool add (int a, int b,int *c){& *c=a+b;& return(a>0&&b>0&&(*c<a||*c<b)||(a<0&&ba||*c>b)));}
==================================
输出和为一个给定整数的所有组合 例如n=5 5=1+4;5=2+3(相加的数不能重复) 则输出 1,4;2,3。
int main(void) { & unsigned long int i,j,k; & printf("please input the number\n"); & scanf("%d",&i);&& if( i % 2 == 0)&&&& j = i / 2; & else &&& j = i / 2 + 1; & printf("The result is \n");&& for(k = 0; k < k++)&&&& printf("%d = %d + %d\n",i,k,i - k); & return 0; } #include
void main() { & unsigned long int a,i=1; & scanf("%d",&a); & if(a%2==0) & {&&&& for(i=1;i<a/2;i++)&&&&&& printf("%d",a,a-i); & } & else &&& for(i=1;i<=a/2;i++)&&&&&& printf(" %d, %d",i,a-i); }
=======================================
读文件file1.txt的内容(例如): 12 34 56 输出到file2.txt: 56 34 12 (逆序) #include
int main(void) { & int MAX = 10; & int *a = (int *)malloc(MAX * sizeof(int)); & int *b; & & & FILE *fp1; & FILE *fp2; & fp1 = fopen("a.txt","r"); & if(fp1 == NULL) & {& printf("error1"); & && exit(-1); & } & fp2 = fopen("b.txt","w"); & if(fp2 == NULL) & {& printf("error2"); & && exit(-1); & } & int i = 0;&&&int j = 0; & while(fscanf(fp1,"%d",&a[i]) != EOF) & { &&& i++; &&& j++; &&& if(i >= MAX) &&& { &&&&&& MAX = 2 * MAX; &&&&&& b = (int*)realloc(a,MAX * sizeof(int)); &&&&&& if(b == NULL) &&&&&& { &&&&&&&&& printf("error3"); &&&&&&&&& exit(-1); &&&&&& } &&&&&& a = &&& }&&&} & for(;--j >= 0;) & & fprintf(fp2,"%d\n",a[j]); & fclose(fp1); & fclose(fp2);&& return 0; }
一个递规反向输出字符串的例子,可谓是反序的经典例程. void inverse(char *p) { & & if( *p = = '\0' ) &&&&& & & inverse( p+1 ); & & printf( "%c", *p ); } int main(int argc, char *argv[]) { & & inverse("abc\0");&&&& return 0; }
借签了“递规反向输出” ,程序改为:#include
void test(FILE *fread, FILE *fwrite) { & char buf[1024] = {0}; & if (!fgets(buf, sizeof(buf), fread))&&&&&&&test( fread, fwrite ); & fputs(buf, fwrite); } int main(int argc, char *argv[]) { & FILE *fr = NULL; & FILE *fw = NULL; & fr = fopen("data", "rb"); & fw = fopen("dataout", "wb");&& test(fr, fw);&& fclose(fr);&& fclose(fw);&& return 0; }
=================================
用递归算法判断数组a[N]是否为一个递增数组。 递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { & if( n= =1 ) &&& & if( n= =2 ) &&& return a[n-1] >= a[n-2]; & return fun( a,n-1) && ( a[n-1] >= a[n-2] ); }
==================================
请列举一个软件中时间换空间或者空间换时间的例子。
时间优化:&void swap(int *a,int *b) {&& c=*a;*a=*b;*b=c; } 空间优化: void swap(int *a,int *b) { & *a=*a+*b;*b=*a-*b;*a=*a-*b; }==================================
有一个16位的整数,每4位为一个数,写函数求他们的和。 解释: 整数0111 和 &11+0111 感觉应该不难,当时对题理解的不是很清楚,所以写了一个函数,也不知道对不对。 疑问: & & 既然是16位的整数,0111是2进制的,那么函数参数怎么定义呢,请大虾指教。 答案:用十进制做参数,计算时按二进制考虑。 /* n就是16位的数,函数返回它的四个部分之和 */ char SumOfQuaters(unsigned short n) { & & char c = 0; & & int i = 4; & & do & & { & & & & c += n & 15;&//0b1111&&&&&&& n = n >> 4; & & } while (--i); & & } ==================================
写出程序把一个链表中的接点顺序倒排 typedef struct linknode { & & struct linknode * } //将一个链表逆置 node *reverse(node *head) { & node *p,*q,*r; & if((p=head)==NULL) //空链
&&&&& return NULL; & q=p-> & while(q!=NULL)&&&&&//不只一个节点时& { &&& r=q-> &&& q->next=p; &&& p=q; &&& q=r; & } & head->next=NULL; & head=p; & } =============================
两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串 void insert(char *s, char *t, int i) { & char *q = & char *p =s; & if(q == NULL)
&&& & while(*p!='\0') & { &&& p++; & } & while(*q!='\0') & { &&& *p=*q; &&& p++; &&& q++; & } & *p = '\0'; } ===========================================
写一个函数,功能:完成内存之间的拷贝 memcpy source code: void* memcpy( void *dst, const void *src, unsigned int len ) {&&&&&register char *d;&&&&&register char *s;&&&&&if (len == 0)&&&&&&&&&&&&&//if (is_overlap(dst, src, len, len))&&&&&&& //complain3("memcpy", dst, src, len);&
&&& if(dst==NULL||src==NULL)
&&&&&&& return NULL;&&& if(dst==src)
&&&&&&&&&&&if ( dst > src ) //目标地址在源地址后面时,从后向前复制,避免空间有重叠
&&& {&&&&&&& d = (char *)dst + len - 1;&&&&&&& s = (char *)src + len - 1;&&&&&&& while ( len >= 4 )
&&&&&& {&&&&&&&&&&&*d-- = *s--;&&&&&&&&&&&*d-- = *s--;&&&&&&&&&&&*d-- = *s--;&&&&&&&&&&&*d-- = *s--;&&&&&&&&&&&len -= 4;&&&&&&& }&&&&&&& while ( len-- )
&&&&&&&{&&&&&&&&&&&*d-- = *s--;&&&&&&& }&&&&&}
&&& else if ( dst < src ) //目标地址在源地址前面时,从前向后复制,避免空间有重叠
&&&&{&&&&&&& d = (char *)&&&&&&& s = (char *)&&&&&&& while ( len >= 4 )
&&&&&& {&&&&&&&&&&&*d++ = *s++;&&&&&&&&&&&*d++ = *s++;&&&&&&&&&&&*d++ = *s++;&&&&&&&&&&&*d++ = *s++;&&&&&&&&&&&len -= 4;&&&&&&& }&&&&&&& while ( len-- )
&&&&&&&{&&&&&&&&&&&*d++ = *s++;&&&&&&& }&&&&&}&&&&&&} 公司考试这种题目主要考你编写的代码是否考虑到各种情况,是否安全(不会溢出) 各种情况包括: 1、参数是指针,检查指针是否有效 2、检查复制的源目标和目的地是否为同一个,若为同一个,则直接跳出 3、读写权限检查 4、安全检查,是否会溢出
==================================
memcpy拷贝一块内存,内存的大小你告诉它 strcpy是字符串拷贝,遇到'\0'结束 /* memcpy ─── 拷贝不重叠的内存块 */ & void memcpy(void* pvTo, void* pvFrom, size_t size) { & void* pbTo = (byte*)pvTo; & void* pbFrom = (byte*)pvF & ASSERT(pvTo != NULL && pvFrom != NULL); //检查输入指针的有效性 & ASSERT(pbTo>=pbFrom+size || pbFrom>=pbTo+size);//检查两个指针指向的内存是否重叠 & while(size-->0) &&& *pbTo++ == *pbFrom++; & return(pvTo); } ===================================
怎么判断链表中是否有环? bool CircleInList(Link* pHead) { & if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环 &&& return (false); & if(pHead->next = = pHead)//自环 &&& return (true); & Link *pTemp1 = pH//step 1 & Link *pTemp = pHead->//step 2 & while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL) & {&//pTemp走两步,pTemp1走一步,如有环,最终有pTemp=pTemp1&&& pTemp1 = pTemp1-> &&& pTemp = pTemp->next-> & } & if(pTemp = = pTemp1) //因有环而退出while循环&&& return (true); & return (false); //无环:pTemp==NULL&|| pTemp->next==NULL} ===============================
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。 int search(char *cpSource, int n, char ch) { & & for(i=0; i<n && *(cpSource+i) != ++i);&&& } ====================================
写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于 str2返回1,若str1小于str2返回-1 int strcmp ( const char * src,const char * dst) { & int ret = 0 ; & while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) & { &&& ++ &&& ++ & } & if ( ret < 0 ) &&& ret = -1 ; & else if ( ret > 0 ) &&& ret = 1 ; & return( ret ); } ===================================
求1000!的未尾有几个0(用素数相乘的方法来做,如72=2*2*2*3*3); 求出1->1000里,能被5整除的数的个数n1,n1中能再被5整除的数的个数n2,n2中能再被5整除的数的个数n3,依此类推,直到个数n小于5 1000!末尾的零的个数=n1+...+n4(n4<5);
#include #define NUM 1000 int find5(int num)
{&& int ret=0; & while((num=num/5)>0)&&&& ret+=&& } int main()
{&& printf(" the total zero number is %d\n",find5(NUM)); & return 0; } ========================================
有双向循环链表结点定义为: struct node { & struct node *front,* }; 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
BOOL DeteleNode(Node *pHeader, DataType Value) { & if (pHeader == NULL)
&&& & BOOL bRet = FALSE; & Node *pNode = pH & while (pNode != NULL) & { &&& if (pNode->data == Value) &&& { &&&&& if (pNode->front == NULL)&&&&&&&{ &&&&&&& pHeader = pNode-> &&&&&&& pHeader->front = NULL; &&&&& } &&&&& else &&&&& { &&&&&&& if (pNode->next != NULL) &&&&&&& { &&&&&&&&& pNode->next->front = pNode-> &&&&&&& } &&&&&&& pNode->front->next = pNode->&&&&&&&} &&&&& Node *pNextNode = pNode-> &&&&& delete pN &&&&& pNode = pNextN &&&&& bRet = TRUE; &&&&& //不要break或return, 删除所有 &&& } &&& else &&& { &&&&& pNode = pNode-> &&& } & } //while(...)& return bR } //DeteleNode(...)void DE(Node *pHeadA, Node *pHeadB) { & if (pHeadA == NULL || pHeadB == NULL)&&&& & Node *pNode = pHeadA; & while (pNode != NULL) & { &&& if (DeteleNode(pHeadB, pNode->data)) &&& { &&&&& if (pNode->front == NULL) &&&&& { &&&&&&& pHeadA = pNode-> &&&&&&& pHeadA->front = NULL; &&&&& } &&&&& else &&&&& {&&&&&&&& pNode->front->next = pNode-> &&&&&&& if (pNode->next != NULL) &&&&&&& { &&&&&&&& &pNode->next->front = pNode-> &&&&&&& } &&&&& } &&&&& Node *pNextNode = pNode-> &&&&& delete pN &&&&& pNode = pNextN &&& } &&& else &&& { &&&&& pNode = pNode-> &&& } & } //while(...)}========================
编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
思路:通过一次循环找到一次公共字符的开始位置和个数,和上一次的个数对比,若大则更新公共字符的数据,循环结束则返回最大公共字符个数和开始位置。
函数返回:最大公共子字符串的长度,最大公共子字符串的开始处int GetCommon(char *s1, char *s2, char **r1, char **r2) { & int len1 = strlen(s1); & int len2 = strlen(s2); & int maxlen = 0; & for(int i = 0; i < len1; i++) & { &&& for(int j = 0; j < len2; j++) &&& { &&&&& if(s1[i] == s2[j]) &&&&& { &&&&&&& int as=i+1, bs=j+1, count=1;&//as,bs指向下一个元素&&&&&&& while(as<len1 && bs<len2 && s1[as++]==s2[bs++])
&&&&&&&&&&& count++;
&&&&&&& //通过s1[++as]==s2[++bs],确定一次内循环找到的公共字符数&&&&&&& &&&&&&& if(count > maxlen)&//如果本次的公共字符数大,则更新数据&&&&&&& { &&&&&&&&& maxlen = &&&&&&&&& *r1 = s1 +&&&&//指向字符串1最大公共字符的开始处&&&&&&&&& *r2 = s2 +&&& //指向字符串2最大公共字符的开始处&&&&&&& }&&&&&&&} &&& } //for(...)
& if(len1-i-maxlen<=maxlen) //当不可能产生新的最大公共字符个数时
&&&&&&&&&&&&&&&&&&&&&//循环退出,& }//for(...)
&}============================
编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数
十六进制形式输出:char* test16(long num)
{ & char* buffer = (char*)malloc(11); & buffer[0] = '0'; & buffer[1] = 'x'; & buffer[10] = '\0'; & char* temp = buffer + 2; & for (int i=0; i < 8; i++)
& { &&& temp[i] = (char)(((num<>28)&0xF); //先算最高4位,依次类推&&&& temp[i] = temp[i] < 10 ? temp[i] + 48 : temp[i] + 55; //转为字符0~9,A~F& } & }
二进制形式输出:
char* test2(long num)
{ & char* buffer = (char*)malloc(35); & buffer[0] = '0'; & buffer[1] = 'x'; & buffer[34] = '\0'; & char* temp = buffer + 2; & for (int i=0; i < 32; i++)
& { &&& temp[i] = (char)(((num<>31)&1)+48;
&&& //先算最高1位,依次类推,转为字符0或1& } & } ==============================
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析:兔子的规律为数列 1,1,2,3,5,8,13,21...
&&&&本项的值为前两项之和。1,2,3,4,5,6,7 ,8 ...
斐波拉契数列递归实现的方法如下: &int &Funct( int n ) { & &if(n==0) return 1; & &if(n==1) return 1; & &retrurn &Funct(n-1) + Funct(n-2); } 请问,如何不使用递归,来实现上述函数?&解答:int Funct( int n ) &// &n 为非负整数 { & &int a=0; & &int b=1; & & & &if(n==0 || n==1)&&&&&&&& //第一个月
&&&&&c=1;&&&&else
&&&& for(int i=2;i<=n;i++) &//应该n从2开始算起 & && { & & && c=a+b; & & && a=b; & & && b=c; & && } & & } ========================================
判断一个字符串是不是回文 :如"abccba"int IsReverseStr(char *aStr) { & int i,j; & int found=1; & if(aStr==NULL) &&& return -1; & j=strlen(aStr); & for(i=0;i<j/2;i++) &&& if(*(aStr+i)!=*(aStr+j-i-1))&//第一个和最后一个比较;向中间靠拢&&& { &&&&& found=0; &&&&& &&& } & //1:是,0:否,-1:空指针} =================================
Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
数学实现:
int lastone(int nums,int step,int start)//nums为个数,step为步数,start为起始位置;所有参数1为起始数{&&& int i,s=0;&&& if(nums<2)&&&&& return 0;&&& for(i=2;i<=i++)&&&&&&//通过数学公式得出最后的序号&&&&& s=(s+step)%i;&&&&&&&&&& //效率最高的方法&&& return (s+start-1)%nums+1;}数组实现:
#include int lastone(int num,int steps)//num为总个数,steps为步数{& int i,m=& int temp[m];& int *p=& for(i=1;i<=i++)&//初始化数组为1~num& {&&& temp[i-1]=i;& }& i=0; //初始化步数& while(num>1)& {&&& if(*p++ != 0)&&//指向数组的指针移动,若指向的值不为0时,步数加1&&&&& i++;& &&& if(i==steps-1)&//步数到达时,把数组中的数据置为0&&& {&&&&& i=0;&&&&& num--;&&&&&&&//退出计数,表明有多少个数据退出&&&&& while(*p==0)&//若值为0时,指针移动&&&&& {&&&&&&& p++;&&&&&&& if(p>&temp[m-1])&//指针越界时,重置为初始值&&&&&&&&& p=&&&&&&&&&&& &&&&& }&&&&& *p=0;&&&&&&&&//置为0,表明其退出&&& }&&& if(p>&temp[m-1])& //指针越界时,重置为初始值&&&&& p=& }& p=& while(!(*p++));&&//找到不为0的数据& return *--p;&&&& //返回数据中元素的值,即其序号(1~num)}int main(void){& int i,m=7,s=5;& i=lastone(m,s);& printf("%d",i);& getchar();& return 0;&&& }&(2)
int Josephu(int n, int m) { & int flag, i, j = 0; & int *arr = (int *)malloc(n * sizeof(int)); & for (i = 0; i < ++i) & & arr[i] = 1;&&&&& //初始化为数组空间1& for (i = 1; i < ++i)&&//i是标号,即标示有多少个退出& { & & flag = 0;&&&&&&&&//flag是步数&&& while (flag < m)&//步数没到时&&& { & & & if (j == n)&&& //出界时,重置为0,回头&&&&&&& j = 0; & & & if (arr[j])&&& //元素数据为1时,步数增加1&&&&&&& ++ & & & ++j;&&&&&&&&&& //向前推进一步&&& } & & arr[j - 1] = 0;&&//元素数据置为0,表明数据退出&&& printf("第%4d个出局的人是:%4d号\n", i, j); & }
& while(!arr[j-1])&& //找到最后一个不为0的元素
&&& j++;&& free(arr); & } int main() { & int n, & scanf("%d%d", &n, &m); & printf("最后胜利的是%d号!\n", Josephu(n, m)); & system("pause"); & return 0; } 链表实现: #include
typedef struct Node { & & struct Node * }JosephuN int Josephu(int n, int m) { & int i, & JosephuNode *head, * & head = tail = (JosephuNode *)malloc(sizeof(JosephuNode)); & for (i = 1; i < ++i) & { & & tail->index = & & tail->next = (JosephuNode *)malloc(sizeof(JosephuNode)); & & tail = tail-> & } & tail->index = & tail->next = & & for (i = 1; tail != ++i) & { & & for (j = 1; j < ++j) & & { & & & tail = & & & head = head-> & & } & & tail->next = head-> & & printf("第%4d个出局的人是:%4d号\n", i, head->index); & & free(head); & & head = tail-> & } & i = head-> & free(head); & } int main() { & int n, & scanf("%d%d", &n, &m); & printf("最后胜利的是%d号!\n", Josephu(n, m)); & system("pause"); & return 0; }
========================================
已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 解说: 1.strcpy的实现代码
#include char * strcpy(char * strDest,const char * strSrc) { & //if ((strDest==NULL)||(strSrc==NULL))&&&&&&& //[1]&&&& //return NULL;//throw "Invalid argument(s)";//[2]
&&assert(strDest!=NULL);
& assert(strSrc!=NULL);&&& &//断言分开判断
& char * strDestCopy=strD&&&&&&&&&&&&&&&& //[3]& while((*strDest++=*strSrc++)!='\0');&&&&&&&//[4]&&&& return strDestC } 错误的做法: [1] (A)不检查指针的有效性,说明答题者不注重代码的健壮性。 (B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。 (C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。 [2] (A)return new string("Invalid argument(s)");,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。 (B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。 [3] (A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。 [4] (A)循环写成while (*strDest++=*strSrc++);,同[1](B)。 (B)循环写成while (*strSrc!='\0') *strDest++=*strSrc++;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上'\0'。
=========================
unsigned int intvert(unsigned int x,int p,int n)
实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.
如x=0b0<FONT style="BACKGROUND-COLOR: #ffff80" color=# 0001,p=4(bit 4),n=3(共3位),转换后x=0b0110 0001unsigned int intvert(unsigned int x,int p,int n)
{& unsigned int _t = 0;& unsigned int _a = 1;& for(int i = 0; i < ++i)
& {&&& _t |= _a;&&&&//把_t转为MARK(掩码),_t=0b0111;&&& _a = _a << 1;& }&&_t = _t <<& x ^= _t;&}
========================
阅读(2696) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 qq三国左武和符咒 的文章

 

随机推荐