#include<stdio.h下载> void PrintN (int N) { int i; for (i=1;i<=N; i++) printf("%d\n",i); return; }

printf函数称为格式输出函数,其关键字最末一个字母f即为&格式&(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。
printf函数调用的一般形式
printf函数是一个标准库函数,它的函数原型在头文件&stdio.h&中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。printf函数调用的一般形式为:
& & printf(&格式控制字符串&, 输出表列)
其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:
&%d&表示按十进制整型输出;
&%ld&表示按十进制长整型输出;
&%c&表示按字符型输出等。
非格式字符串原样输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
【例4-3】printf函数举例
#include &stdio.h&
int main(void){
int a=88,b=89;
printf(&%d %d\n&,a,b);
printf(&%d,%d\n&,a,b);
printf(&%c,%c\n&,a,b);
printf(&a=%d,b=%d&,a,b);
本例中四次输出了a、b的值,但由于格式控制串不同,输出的结果也不相同。第3行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a、b值之间有一个空格。第4行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a、b值之间加了一个逗号。第5行的格式串要求按字符型输出a、b值。第6行中为了提示输出结果又增加了非格式字符串。
格式字符串
在Turbo C中格式字符串的一般形式为:
& & [标志][输出最小宽度][.精度][长度]类型。
其中方括号[]中的项为可选项。
各项的意义介绍如下。
类型字符用以表示输出数据的类型,其格式符和意义如下表所示:
以十进制形式输出带符号整数(正数不输出符号)
以八进制形式输出无符号整数(不输出前缀0)
以十六进制形式输出无符号整数(不输出前缀Ox)
以十进制形式输出无符号整数
以小数形式输出单、双精度实数
以指数形式输出单、双精度实数
以%f或%e中较短的输出宽度输出单、双精度实数
输出单个字符
输出字符串
标志字符为 -、+、# 和空格四种,其意义下表所示:
结果左对齐,右边填空格
输出符号(正号或负号)
输出值为正时冠以空格,为负时冠以负号
对c、s、d、u类无影响;
对o类,在输出时加前缀o;
对x类,在输出时加前缀0x;
对e、g、f 类当结果有小数时才给出小数点。
3) 输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
精度格式符以&.&开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。
#include &stdio.h&
int main(void){
&& int a=15;
&& long float b=123.1234567;
&&& // 原来b的定义为 float b=123.1234567;
&&& // 经读者反馈,笔者发现会溢出,在前面加了long
&& double c=4567;
&& char d=&#39;p&#39;;
&& printf(&a=%d\n&, a);
&& printf(&a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n&,a,a,a,a);& // %% 可以输出 %
&& printf(&a=%f\n&, b);
&& printf(&b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n&,b,b,b,b);
&& printf(&c=%f\n&, c);
&& printf(&c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n&,c,c,c);
&& printf(&d=%c\n&, d);
&& printf(&d(%%c)=%c, d(%%8c)=%8c\n&,d,d);
&& return 0;
运行结果:
第11行以四种格式输出整型变量a的值,其中&%5d &要求输出宽度为5,而a值为15只有两位故补三个空格。
第14行以四种格式输出实型量b的值。其中&%f&和&%lf &格式的输出相同,说明&l&符对&f&类型无影响。&%5.4lf&指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。
第17行输出双精度实数,&%8.4lf &由于指定精度为4位故截去了超过4位的部分。
第20行输出字符量d,其中&%8c &指定输出宽度为8故在输出字符p之前补加7个空格。
使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请看下面两个例子。
【例4-5】在一个printf()里输出
#include &stdio.h&
int main(void){
printf(&The raw value: i=%d\n&, i);
printf(&++i=%d \n++i=%d \n--i=%d \n--i=%d\n&,++i,++i,--i,--i);
运行结果:
The raw value: i=8
【例4-6】在多个printf()里输出
#include &stdio.h&
int main(void){
printf(&The raw value: i=%d\n&, i);
printf(&++i=%d\n&, ++i);
printf(&++i=%d\n&, ++i);
printf(&--i=%d\n&, --i);
printf(&--i=%d\n&, --i);
运行结果:
The raw value: i=8
这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。
但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。
注意:经读者反馈,我们发现原来的例子在VC6.0下计算过程比较复杂,不能直观的说明自右向左的求值顺序。上面的代码是修改后的,修改日期为 。
下面是老代码及分析:
&&& int i=8;
&&& printf(&%d\n%d\n%d\n%d\n%d\n%d\n&,++i,--i,i++,i--,-i++,-i--);
&&& int i=8;
&&& printf(&%d\n&,++i);
&&& printf(&%d\n&,--i);
&&& printf(&%d\n&,i++);
&&& printf(&%d\n&,i--);
&&& printf(&%d\n&,-i++);
&&& printf(&%d\n&,-i--);
这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项&-i--&求值,结果为-8,然后i自减1后为7。 再对&-i++&项求值得-7,然后i自增1后为8。再对&i--&项求值得8,然后i再自减1后为7。再求&i++&项得7,然后i再自增1后为8。 再求&--i&项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项&++i&,此时i自增1后输出8。
微信公众号:
各位粉丝,大家好,我是C语言中文网的站长(可以了解我),C语言中文网已经开通了微信公众号,名字是「码农宿舍」(不是C语言中文网哦),我将在这里和大家交流编程知识以及工作经验。大家可以搜索名字「码农宿舍」关注,也可以用微信扫描右边的二维码关注。
当你决定关注「码农宿舍」,你已然超越了99%的程序员!
推荐文章 TOP10C语言模拟试题题库
本试题来自:(2009年C语言模拟试题,)二、填空题设有下列程序:
#include<stdio.h>
#include<string.h>
char s[10],t[10];
for(i=0;i<2;i++)
if(strcmp(t,s)<0)strcpy(t,s);
print f("%s\n",t);
程序运行后,从键盘上输入(<CR>代表回车符): DEF<CR>BADEF<CR>QTHRG<CR>,则程序的输出结果是______。正确答案:QTHRG答案解析:有,
您可能感兴趣的试题
填空题:(/shiti/5516224/)请补充函数fun(),该函数的功能是按条件删除一个字符串指定字符一半的数目,具体要求如下:如果该字符串所包含的指定字符的个数是奇数,则不予删除,如果其数目是偶数,则删除原串后半部分的指定字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,c中存放指定的字符。
例如:当a输入“abababa”,c=‘a’时,b的输出为“ababb”;
如果a的输入为“ababa”,则b的输出为“ababa”。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。
试题程序:
#include<stdio.h>
#include<conio.h>
#define LEN 80
void fun(char a[],char b[],char C)
int i=0,j=0;
while(a[i]!=‘\0’)
if(a[i]==c)
while(a[j]!=’\0’)
b[j]=a[j];
b[j]=’\0’;
while(a[i]!=’\0’)
b[j++]=a[i];
if(a[i]==c)
if((m>n/2)&&(a[i]==c))
char a[LEN],b[LEN];
clrscr();
printf("Enter the string:\n");
printf("Enter the character of the string deleted:");
scanf("%c",&c);
fun(a,b,c);
printf("The new string is:%s\n",b);
}答案:有,答案解析:有,填空题:()下列给定程序中,函数fun()的功能是:将m(1≤m≤10)个字符串反着连接起来,组成一个新串,放入pt所指字符串中,例如:把3个串DEG,ac,df反着串联起来,结果是dfacDEG。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或者删行,也不得改变程序的结构!
试题程序:
#include <conio.h>
#include <string.h>
#include <stdio.h>
void fun(char str[][10],int m,char *pt)
int k,q,i,j=0;
/*************found*************/
for(k=m;k>0;k--)
q=strlen(str[k]);
for(i=0;i<q;i++)
pt[i]=str[k][i];
/*************found**************/
{ int m,h;
char s[10][10],p[120];
clrscr();
printf("\nPlease enter m:");
scanf("%d",& m);
printf("\nPlease enter%d string:\n",m);
gets(s[0]);
for(h=0;h<m;h++)
gets(s[h]);
fun(s,m,p);
printf("/nThe result is:%s\n",p);
}答案:有,答案解析:有,
C语言模拟试题最新试卷
C语言模拟试题热门试卷二十二、两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
#include&stdio.h&
int main()
char i,j,k;
//设a\b\c对手
for(i='X';i&='Z';i++)
for(j='X';j&='Z';j++)
for(k='X';k&='Z';k++)
if(i!=j&&j!=k&&k!=i)
if(i!='Z'&&k!='X'&&k!='Z')
printf("a-------&%c\nb-------&%c\nc-------&%c\n",i,j,k);
二十四、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
程序分析:第一项为2/1,第二项为3/2;之后设每项为a(n)/b(n)=(a(n-2)+a(n-1))/(b(n-2)+b(n-1)),典型的可用递归方法求得每一项的分母和分子;分别用两个函数求得分母和分子。
#include&stdio.h&
int fenmu(int a)
return fenmu(a-2)+fenmu(a-1);
int fenzi(int a)
return fenzi(a-2)+fenzi(a-1);
int main()
float tsum=0.0,f1,f2;
for(i=0;i&20;i++)
f1=fenzi(i);
f2=fenmu(i);
tsum+=f1/f2;
printf("前20项总和为%f.\n",tsum);
二十五、求1+2!+3!+...+20!的和。
#include&stdio.h&
int f(int n)
return n*f(n-1);
int main()
long sum=0;
for(i=1;i&21;i++)
sum+=f(i);
printf("结果为%ld.\n",sum);
二十七、利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
#include&stdio.h&
#include&string.h&
void printchar(char *pc,int n)
printf("%c",*pc);
printchar(px,n-1);
int main()
char c[1000];
printf("输入一串字符:\n");
scanf("%s",c);
length=strlen(c);
printchar(&c[length-1],length);
二十八、有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
#include&stdio.h&
int age(int n)
return 10;
return age(n-1)+2;
int main()
printf("第五个人年纪是%d岁。\n",age(5));
二十九、给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
#include&stdio.h&
//求位数函数,递归方法,当然也可以用while语句int fnum1(long m){
if(m/10==0)
return fnum1(m/10)+1;}
//正序输出每一个数字,以逗号分隔;void fnum2(long m){
int num=1;
int n=fnum1(m);
for(i=0;i&n-1;i++)
num=num*10;
for(i=0;i&n;i++)
printf("%d,",m/num);
num=num/10;
void fnum2_digui(long m){
if(fnum1(m)==1)
printf("%ld",m);
fnum2_digui(m/10);
printf("%ld",m%10);
//逆序输出每一个数字void fnum3(long m){
printf("%ld,",m%10);
}while(m!=0);}
int main(){
printf("请输入一个不超过五位数的整数。\n");
scanf("%ld",&x);
printf("你输入的是一个%d位数。\n",fnum1(x));
printf("正序输出为:\n");
printf("\n逆序输出为:\n");
return 0;}
三十七、对10个数进行排序。
#include&stdio.h&
void paixu(unsigned int a[],int n)
int i,j,t;
for(i=0;i&n;i++)
for(j=0;j&(n-i-1);j++)
if(a[j]&a[j+1])
a[j]=a[j+1];
for(i=0;i&n;i++)
printf("%d\t",a[i]);
int main()
unsigned int a[10];
void paixu(unsigned int a[],int n);
printf("请输入十个正整数:\n");
for(i=0;i&10;i++)
scanf("%d",&a[i]);
paixu(a,10);
三十八、求一个3*3矩阵对角线元素之和。
#include&stdio.h&
int qiuhe(int (*a)[3],int n)
//参数1为一个指向含有m个整型元素的一维数组指针,m为列,n为行
int i,sum=0;
for(i=0;i&n;i++)
sum+=a[i][i];
int main()
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
printf("对角线数字之和为%d.\n",qiuhe(a,3));
四十、将一个数组逆序输出。
#include&stdio.h&
void print_array(int a[],int n)
for(i=0;i&n;i++)
printf("%d
printf("\n");
int main()
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[10],i,*p;
void print_array(int a[],int n);
for(i=0;i&10;i++)
b[i]=a[9-i];
print_array(a,10);
print_array(b,10);
print_array(p,10);
阅读(...) 评论()读书笔记之:程序员面试宝典-1 - Fangzhen - 博客园
随笔 - 367, 文章 - 174, 评论 - 83, 引用 - 0
第2部分 C/C++程序设计1. 二进制位变换对于整型x:x&(x-1)的结果是x最右边的1被置为0这儿有详细介绍:
2. 类型转换这儿提到的类型转换主要是指,浮点型和整型之间的转换。例如:float x=2.5f;则printf("%#x\n",*(int*)&x);//0xprintf("%#x\n",(int&)x);//0x(这个需要在C++下编译)(int&)x效果等价于*(int*)&x,这是C++中可以编译通过(VC,g++都可以),在C中是不可以的。下面一段程序:
#include&&stdio.h&int&main(){unsigned&int&a=0x;unsigned&char&i=(unsigned&char)a;char&*b=(char*)&a;char&c=*(char*)&a;printf("%#08x,%#08x,%#08x",i,*b,c);return&0;}
若a=0x;输出为:0xxx000077若a=0x7ffffff7;输出为:0xxfffffff7,0xfffffff7若a=0x7fffff77;输出为:0xxx000077若a=0xffffff77;输出为:0xxx000077若a=0xfffffff7输出为:0xxfffffff7,0xfffffff7
所以可以得出结论:i和*b和c其实都是一个字节,只是如果值为负的时候要在前面补13.运算符符问题看下面代码的输出:
#include&&cstdio&using&namespace&int&main(){unsigned&char&a=0xA5;unsigned&char&b=~a&&4+1;printf("b=%d\n",b);return&0;}
这儿需要注意的是~的优先级高于+,+的优先级高于&&,所以先取反,然后求和最后移位。正常情况下,对取反得,然后右移5位得到,为2,但是运行后结果是0xfa(250)解释如下:
4. x&(x-1)又一个应用实例
在分析该表达式的实现思路之前,首先说明该表达式的作用就是求两数的平均值。也就是说,像上面当 x为 729,y为271时函数的返回值是500 。下面说明该表达式的思路。我们先了解下面几种情况:1. 当两个数所有为 1 和为 0 的位都相同时,这两个数的平均值就是 (x & y) 。比如当 x 和 y 都等于 1100 时,x & y 的值也是 1100 ,我们也可以说此时求 x 和 y 的平均数可以用 (x & y) 来求得。2. 当两个数中的所有对应位有且只有一个为 1 时,那么这两个数的平均值由 (x^y)&&1 表达式求得。比如当 x 为 101100 (十进制 44),y 为 010010 (十进制 18) 时,x ^ y 的值为 111110 ,然后再将 111110 向右移动 1 位后得 11111 (十进制为 31),也就是 (44 + 18)/2 = 31 。由上面的 情况1 和 情况2 我们知道,将它们两者结合起来便可求得随意两个整数的平均值。下面以 x 等于 12, y 等于 24 为例说明:x 的二进制数位 1100 ,y 的二进制数为 11000 。我们先将 x 和 y 做相与运算:&&& 01100&&& 11000&&&&&&& &&&& --------------&&& 01000实际上,像上面的运算,我们也可以直接看成是 情况1 中的运算,即相当于执行:01000 & 01000 ,最后值仍然是 01000 。好,经过上面的与运算后,看起来是将 01100 和 11000 分别去掉了 01000 这部分,所以剩下来的就是 00100 和 10000 。当我们执行 x^y 时:&&& 01100&&& 11000& ^&&& -----------&&& 10100由上可见,异或的运算正好也是去掉了 01000 ,然后将剩下来的 00100 和 10000 这两部分进行相加,所以求这两部分的平均数只要向右移动 1 位即可。综 上可得,我们求平均数的过程是先用与运算对数值做部分的提取,然后用异或并右移运算获得余下部分的平均值,因此这两部分的平均值相加后就得出了原来两数的 平均值。实际上,这是一个加法分解然后综合的过程。如上面的 12 和 24,先做与运算,也就相当于从 12 和 24 里分别先减去 4,剩下 8 和 16,再将这两数相加得 24 (异或运算),然后再除以2(右移),结果为 12 。最后 12 + 4 等于 16 即得最后所要的结果。尽管上面的过程看来上去实际用处不是很大,但如果是用在没有乘除法指令的简单单片机系统,移位和逻辑运算操作就显得很重要了。5.& 比较两个数不使用判断语句得到两个数中较大的一个:方案一:int max=(a+b+abs(a-b))/2;方案二:int flag=(((a - b) && (8 * sizeof(int)& - 1))) & 0x01; //获得两者差的符号位int buf[2]={a,b};int max=buf[flag];//如果flag=0,说明a&b,否则a&b或者:int max=(flag * b) + ((1 - flag) * a); &参考:测试代码如下:
int&test1(){int&x,y;int&z;int&i;double&m;srand((int)time(NULL));for(i=0;i&10;i++){x=rand()%100;y=rand()%100;m=(x+y)/2.0;z=(x&y)+((x^y)&&1);printf("%4d%4d%5.1f%4d%4d%4d\n",x,y,m,x&y,x^y,z);}}int&test2(){int&i;srand((int)time(NULL));for(i=0;i&10;i++){int&x=rand()%100;int&y=rand()%100;int&buf[2]={x,y};unsigned&int&z;z=x-y;z&&=31;printf("%3d%3d%3d\n",x,y,buf[z]);}return&0;}
输出如下(左边是test1函数,右边是test2函数):
&&&&&&&&&&&&&&&
6. 删除C/C++程序中的注释
7. const用法,在C与C++中的不同
在const成员函数中,使用mutable修饰成员变量后,就可以修改类成员变量了。8. 内存对齐不同编译器的内存对齐情况
下面的代码:
int&main(){&&&&int&a;&&&&char&b;&&&&int&c;&&&&char&*p=(char*)&a;&&&&printf("%#08x\n",&a);&&&&printf("%#08x\n",&b);&&&&printf("%#08x\n",&c);&&&&printf("%#08x\n",p);&&&&printf("%#08x\n",p+1);&&&&printf("%#08x\n",p+2);&&&&printf("%#08x\n",p+3);&&&&&&&&&&&&&return&0;}
gcc编译运行如下:
最右边的图表示的是内存中的排列方式
这儿要注意内存的增长方向:高-&低数组在内存中的存储:
下面是一段测试代码:
int&test3(){int&i=-1,a[]={1,2,3,4,5};char&*p=NULL;printf("%#08x\n",&i);printf("%#08x\n",a);printf("%#08x\n",&p);for(i=0;i&5;i++){printf("%d:&",i);p=(char*)&a[i];printf("%#08x&",p);printf("%#08x&",p+1);printf("%#08x&",p+2);printf("%#08x\n",p+3);}}
这儿有一个关于数组内存布局的讨论:
9. C++中类也遵循内存对齐注意:类中的方法不占用空间。类中的静态变量是分配在全局数据区的,而sizeof计算的是栈中分配的大小。参 数为结构或类。Sizeof应用在类和结构的处理情况是相同的。但有两点需要注意,第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态 变量的存储位置与结构或者类的实例地址无关。第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。10. sizeof空类,多重继承一个空类所占的空间为1,多重继承的空类所占空间还是1,但是虚继承设计虚表(虚指针),所以至少有一个指针的大小11. 指针减法运算
#include&&stdio.h&#include&&stdlib.h&int&main(int&argc,&char&*argv[]){&&&&int&arr[5]&=&{1,2,3,4,5};&&&&int&*ptr&=&&&&&printf("%d\n",ptr[4]-ptr[0]);&&return&0;}
运行输出:4更换为字符数组,测试结果一样。《C 和指针》P110 分析如下:两个指针相减的结果的类型为ptrdiff_t,它是一种有符号整数类型。减法运算的值为两个指针在内存中的距离(以数组元素的长度为单位,而 非字节),因为减法运算的结果将除以数组元素类型的长度。所以该结果与数组中存储的元素的类型无关。
size_t是unsigned类型,用于指明数组长度或下标,它必须是一个正数,std::size_tptrdiff_t是signed类型,用于存放同一数组中两个指针之间的差距,它可以使负数,std::ptrdiff_t.size_type是unsigned类型,表示容器中元素长度或者下标,vector&int&::size_type i = 0;difference_type是signed类型,表示迭代器差距,vector&int&:: difference_type = iter1-iter2.前二者位于标准类库std内,后二者专为STL对象所拥有。
12. 获取成员变量偏移量的两种方式&&&& 第一种方式是MFC里使用广泛的宏:#define OFFSET(structure, member) ((int)&((structure*)0)-&member); 正如我们平时通过某对象的地址指针访问某个成员变量一样,这里只是强制使用0作为该地址,但区别是并没有通过该地址去访问成员变量,而只是用&操 作符来获取该成员变量的地址,所以不会出现访问违规的情况。所以,完全可以用此类声明一个对象,然后用该对象某成员变量地址减去该对象首地址获取偏移量, 只是纯虚类无法这样实现。&&&&& 另一种方式是通过域操作符取成员变量的地址。例如一个类Test有int 型成员变量x,则可以通过int Test::* pOffset = &Test::x 获得该偏移量,然后通过int nOffset = reinterpret_cast&int&(*(void**)(&pOffset))将其转化为整型量。&另外,以上这两种方式都对静态成员无效。下面给出了获取成员变量地址的方式:
class&A{&&&&public:&&&&&&&&A():m_a(1),m_b(2){&&&&&&&&&&&&cout&&"A()"&&&&&&&&&&}&&&&&&&&~A(){&&&&&&&&&&&&cout&&"~A()"&&&&&&&&&&}&&&&&&&&&&&void&fun(){&&&&&&&&&&&&cout&&"A:fun&"&&m_a&&"&"&&m_b&&"&"&&&&&&&&&&}&&&&&&&public:&&&&&&&&int&m_a;&&&&&&&&int&m_b;&&&&&&&&static&int&s_a;};&&&&&&int&A::s_a=3;class&B{&&&&public:&&&&&&&&B():m_c(3){&&&&&&&&&&&&cout&&"B()"&&&&&&&&&&}&&&&&&&&~B(){&&&&&&&&&&&&cout&&"~B()"&&&&&&&&&&}&&&&&&&&&&&void&fun(){&&&&&&&&&&&&cout&&"B:fun&"&&m_c&&&&&&&&&&}&&&&&&&public:&&&&&&&&int&m_c;};&&&&&&void&test1(){&&&&A&a;&&&&B&*p=(B*)(&a);&&&&cout&&"&a:"&&&a&&&&&&cout&&"&(a.m_a):"&&&(a.m_a)&&&&&&cout&&"&(a::s_a)"&&&a.s_a&&&&&&cout&&"&(A::s_a)"&&&A::s_a&&&&&&int&A::*&q=&A::m_a;&&&&cout&&"&A::m_a:"&&reinterpret_cast&int&(*(void**)(&q))&&&&&&q=&A::m_b;&&&&cout&&"&A::m_b:"&&reinterpret_cast&int&(*(void**)(&q))&&&&&&int&B::*&t=&B::m_c;&&&&cout&&"&B::m_c:"&&reinterpret_cast&int&(*(void**)(&t))&&&&&&p-&fun();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&
输出如下:
13. 指针与句柄
第8章 递归问题14. 输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序,即输出125,146,145,146.
递归代码如下:
#include&&iostream&#include&&cstdio&#include&&cstring&using&namespace&void&PrintArray(char&*p_str,char*s_str,int&*print_arr,int&p_len,int&s_len,int&print_arr_num,int&p_start_num,int&s_start_num){int&pStartnum=p_start_num,sStartnum=s_start_int&printNum=print_arr_if(printNum==s_len){for(int&i=0;i&s_i++)cout&&*(print_arr+i)&&'&';cout&&return;}for(int&i=pSi&p_i++){for(int&j=sSj&s_j++){if(*(p_str+i)==*(s_str+j))&{print_arr[printNum]=i+1;pStartnum=i;sStartnum=j;PrintArray(p_str,s_str,print_arr,p_len,s_len,printNum+1,pStartnum+1,sStartnum+1);}}}}void&ConnectSequence(char*&p_str,char&*s_str){if(NULL==p_str&&NULL==s_str){cout&&"string&error"&&return&;}int&p_len=strlen(p_str);int&s_len=strlen(s_str);int&*print_arr=new&int[s_len];unsigned&int&print_arr_num=0;if(NULL==print_arr){cout&&"allocate&error"&&return&;}PrintArray(p_str,s_str,print_arr,p_len,s_len,0,0,0);}int&main(){char&parStr[]="abdbcca";char&sonStr[]="abc";ConnectSequence(parStr,sonStr);return&0;}&
非递归代码如下:15. 给出如下递归表达式的非递归计算方法:
递归和非递归的代码如下:
#include&&iostream&#include&&cstdlib&using&namespace&long&long&f(int&m,int&n){&&&&if(1==m)&&&&&&&&return&n;&&&&else&if(1==n)&&&&&&&&return&m;&&&&else&&&&&&&&&return&f(m-1,n)+f(m,n-1);}long&long&f2(int&m,int&n){&&&&const&int&M=m;&&&&const&int&N=n;&&&&long&long&a[M][N];&&&&for(int&i=0;i&M;i++)&&&&&&&&a[i][0]=i+1;&&&&for(int&j=1;j&N;j++)&&&&&&&&a[0][j]=j+1;&&&&for(int&i=1;i&M;i++)&&&&&&&&for(int&j=1;j&N;j++)&&&&&&&&&&&&a[i][j]=a[i-1][j]+a[i][j-1];&&&&return&a[M-1][N-1];}int&main(){&&&&for(int&i=0;i&10;i++){&&&&&&&&int&m=rand()%8;&&&&&&&&int&n=rand()%8;&&&&&&&&long&long&y=f(m,n);&&&&&&&&long&long&y2=f2(m,n);&&&&&&&&cout&&'&'&&m&&','&&n&&"&&"&&y&&'&'&&y2&&&&&&}}
16. zig-zag扫描问题
&实现代码如下:
#include&&iostream&#include&&iomanip&using&namespace&void&zigzag(int&n){&&&&const&int&N=n;&&&&int&a[N][N];&&&&int&squa=N*N;&&&&int&b[N*N][2];&&&&for(int&i=0;i&N;i++)&&&&&&&&for(int&j=0;j&N;j++){&&&&&&&&&&&&int&s=i+j;&&&&&&&&&&&&if(s&N)&{&&&&&&&&&&&&&&&&a[i][j]=s*(s+1)/2+((i+j)%2==0?j:i);&&&&&&&&&&&&}&&&&&&&&&&&&else{&&&&&&&&&&&&&&&&s=(N-1-i)+(N-1-j);&&&&&&&&&&&&&&&&a[i][j]=squa-s*(s+1)/2-(N-((i+j)%2==0?j:i));&&&&&&&&&&&&}&&&&&&&&&&&&b[a[i][j]][0]=i;&&&&&&&&&&&&b[a[i][j]][1]=j;&&&&&&&&}&&&&for(int&i=0;i&N;i++){&&&&&&&&for(int&j=0;j&N;j++)&&&&&&&&&&&&cout&&setw(2)&&a[i][j]&&"&";&&&&&&&&cout&&&&&&}&&&&for(int&i=0;i&N*N;i++)&{&&&&&&&&for(int&j=0;j&2;j++)&&&&&&&&&&&&cout&&setw(2)&&b[i][j]&&'&';&&&&&&&&cout&&&&&&}}int&main(){&&&&int&n=4;&&&&zigzag(n);}
&17. 两个数组匹配的问题:
A,B两个数组是等长度,但顺序不同,对两个数组中的数进行匹配。
常规解法的代码如下:
#include&&iostream&using&namespace&void&match(int&a[],int&b[],int&k){for(int&i=0;i&k;i++){for(int&j=0;j&k;j++){if(a[i]==b[j]){cout&&"a["&&i&&"]&match&b["&&j&&"]"&&break;}}}}int&main(){int&a[10]={1,2,3,4,5,6,7,8,9,10};int&b[10]={10,6,4,5,1,8,7,9,3,2};int&k=sizeof(a)/sizeof(int);match(a,b,k);return&0;}&
输出如下:
一种更好的方法:
18. 螺旋队列问题
具体程序如下:
#include&&iostream&#include&&iomanip&#define&max(a,b)&((a)&(b)?(a):(b))#define&abs(a)&((a)&0?(a):-(a))using&namespace&int&spiral(int&x,int&y){int&t=max(abs(x),abs(y));int&u=t+t;int&v=u-1;v=v*v+u;if(x==-t)v+=u+t-y;else&if(y==-t)v+=3*u+x-t;else&if(y==t)v+=t-x;elsev+=y-t;return&v;}int&main(){for(int&i=-4;i&=4;i++){for(int&j=-4;j&=4;j++)cout&&setw(3)&&spiral(j,i)&&'&';cout&&}&}&
程序输出如下:
代码如下:
#include&&iostream&#include&&iomanip&#define&max(a,b)&((a)&(b)?(a):(b))#define&abs(a)&((a)&0?(a):-(a))using&namespace&int&spiral(int&x,int&y){int&t=max(abs(x),abs(y));int&u=t+t;int&v=u-1;v=v*v+u;if(x==-t)v+=u+t-y;else&if(y==-t)v+=3*u+x-t;else&if(y==t)v+=t-x;elsev+=y-t;return&v;}void&test1(){for(int&i=-4;i&=4;i++){for(int&j=-4;j&=4;j++)cout&&setw(3)&&spiral(j,i)&&'&';cout&&}&}int&a[10][10];void&spiral2(int&n){int&m=1;for(int&i=0;i&n/2;i++){for(int&j=0;j&n-i;j++){if(a[i][j]==0)a[i][j]=m++;}for(int&j=i+1;j&n-i;j++){if(a[j][n-1-i]==0)a[j][n-1-i]=m++;}for(int&j=n-i-1;j&i;j--){if(a[n-i-1][j]==0)a[n-1-i][j]=m++;}for(int&j=n-i-1;j&i;j--)&{if(a[j][i]==0)a[j][i]=m++;}}if(n%2)a[n/2][n/2]=m;}int&test2(){const&int&n=10;for(int&i=0;i&n;i++)for(int&j=0;j&n;j++)a[i][j]=0;spiral2(n);for(int&i=0;i&n;i++){for(int&j=0;j&n;j++)cout&&setw(3)&&a[i][j]&&'&';cout&&}}int&main(){test2();}&
19. 概率问题
测试代码如下:
#include&&iostream&#include&&cstdlib&using&namespace&int&main(){const&int&Loop=1000;const&int&R=100;for(int&i=0;i&=500;i++){int&rgn=0;for(int&j=0;j&Lj++){int&x=rand()%R;int&y=rand()%R;if(x*x+y*y&R*R)rgn++;}cout&&rgn&&'&';if((i+1)%20==0)cout&&}}&
输出如下:
20. 虚函数,覆盖问题
这儿牵扯到一个虚函数的使用问题,这儿没有使用基类的指针或基类引用,但是却利用虚函数实现了多态机制。
代码如下:
#include&&iostream&using&namespace&class&A{&&&&protected:&&&&&&&&int&m_&&&&public:&&&&&&&&A(int&data=0):m_data(data){}&&&&&&&&int&GetData(){&&&&&&&&&&&&cout&&"A-1&";&&&&&&&&&&&&return&doGetData();&&&&&&&&}&&&&&&&&int&virtual&doGetData(){//&&&&&&&&int&doGetData(){&&&&&&&&&&&&cout&&"A-2&";&&&&&&&&&&&&return&m_&&&&&&&&}};class&B:public&A{&&&&protected:&&&&&&&&int&m_&&&&public:&&&&&&&&B(int&data=1):m_data(data){}&&&&&&&&int&doGetData(){&&&&&&&&&&&&cout&&"B-2&";&&&&&&&&&&&&return&m_&&&&&&&&}};class&C:public&B{&&&&protected:&&&&&&&&int&m_&&&&public:&&&&&&&&C(int&data=2){&&&&&&&&&&&&m_data=&&&&&&&&}};int&main1(){&&&&C&c(10);&&&&cout&&c.GetData()&&&&&&cout&&c.A::GetData()&&&&&&cout&&c.B::GetData()&&&&&&cout&&c.C::GetData()&&&&&&cout&&c.doGetData()&&&&&&cout&&c.A::doGetData()&&&&&&cout&&c.B::doGetData()&&&&&&cout&&c.C::doGetData()&&&&&&return&0;}class&AA{&&&&public:&&&&&&&&virtual&void&f(){&&&&&&&&&&&&cout&&"AA&"&&&&&&&&&&}};class&BB:public&AA{&&&&public:&&&&&&&&void&f(){&&&&&&&&&&&&cout&&"BB&"&&&&&&&&&&}};int&main(){&&&&AA*&pa=new&AA();&&&&pa-&f();&&&&BB*&pb=(BB*)&&&&pb-&f();&&&&delete&pa,&&&&pa=new&BB();&&&&pa-&f();&&&&pb=(BB*)&&&&pb-&f();&&&&return&0;}&
该代码的输出如下:AA AA BB BB
21. 虚函数继承与虚继承
22. 多重继承 的优点与缺陷
23. C++所引入的额外开销

我要回帖

更多关于 stdio.h在哪里 的文章

 

随机推荐