导航:首页 > 编程语言 > c语言编程例子大全

c语言编程例子大全

发布时间:2024-06-10 01:19:15

Ⅰ 经典C语言程序例子

题目01:在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同的单词。

(1)c语言编程例子大全扩展阅读:

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

Ⅱ C语言简单例子

C语言中,一般会用到函数。系统默认从主函数开始运行,即main()函数。一般结构为:
void main(void)
{
....
}
一般函数是带有参数的,即后面括号中需要一个或n个变量。中间用逗号隔开。例如
void add(int a, int b)
{
...
}
其中a,b为整形的参数,在大部分系统中int 代表16位的数。
有的函数还有返回值:像上面的一个加法函数,可以写成:
int add(int a,int b)
{
return (a+b); //retuen为返回值
}
当我们要调用该函数时,只需要这要写:
void main(void)
{
int sum = 0;
sum = add(x1,x2); //x1,x2为两个常数
}

Ⅲ 急求c语言编程题目

早上看到问题需求,中午用休息时间刚好大半代码,发现问题居然已经采纳了。。。

代码完成了。测试过了。直接运行。

滚轮实现动态,三角型指针沿着滚盘数字转动,随机停在一个数字上,如果和之前下注的数值一致就是猜中,反之没猜中

你提出的所有功能都实现了,太多了,我截图列举几个说明一下,其它你自己看吧。

是可以猜中!!可以猜中!!,我第一次2轮就中,忘记截图了。1/36的概率能猜中,有耐心慢慢试,记得充值!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>
#include<time.h>
#definemaxMShow10//最大下注金额显示字符数,修改该值需要同步修改showDisc函数的格式参数!
typedefstructuser
{
charuName[21];
charpsw[21];
intmoney;//余额
intpay;//历史消费
intwin;//历史赢钱
inttype;//用户类型->0:管理员;1:普通玩家
structuser*next;
}USER;
typedefstructdisc//圆盘数字
{
charflag;//数字前标识
intnum;//圆盘数字
intmoney;//对应下注金额
charmStr[maxMShow+1];//下注金额字符串形式,为了排面整齐,最多显示10个字节
structdisc*next;
}DISC;

voidmeError(void*p);//内存申请失败
DISC*init();//初始化圆盘,生成链表头指针
voidshowDisc(DISC*discHead,USER*logUser);//显示圆盘
DISC*bets(DISC*discHead,USER*user);//下注,成功返回下注节点,失败返回NULL。参数:user:下注人ID;
intregUser(USER**userHead,USER**userTail,char*uName,char*psw,intmoney,inttype);//注册用户,成功返回1,失败返回0。参数:uName:用户名。psw:密码。money:开户金额。type:用户类型0管理员1普通用户
USER*login(USER*userHead,char*uName,char*psw);//登录。登录成功返回用户节点,失败返回NULL
intrecharge(USER*logUser);//充值,成功返回1,失败返回0
voidshowMenu1(DISC*discHead,USER**userHead,USER**userTail);//显示一级菜单
voidshowMenu2(DISC*discHead,USER*logUser,USER*userHead);//显示二级菜单
voidshowMenu3(DISC*discHead,USER*logUser,USER*userHead);//显示三级菜单
introll(DISC*discHead,USER*logUser);//滚动转盘,猜中增加奖金,猜中返回1,没猜中返回0。参数:num=猜的数字,money=下的注
voidreDisc(DISC*discHead);//重置转盘,每次滚动后调用
voidshowUser(USER*userHead,char*uName);//查看指定玩家账户,参数uName传NULL,查看所有玩家账户
voidshowProfit(USER*userHead);//统计赌场盈利状况;
intmain()
{
DISC*discHead=NULL;
USER*userHead=NULL,*userTail=NULL;
srand(time(NULL));
discHead=init();
showMenu1(discHead,&userHead,&userTail);
return0;
}
voidshowMenu1(DISC*discHead,USER**userHead,USER**userTail)//显示一级菜单
{
USER*logUser=NULL;
charuName[21]={0},psw[21]={0};
intn,money=0,type;
while(1)
{
n=0;
memset(uName,0,21);
memset(psw,0,21);
money=0;
type=-1;
system("cls");
printf("1、用户登录 2、用户注册 ");
scanf("%d",&n);
if(n==1)
{
system("cls");
printf("请输入ID名:"),scanf("%s",uName);
printf("请输入密码:"),scanf("%s",psw);
logUser=login(*userHead,uName,psw);
if(logUser)
showMenu2(discHead,logUser,*userHead);
}
if(n==2)
{
system("cls");
printf("请输入注册的ID名:"),scanf("%s",uName);
printf("请输入注册的密码:"),scanf("%s",psw);
printf("请输入开户的金额(必须大于0):");
while(!money)
scanf("%d",&money);
printf("请选择要注册的用户类型(0=管理员;1=普通用户):");
while(type!=0&&type!=1)
scanf("%d",&type);
regUser(userHead,userTail,uName,psw,money,type);
}
}

}
voidshowMenu2(DISC*discHead,USER*logUser,USER*userHead)//显示二级菜单
{
intn;
DISC*disc=NULL;
while(1)
{
n=0;
system("cls");
printf("欢迎登录:%s,余额:%d ",logUser->uName,logUser->money);
printf("1、开始转盘 2、账户充值 3、返回上级菜单 4、后台管理 ");
scanf("%d",&n);
if(n==1)
{
showDisc(discHead,logUser);
disc=bets(discHead,logUser);
if(disc)
showDisc(discHead,logUser);
printf("任意键开始滚动圆盘。。。 ");
getch();
roll(discHead,logUser);

}
if(n==2)
system("cls"),recharge(logUser);
if(n==3)
break;
if(n==4)
{
system("cls");
if(logUser->type!=0)
printf("对不起!您不是管理员,没有该权限! 按任意键继续。。。 "),getch(),getch();
else
showMenu3(discHead,logUser,userHead);//后台管理
}
}

}
voidshowMenu3(DISC*discHead,USER*logUser,USER*userHead)//显示三级菜单
{
intn;
charuName[21]={0};
while(1)
{
n=0;
system("cls");
printf("1、查看指定玩家 2、查看所有玩家 3、查看赌场盈利状况 4、返回上级菜单 ");
scanf("%d",&n);
if(n==1)
{
printf("请输入要查找的玩家ID:"),scanf("%s",uName);
showUser(userHead,uName);
}
if(n==2)
showUser(userHead,NULL);
if(n==3)
showProfit(userHead);
if(n==4)
break;
}
}
voidshowProfit(USER*userHead)//统计赌场盈利状况
{
intsumPay=0,sumWin=0;
system("cls");
while(userHead->next)
{
sumPay+=userHead->next->pay;
sumWin+=userHead->next->win;
userHead=userHead->next;
}
printf("玩家共下注%d元,获胜者得到%d元,赌场总获利%d元 按任意键继续。。。 ",sumPay,sumWin,sumPay-sumWin),getch();
}
voidshowUser(USER*userHead,char*uName)//查看指定玩家账户,参数uName传NULL,查看所有玩家账户
{
system("cls");
while(userHead->next)
{
if((uName&&strcmp(userHead->next->uName,uName)==0)||!uName)
{
printf("ID:%s,总下注金额%d,总获胜金额%d,当前余额%d ",userHead->next->uName,userHead->next->pay,userHead->next->win,userHead->next->money);
if(uName)
break;
}
userHead=userHead->next;
}
printf("按任意键继续。。。 "),getch();
}
USER*login(USER*userHead,char*uName,char*psw)//登录。登录成功返回用户节点,失败返回NULL
{
if(!userHead)
{
printf("错误!无可匹配数据,请先注册! 按任意键继续。。。 ");
getch();
returnNULL;
}
while(userHead->next)
{
if(!strcmp(userHead->next->uName,uName)&&!strcmp(userHead->next->psw,psw))
returnuserHead->next;
userHead=userHead->next;
}
printf("用户不存在或密码输入错误! 按任意键继续。。。 ");
getch();
returnNULL;
}
intrecharge(USER*logUser)//充值,成功返回1,失败返回0
{
intmoney=-1;
if(!logUser)
return0;
while(money<0)
printf("输入要充值的金额(输入0返回主菜单):"),scanf("%d",&money);
logUser->money+=money;
return1;
}
intregUser(USER**userHead,USER**userTail,char*uName,char*psw,intmoney,inttype)//注册用户,成功返回1,失败返回0。参数:uName:用户名。psw:密码。money:开户金额
{
USER*user=NULL,*userNew=NULL;
if(!*userHead)
*userHead=(USER*)malloc(sizeof(USER)),(*userHead)->next=NULL,meError(*userHead);
user=*userHead;
while(user->next)
{
if(strcmp(user->next->uName,uName)==0)
{
printf("用户名已存在!请重新输入。 按任意键继续。。。 ");
getch();
return0;
}
user=user->next;
}
userNew=(USER*)malloc(sizeof(USER));
meError(userHead);
userNew->money=money;
userNew->pay=0;
userNew->win=0;
userNew->uName[0]=0;
userNew->psw[0]=0;
userNew->type=type;
strcpy(userNew->uName,uName);
strcpy(userNew->psw,psw);
userNew->next=NULL;
if(!((*userHead)->next))
(*userHead)->next=userNew;
else
(*userTail)->next=userNew;
*userTail=userNew;
printf("%s:%s注册成功! 按任意键继续。。。 ",type?"普通用户":"管理员",uName);
getch();
return1;
}
DISC*init()
{
inti;
DISC*discHead=(DISC*)malloc(sizeof(DISC)),*discNew=NULL,*discTail=NULL;
meError(discHead);
discHead->next=NULL;
for(i=1;i<=36;i++)
{
discNew=(DISC*)malloc(sizeof(DISC));
meError(discNew);
discNew->flag='';
discNew->money=0;
discNew->num=i;
discNew->next=NULL;
if(!(discHead->next))
discHead->next=discNew;
else
discTail->next=discNew;
discTail=discNew;
}
returndiscHead;
}
voidreDisc(DISC*discHead)//重置转盘,每次滚动后调用
{
while(discHead->next)
{
discHead->next->flag='';
discHead->next->money=0;
memset(discHead->next->mStr,0,sizeof(discHead->next));
discHead=discHead->next;
}
}
introll(DISC*discHead,USER*logUser)//滚动转盘,猜中增加奖金,猜中返回1,没猜中返回0。参数:num=猜的数字,money=下的注
{
DISC*discHeadSave=discHead;
inti,rnum=0,win,flag;
while(1)
{
discHead->next->flag=16;
showDisc(discHeadSave,logUser);
rnum=rand()%36+1;
if(rnum==discHead->next->num)
break;
for(i=0;i<2000;i++);
discHead->next->flag='';
if(discHead->next->next)
discHead=discHead->next;
else
discHead=discHeadSave;
}
if(discHead->next->money>0)//如果随机滚到的数字有下注
{
win=discHead->next->money*5;
logUser->money+=win;
logUser->win+=win;
printf("恭喜猜中了,返还5倍!您获得了%d元。 ",win);

flag=1;
}
else
{
printf("对不起!本次没有猜中,再接再厉。 ");
flag=0;
}
reDisc(discHeadSave);
printf("按任意键继续。。。 ");
getch();
returnflag;
}
DISC*bets(DISC*discHead,USER*user)//下注
{
intmoney=0,num=-1;
DISC*disc=NULL;
while(num<1||num>36)
printf("请输入要下注的数字:"),scanf("%d",&num);
while(!money)
printf("请输入要下注的金额(不超过余额且大于0):"),scanf("%d",&money);
if(money>user->money)
{
printf("对不起,您的余额不足,请充值或重新下注! 按任意键继续。。。 ");
getch();
returnNULL;
}
user->money-=money;
user->pay+=money;
while(discHead->next)
{
if(discHead->next->num==num)
{
disc=discHead->next;
break;
}
discHead=discHead->next;
}
disc->money=money;
sprintf(disc->mStr,"%d",disc->money);
returndisc;
}
voidshowDisc(DISC*discHead,USER*logUser)
{
intclo=0;
system("cls");
printf("当前玩家:%s,余额:%d ",logUser->uName,logUser->money);
while(discHead->next)
{
printf("%c%2d%2s%-10s",discHead->next->flag,discHead->next->num,
discHead->next->money?"<-":"",discHead->next->money?discHead->next->mStr:"");//如要修改显示下注金额最大位数,这里%10d要改!!!
clo++;
if(clo==3)
clo=0,printf(" ");
discHead=discHead->next;
}
}
voidmeError(void*p)//内存申请失败
{
if(p==NULL)
{
printf("异常:内存申请失败!回车结束程序! ");
while(getch()!=' ');
exit(0);
}
}

Ⅳ 求 单片机简单的C语言程序例子(越多越好)

我前几天刚在网上看到的,不知道对你有没有用》

1. 闪烁灯
1. 实验任务
如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2. 电路原理图

图4.1.1
3. 系统板上硬件连线
把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4. 程序设计内容
(1). 延时程序的设计方法
作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒
机器周期 微秒
MOV R6,#20 2个机器周期 2
D1: MOV R7,#248 2个机器周期 2 2+2×248=498 20×
DJNZ R7,$ 2个机器周期 2×248 498
DJNZ R6,D1 2个机器周期 2×20=40 10002
因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET
(2). 输出控制
如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5. 程序框图
如图4.1.2所示

图4.1.2
6. 汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}

2. 模拟开关灯
1. 实验任务
如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
2. 电路原理图

图4.2.1
3. 系统板上硬件连线
(1). 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;
(2). 把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;
4. 程序设计内容
(1). 开关状态的检测过程
单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。
(2). 输出控制
如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5. 程序框图

图4.2.2
6. 汇编源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND
7. C语言源程序#include <AT89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //灯亮}else{L1=1; //灯灭}}}

3. 多路开关状态指示
1. 实验任务
如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
2. 电路原理图

图4.3.1
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;
(2. 把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1-K4端口上;
4. 程序设计内容
(1. 开关状态检测
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
(2. 输出控制
根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
5. 程序框图

读P1口数据到ACC中
ACC内容右移4次

ACC内容与F0H相或

ACC内容送入P1口
<![endif]-->
图4.3.2
6. 方法一(汇编源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP STARTEND7. 方法一(C语言源程序)#include <AT89X51.H>unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8. 方法二(汇编源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9. 方法二(C语言源程序)#include <AT89X51.H>void main(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}

先给你,传不上 太多了

Ⅳ C语言算法有哪些 并举例和分析

算法大全(C,C++)
一、 数论算法

1.求两数的最大公约数
function gcd(a,b:integer):integer;
begin
if b=0 then gcd:=a
else gcd:=gcd (b,a mod b);
end ;

2.求两数的最小公倍数
function lcm(a,b:integer):integer;
begin
if a<b then swap(a,b);
lcm:=a;
while lcm mod b>0 do inc(lcm,a);
end;

3.素数的求法
A.小范围内判断一个数是否为质数:
function prime (n: integer): Boolean;
var I: integer;
begin
for I:=2 to trunc(sqrt(n)) do
if n mod I=0 then begin
prime:=false; exit;
end;
prime:=true;
end;

B.判断longint范围内的数是否为素数(包含求50000以内的素数表):
procere getprime;
var
i,j:longint;
p:array[1..50000] of boolean;
begin
fillchar(p,sizeof(p),true);
p[1]:=false;
i:=2;
while i<50000 do begin
if p[i] then begin
j:=i*2;
while j<50000 do begin
p[j]:=false;
inc(j,i);
end;
end;
inc(i);
end;
l:=0;
for i:=1 to 50000 do
if p[i] then begin
inc(l);pr[l]:=i;
end;
end;{getprime}

function prime(x:longint):integer;
var i:integer;
begin
prime:=false;
for i:=1 to l do
if pr[i]>=x then break
else if x mod pr[i]=0 then exit;
prime:=true;
end;{prime}

二、图论算法

1.最小生成树

A.Prim算法:

procere prim(v0:integer);
var
lowcost,closest:array[1..maxn] of integer;
i,j,k,min:integer;
begin
for i:=1 to n do begin
lowcost[i]:=cost[v0,i];
closest[i]:=v0;
end;
for i:=1 to n-1 do begin
{寻找离生成树最近的未加入顶点k}
min:=maxlongint;
for j:=1 to n do
if (lowcost[j]<min) and (lowcost[j]<>0) then begin
min:=lowcost[j];
k:=j;
end;
lowcost[k]:=0; {将顶点k加入生成树}
{生成树中增加一条新的边k到closest[k]}
{修正各点的lowcost和closest值}
for j:=1 to n do
if cost[k,j]<lwocost[j] then begin
lowcost[j]:=cost[k,j];
closest[j]:=k;
end;
end;
end;{prim}

B.Kruskal算法:(贪心)

按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。
function find(v:integer):integer; {返回顶点v所在的集合}
var i:integer;
begin
i:=1;
while (i<=n) and (not v in vset[i]) do inc(i);
if i<=n then find:=i else find:=0;
end;

procere kruskal;
var
tot,i,j:integer;
begin
for i:=1 to n do vset[i]:=[i];{初始化定义n个集合,第I个集合包含一个元素I}
p:=n-1; q:=1; tot:=0; {p为尚待加入的边数,q为边集指针}
sort;
{对所有边按权值递增排序,存于e[I]中,e[I].v1与e[I].v2为边I所连接的两个顶点的序号,e[I].len为第I条边的长度}
while p>0 do begin
i:=find(e[q].v1);j:=find(e[q].v2);
if i<>j then begin
inc(tot,e[q].len);
vset[i]:=vset[i]+vset[j];vset[j]:=[];
dec(p);
end;
inc(q);
end;
writeln(tot);
end;

2.最短路径

A.标号法求解单源点最短路径:
var
a:array[1..maxn,1..maxn] of integer;
b:array[1..maxn] of integer; {b[i]指顶点i到源点的最短路径}
mark:array[1..maxn] of boolean;

procere bhf;
var
best,best_j:integer;
begin
fillchar(mark,sizeof(mark),false);
mark[1]:=true; b[1]:=0;{1为源点}
repeat
best:=0;
for i:=1 to n do
If mark[i] then {对每一个已计算出最短路径的点}
for j:=1 to n do
if (not mark[j]) and (a[i,j]>0) then
if (best=0) or (b[i]+a[i,j]<best) then begin
best:=b[i]+a[i,j]; best_j:=j;
end;
if best>0 then begin
b[best_j]:=best;mark[best_j]:=true;
end;
until best=0;
end;{bhf}

B.Floyed算法求解所有顶点对之间的最短路径:
procere floyed;
begin
for I:=1 to n do
for j:=1 to n do
if a[I,j]>0 then p[I,j]:=I else p[I,j]:=0; {p[I,j]表示I到j的最短路径上j的前驱结点}
for k:=1 to n do {枚举中间结点}
for i:=1 to n do
for j:=1 to n do
if a[i,k]+a[j,k]<a[i,j] then begin
a[i,j]:=a[i,k]+a[k,j];
p[I,j]:=p[k,j];
end;
end;

C. Dijkstra 算法:

var
a:array[1..maxn,1..maxn] of integer;
b,pre:array[1..maxn] of integer; {pre[i]指最短路径上I的前驱结点}
mark:array[1..maxn] of boolean;
procere dijkstra(v0:integer);
begin
fillchar(mark,sizeof(mark),false);
for i:=1 to n do begin
d[i]:=a[v0,i];
if d[i]<>0 then pre[i]:=v0 else pre[i]:=0;
end;
mark[v0]:=true;
repeat {每循环一次加入一个离1集合最近的结点并调整其他结点的参数}
min:=maxint; u:=0; {u记录离1集合最近的结点}
for i:=1 to n do
if (not mark[i]) and (d[i]<min) then begin
u:=i; min:=d[i];
end;
if u<>0 then begin
mark[u]:=true;
for i:=1 to n do
if (not mark[i]) and (a[u,i]+d[u]<d[i]) then begin
d[i]:=a[u,i]+d[u];
pre[i]:=u;
end;
end;
until u=0;
end;

3.计算图的传递闭包

Procere Longlink;
Var
T:array[1..maxn,1..maxn] of boolean;
Begin
Fillchar(t,sizeof(t),false);
For k:=1 to n do
For I:=1 to n do
For j:=1 to n do T[I,j]:=t[I,j] or (t[I,k] and t[k,j]);
End;

4.无向图的连通分量

A.深度优先
procere dfs ( now,color: integer);
begin
for i:=1 to n do
if a[now,i] and c[i]=0 then begin {对结点I染色}
c[i]:=color;
dfs(I,color);
end;
end;

B 宽度优先(种子染色法)

5.关键路径

几个定义: 顶点1为源点,n为汇点。
a. 顶点事件最早发生时间Ve[j], Ve [j] = max{ Ve [j] + w[I,j] },其中Ve (1) = 0;
b. 顶点事件最晚发生时间 Vl[j], Vl [j] = min{ Vl[j] – w[I,j] },其中 Vl(n) = Ve(n);
c. 边活动最早开始时间 Ee[I], 若边I由<j,k>表示,则Ee[I] = Ve[j];
d. 边活动最晚开始时间 El[I], 若边I由<j,k>表示,则El[I] = Vl[k] – w[j,k];
若 Ee[j] = El[j] ,则活动j为关键活动,由关键活动组成的路径为关键路径。
求解方法:
a. 从源点起topsort,判断是否有回路并计算Ve;
b. 从汇点起topsort,求Vl;
c. 算Ee 和 El;

6.拓扑排序

找入度为0的点,删去与其相连的所有边,不断重复这一过程。
例 寻找一数列,其中任意连续p项之和为正,任意q 项之和为负,若不存在则输出NO.

7.回路问题

Euler回路(DFS)
定义:经过图的每条边仅一次的回路。(充要条件:图连同且无奇点)

Hamilton回路
定义:经过图的每个顶点仅一次的回路。

一笔画
充要条件:图连通且奇点个数为0个或2个。

9.判断图中是否有负权回路 Bellman-ford 算法

x[I],y[I],t[I]分别表示第I条边的起点,终点和权。共n个结点和m条边。
procere bellman-ford
begin
for I:=0 to n-1 do d[I]:=+infinitive;
d[0]:=0;
for I:=1 to n-1 do
for j:=1 to m do {枚举每一条边}
if d[x[j]]+t[j]<d[y[j]] then d[y[j]]:=d[x[j]]+t[j];
for I:=1 to m do
if d[x[j]]+t[j]<d[y[j]] then return false else return true;
end;

10.第n最短路径问题

*第二最短路径:每举最短路径上的每条边,每次删除一条,然后求新图的最短路径,取这些路径中最短的一条即为第二最短路径。
*同理,第n最短路径可在求解第n-1最短路径的基础上求解。

三、背包问题

*部分背包问题可有贪心法求解:计算Pi/Wi
数据结构:
w[i]:第i个背包的重量;
p[i]:第i个背包的价值;

1.0-1背包: 每个背包只能使用一次或有限次(可转化为一次):

A.求最多可放入的重量。
NOIP2001 装箱问题
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
l 搜索方法
procere search(k,v:integer); {搜索第k个物品,剩余空间为v}
var i,j:integer;
begin
if v<best then best:=v;
if v-(s[n]-s[k-1])>=best then exit; {s[n]为前n个物品的重量和}
if k<=n then begin
if v>w[k] then search(k+1,v-w[k]);
search(k+1,v);
end;
end;

l DP
F[I,j]为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。
实现:将最优化问题转化为判定性问题
f [I, j] = f [ i-1, j-w[i] ] (w[I]<=j<=v) 边界:f[0,0]:=true.
For I:=1 to n do
For j:=w[I] to v do F[I,j]:=f[I-1,j-w[I]];
优化:当前状态只与前一阶段状态有关,可降至一维。
F[0]:=true;
For I:=1 to n do begin
F1:=f;
For j:=w[I] to v do
If f[j-w[I]] then f1[j]:=true;
F:=f1;
End;

B.求可以放入的最大价值。
F[I,j] 为容量为I时取前j个背包所能获得的最大价值。
F [i,j] = max { f [ i – w [ j ], j-1] + p [ j ], f[ i,j-1] }

C.求恰好装满的情况数。
DP:
Procere update;
var j,k:integer;
begin
c:=a;
for j:=0 to n do
if a[j]>0 then
if j+now<=n then inc(c[j+now],a[j]);
a:=c;
end;

2.可重复背包

A求最多可放入的重量。
F[I,j]为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。
状态转移方程为
f[I,j] = f [ I-1, j – w[I]*k ] (k=1.. j div w[I])

B.求可以放入的最大价值。
USACO 1.2 Score Inflation
进行一次竞赛,总时间T固定,有若干种可选择的题目,每种题目可选入的数量不限,每种题目有一个ti(解答此题所需的时间)和一个si(解答此题所得的分数),现要选择若干题目,使解这些题的总时间在T以内的前提下,所得的总分最大,求最大的得分。
*易想到:
f[i,j] = max { f [i- k*w[j], j-1] + k*p[j] } (0<=k<= i div w[j])
其中f[i,j]表示容量为i时取前j种背包所能达到的最大值。
*实现:
Begin
FillChar(f,SizeOf(f),0);
For i:=1 To M Do
For j:=1 To N Do
If i-problem[j].time>=0 Then
Begin
t:=problem[j].point+f[i-problem[j].time];
If t>f[i] Then f[i]:=t;
End;
Writeln(f[M]);
End.

C.求恰好装满的情况数。
Ahoi2001 Problem2
求自然数n本质不同的质数和的表达式的数目。
思路一,生成每个质数的系数的排列,在一一测试,这是通法。
procere try(dep:integer);
var i,j:integer;
begin
cal; {此过程计算当前系数的计算结果,now为结果}
if now>n then exit; {剪枝}
if dep=l+1 then begin {生成所有系数}
cal;
if now=n then inc(tot);
exit;
end;
for i:=0 to n div pr[dep] do begin
xs[dep]:=i;
try(dep+1);
xs[dep]:=0;
end;
end;

思路二,递归搜索效率较高
procere try(dep,rest:integer);
var i,j,x:integer;
begin
if (rest<=0) or (dep=l+1) then begin
if rest=0 then inc(tot);
exit;
end;
for i:=0 to rest div pr[dep] do
try(dep+1,rest-pr[dep]*i);
end;
{main: try(1,n); }

思路三:可使用动态规划求解
USACO1.2 money system
V个物品,背包容量为n,求放法总数。
转移方程:

Procere update;
var j,k:integer;
begin
c:=a;
for j:=0 to n do
if a[j]>0 then
for k:=1 to n div now do
if j+now*k<=n then inc(c[j+now*k],a[j]);
a:=c;
end;
{main}
begin
read(now); {读入第一个物品的重量}
i:=0; {a[i]为背包容量为i时的放法总数}
while i<=n do begin
a[i]:=1; inc(i,now); end; {定义第一个物品重的整数倍的重量a值为1,作为初值}
for i:=2 to v do
begin
read(now);
update; {动态更新}
end;
writeln(a[n]);

四、排序算法

A.快速排序:

procere qsort(l,r:integer);
var i,j,mid:integer;
begin
i:=l;j:=r; mid:=a[(l+r) div 2]; {将当前序列在中间位置的数定义为中间数}
repeat
while a[i]<mid do inc(i); {在左半部分寻找比中间数大的数}
while a[j]>mid do dec(j);{在右半部分寻找比中间数小的数}
if i<=j then begin {若找到一组与排序目标不一致的数对则交换它们}
swap(a[i],a[j]);
inc(i);dec(j); {继续找}
end;
until i>j;
if l<j then qsort(l,j); {若未到两个数的边界,则递归搜索左右区间}
if i<r then qsort(i,r);
end;{sort}

B.插入排序:

思路:当前a[1]..a[i-1]已排好序了,现要插入a[i]使a[1]..a[i]有序。
procere insert_sort;
var i,j:integer;
begin
for i:=2 to n do begin
a[0]:=a[i];
j:=i-1;
while a[0]<a[j] do begin
a[j+1]:=a[j];
j:=j-1;
end;
a[j+1]:=a[0];
end;
end;{inset_sort}

C.选择排序:
procere sort;
var i,j,k:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then swap(a[i],a[j]);
end;

D. 冒泡排序
procere bubble_sort;
var i,j,k:integer;
begin
for i:=1 to n-1 do
for j:=n downto i+1 do
if a[j]<a[j-1] then swap( a[j],a[j-1]); {每次比较相邻元素的关系}
end;

E.堆排序:
procere sift(i,m:integer);{调整以i为根的子树成为堆,m为结点总数}
var k:integer;
begin
a[0]:=a[i]; k:=2*i;{在完全二叉树中结点i的左孩子为2*i,右孩子为2*i+1}
while k<=m do begin
if (k<m) and (a[k]<a[k+1]) then inc(k);{找出a[k]与a[k+1]中较大值}
if a[0]<a[k] then begin a[i]:=a[k];i:=k;k:=2*i; end
else k:=m+1;
end;
a[i]:=a[0]; {将根放在合适的位置}
end;

procere heapsort;
var
j:integer;
begin
for j:=n div 2 downto 1 do sift(j,n);
for j:=n downto 2 do begin
swap(a[1],a[j]);
sift(1,j-1);
end;

Ⅵ C语言的经典编程例子

//最经典的当然是HelloWorld了。
#include"stdio.h"
intmain(void)
{
printf("HelloWorld! ");
}

Ⅶ 求C语言编程题

逻辑运算和判断选取控制

1、编制程序要求输入整数a和b,若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数字之和。

#include<stdio.h>
int main()
{
int a,b;
printf("input two number:");
scanf("%d %d",&a,&b);
if((a*a+b*b)>=100)
printf("\n %d",(a*a+b*b)/100);
else
printf("\n %d",a+b);
getch();
}

2、试编程判断输入的正整数是否既是5又是7的整数倍数。若是,则输出yes;否则输出no。

#include<stdio.h>
int main()
{
int a;
printf("input a number:");
scanf("%d",&a);
if(a%5==0 && a%7==0)
printf("yes");
else
printf("no");
getch();
}

指针

1、编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔的输出该串,请用指针完成。

#include<stdio.h>
int main()
{
char string[]="computer";
char *p=string;
while(*p)
{
printf("%c",*p);
p++;
p++;
}
getch();
}

2、输入一个字符串string,然后在string里面每个字母间加一个空格,请用指针完成。

#include<stdio.h>
#include<CONIO.H>
#include<STDLIB.H>

#define max 100

char * String;

void (char *,char*);
void insert(char *);

int main()
{
char * string;
string = (char *)malloc(max*sizeof(char));
scanf("%s",string);
insert(string);
printf("%s",string);
getch();
return 0;
}

void (char * c,char * s)
{
while(*s!='\0')
{
*c=*s;
s++;
c++;
}
*c='\0';
}

void insert(char * s)
{
String = (char*)malloc(2*max*sizeof(char));
(String,s);
while(*String!='\0')
{
*s=*String;
s++;
String++;
*s=' ';
s++;
}
*s='\0';
}

一.选择:
1.给出以下定义:
char acX[ ]= "abcdefg";
char acY[ ]= {'a','b','c','d','e','f','g'};
则正确的叙述为( )
A) 数组acX和数组acY等价 B) 数组acX和数组acY的长度相同
C) 数组acX的长度大于数组acY的长度 D) 数组acX的长度小于数组acY的长度
答案:C
2.
void example(char acHello[])
{
printf("%d", sizeof(acHello));
return;
}
void main()
{
char acHello[] = "hello";
example(acHello);//数组名称作参数,传的是地址,一个地址占四个字节
return;
}
的输出是
A 4 B 5 C 6 D不确定
答案:A
3. 有以下程序段
char acArr[]= "ABCDE";
char *pcPtr;
for(pcPtr = acArr; pcPtr < acArr + 5; pcPtr++)
{
printf("%s\n", pcPtr);
}
return;
输出结果是( )
A) ABCD B) A C) E D) ABCDE
B D BCDE
C C CDE
D B DE
E A E
答案:D
4.在中断中,不能同步获取信号量,但是可以释放信号量。
A.正确 B.错误
答案:A
5.以下叙述中不正确的是( )
A) 在不同的函数中可以使用相同名字的变量
B) 函数中的形式参数是局部变量
C) 在一个函数内定义的变量只在本函数范围内有效
D) 在一个函数内的复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)
答案:D
6.设有如下定义:
unsigned long pulArray[] = {6, 7, 8, 9, 10};
unsigned long *pulPtr;
则下列程序段的输出结果为( )
pulPtr = pulArray;
*(pulPtr + 2) += 2;
printf ("%d,%d\n", *pulPtr, *(pulPtr + 2));
A)8,10 B)6,8 C)7,9 D)6,10
答案:D
7. 定义结构体时有下面几种说法,请指出正确的(多选):______
A、结构体中的每个部分,最好进行四字节对齐;
B、结构体的总长度最好是四字节对齐;
C、结构中成员的存放不用考虑字节对齐情况;
答案:A、B
8.void example()
{
int i;
char acNew[20];

for(i = 0; i < 10; i++)
{
acNew[i] = '0';
}
printf("%d\n", strlen(acNew));
return;
}
的输出为( )
A 0 B 10 C 11 D不确定
答案:D
9.switch(c)中的c的数据类型可以是char、long、float、unsigned、bool. ( )
A. 正确 B. 错误
答案:B
10. 网络上传输的字节序默认是大字节的,如果主机是小字节序,在网络通信时则须进行字节序转换;如果主机是
大字节序,为了程序的一致性及可移植性,最好也在程序中加上字节序转换的操作(空操作)。
A. 正确 B.错误
答案:A
11. struct stu
{
int num;
char name[10];
int age;
};
void fun(struct stu *p)
{
printf("%s\n", (*p).name);
return;
}
void main()
{
struct stu students[3]={ {9801,"Zhang",20},
{9802,"Wang",19},
{9803,"Zhao",18} };
fun(students + 2);
return;
}
输出结果是( )
A) Zhang B)Zhao C) Wang D) 18
答案:B
12.以下程序运行后,输出结果是( )
void main( )
{
char *szStr = "abcde";
szStr += 2;
printf("%lu \n",szStr);
return;
}
A cde B 字符c的ASCLL码值
C "abcde"这个常串中字符c所在的地址 D 出错
答案:C
13. 在X86下,有下列程序
#include <stdio.h>
void main()
{
union
{
int k;
char i[2];
}*s,a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("%x\n", a.k);
}
输出结果是( )
A) 3839 B) 3938 C) 380039 D) 不可预知
答案:D
14. 全局变量可以定义在被多个.C文件包含着的头文件中。
A. 正确 B. 错误
答案:B
15.void example()
{
int i;
char acNew[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

for(i = 0; i < 10; i++)
{
acNew[i] = '0';
}
printf("%d\n", strlen(acNew));
return;
}
的输出为:
A 0 B 10 C 11 D不确定
答案:B
16.下列定义正确的有(多选):( )
A: char *pcPtr = "abcd";
B: char pc[4]= "abcd";
C: char pc[] = "abcd";
D: char pc[] = 'abcd';
E: char pc[] = {'a','b','c','d','\0'};
F: char pc[] = 'a' 'b' 'c' 'd';
答案:ACE
17.在函数内部定义的变量(静态变量、寄存器变量等特殊变量除外)的内存是在栈内存中,所以在定义函数内部的变量的时候,一定要保证栈不能够溢出。如果临时变量
占用空间较大,应该使用内存申请的方式,这样该变量指向的内存就是在堆内存中了。
A. 正确 B. 错误
答案:A
18.局部变量可以和全局变量重名,编译的时候不会出现错误,但一旦不小心,就可能导致使用错误变量,所以在定时局部变量的时候,不要和全局变量重名。
A. 正确 B. 错误
答案:A
19.设有以下宏定义:
#define N 3
#define Y(n) ((N+1)*n) /*这种定义在编程规范中是严格禁止的*/
则执行语句:z = 2 * (N + Y(5 + 1));后,z的值为( )
A) 出错 B) 42 C) 48 D)54
答案:C
20. int *(*ptr)();
则以下叙述中正确的是( )
A) ptr是指向一维组数的指针变量
B) ptr是指向int型数据的指针变量
C) ptr是指向函数的指针,该函数返回一个int型数据
D) ptr是指向函数的指针,该函数的返回值是指向int型数据的指针
答案:D
21. 0x12345678 在采用BigEndian中内存的排列顺序是______,在采用LittleEndian内存中的排列顺序是_______.
(答案从左到右内存地址依次增加)
A.12 34 56 78 B.34 12 78 56
C.78 56 34 12 D.56 78 12 34
答案:A C
二、填空:
1. .struct tagAAA
{
unsigned char ucId:1;
unsigned char ucPara0:2;
unsigned char ucState:6;
unsigned char ucTail:4;
unsigned char ucAvail;
unsigned char ucTail2:4;
unsigned long ulData;
}AAA_S;
问:AAA_S在字节对齐分别为1、4的情况下,占用的空间大小是多少?
答案:9 12
2.typedef struct tagTest
{
UCHAR ucFlag;
ULONG ulLen;
}TEST_S;

TEST_S test[10];

四字节对齐方式时: sizeof(TEST_S) = ______, sizeof(test)________.
答案:8 80
3
char acHello[] = "hello\0world";
char acNew[15] = {0};
strcpy(acNew,acHello);
strlen(acNew) = _____
sizeof(acHello) = ______
答案:5 12
4.#pragma pack(4)/*编译选项,表示4字节对齐*/
int main(int argc, char* argv[])
{
struct tagTest1
{
short a;
char d;
long b;
long c;
};
struct tagTest2
{
long b;
short c;
char d;
long a;
};
struct tagTest3
{
short c;
long b;
char d;
long a;
};
struct tagTest1 stT1;
struct tagTest2 stT2;
struct tagTest3 stT3;

printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
return 0;
}
#pragma pack()(编译选项结束)
请问输出结果是:_________
答案:12 12 16
5. enum ENUM_A
{
X1,
Y1,
Z1 = 5,
A1,
B1
};
enum ENUM_A enumA = Y1;
enum ENUM_A enumB = B1;
请问 enumA = ____; enumB = ______;
答案:1 7
6.以下程序的输出结果是________.
#include <stdio.h>
int fun(int x,int y)
{
static int m = 0;8
static int i = 2;3
i += m + 1;12
m = i + x + y;
return m;
}
void main()
{
int j = 4;
int m = 1;
int k;
k = fun(j, m);
printf("%d,", k);
k=fun(j, m);
printf("%d\n", k);
return;
}
答案:8 17
7.以下程序的输出结果为________
#define CIR(r) r*r /*请注意这种定义的缺陷,不允许这么定义*/
void main()
{
int a = 1;
int b = 2;
int t;
t = CIR(a + b);
printf("%d\n", t);
return;
}
答案:5
8.在VRP中,实现了strncpy类似的函数,定义如下:
#define CHAR char
#define ULONG unsigned long
#define VOID void

#define MACRO_COPYWORLDLENGTH 4

CHAR *VOS_strncpy(CHAR *pcDest, const CHAR *szSrc, ULONG ulLength)
{
CHAR *pcPoint = pcDest;

if(( NULL == szSrc ) || ( NULL == pcDest ) ))
{
return NULL;
}

while(ulLength && (*pcPoint = *szSrc))/*这里采用了在判断语句中赋值的方式(*pcPoint = *szSrc),建议尽量不使用*/
{
pcPoint++;
szSrc++;
ulLength--;
}
if(!ulLength)
{
*pcPoint = '\0';
}
return pcDest;
}

VOID main(VOID)
{
CHAR szStrBuf[ ] = "1234567890";
CHAR szStrBuf1[ ] = "1234567890";
CHAR *szHelloWorld = "Hello World!";
strncpy(szStrBuf, szHelloWorld, MACRO_COPYWORLDLENGTH);
VOS_strncpy(szStrBuf1, szHelloWorld, MACRO_COPYWORLDLENGTH);
printf("%s %s", szStrBuf, szStrBuf1);
}
程序的输出结果为________
答案:Hell567890 Hell
9.
char acHello[] = "hello\0world";
char acNew[15] = {0};
memcpy(acNew,acHello,12);
strlen(acNew) = _____
sizeof(acHello) = _____
答案:5 12
10. typedef struct Head
{
UCHAR aucSrc[6];
ULONG ulType;
} HEAD_S;

在强制一字节对齐情况下,请指出sizeof(HEAD_S) = ________;
在强制二字节对齐情况下,请指出sizeof(HEAD_S) = ________;
在强制四字节对齐情况下,请指出sizeof(HEAD_S) = ________;
答案:10 10 12
11.union tagAAAA
{
struct
{
char ucFirst;
short usSecond;
char ucThird;
}half;
long lI;
}number;

struct tagBBBBB
{
char ucFirst;
short usSecond;
char ucThird;
short usForth;
}half;

struct tagCCCC
{
struct
{
char ucFirst;
short usSecond;
char ucThird;
}half;
long lI;
};

在字节对齐为1下,sizeof(union tagAAAA)、sizeof(struct tagBBBBB)、sizeof(struct tagCCCC)是____ ____ _____
在字节对齐为4下,sizeof(union tagAAAA)、sizeof(struct tagBBBBB)、sizeof(struct tagCCCC)是____ ____ _____
答案:4 6 8
8 8 12
12.struct tagABC
{
char cB;
short sC;
char cD;
long lA;
}*pAbc;

pAbc = 0x100000;
那么pAbc+0x100 = 0x_________; (ULONG)pAbc + 0x100 = 0x_________;(ULONG *)pAbc + 0x100 = 0x_________;(char *)pAbc + 0x100 = 0x_______;
答案:100C00 100100 100400 100100
13.unsigned long FUNC_C ( unsigned long ulAction )
{
unsigned long ulResult = 0 ;

switch ( ulAction )
{
case ACTION_A:
{
ulResult += 1 ;
break ;
}
case ACTION_B:
{
ulResult += 1 ;
}
default:
{
ulResult += 1 ;
}
}

printf( "ulResult = %u", ulResult ) ;

return ulResult ;
}
当输入为ACTION_B时,输出结果为: ulResult = _________;
答案:2(因为此分支没有break分支)
14.下面的代码中,函数Test执行完毕后,打印的结果是 _____。
unsigned long g_ulGlobal = 0;
void GlobalInit(unsigned long ulArg)
{
ulArg = 0x01;

return;
}

void Test()
{
GlobalInit(g_ulGlobal);
printf("%lu", g_ulGlobal);
return;
}
答案:0
15.以下程序的输出的结果是___________
int x = 3;
void incre();
void main()
{ int i;
for (i = 1; i < x; i++)
{
incre();
}
return;
}
void incre()
{
static int x = 1;
x *= (x + 1);
printf("%d ",x);
return;
}
答案:2 6
16.以下程序的输出的结果是___________
#pragma pack(4)/*四字节对齐*/
int main(int argc, char* argv[])
{
unsigned char puc[4];
struct tagPIM
{
unsigned char ucPim1;
unsigned char ucData0:1;
unsigned char ucData1:2;
unsigned char ucData2:3;
}*pstPimData;

pstPimData = (struct tagPIM *)puc;

memset(puc, 0, 4);
pstPimData->ucPim1 = 1;
pstPimData->ucData0 = 2;
pstPimData->ucData1 = 3;
pstPimData->ucData2 = 4;

printf("%02X %02X %02X %02X\n", puc[0], puc[1], puc[2], puc[3]);
return 0;
}
#pragma pack()/*恢复缺省对齐方式*/
答案:01 26 00 00
17.
char *pcColor = "blue1" ;
char acColor[] = "blue1" ;
strlen(pcColor) = _____
strlen(acColor) = _____
sizeof(pcColor) = _____
sizeof(acColor) = _____
答案:5 5 4 6
18.
char str[] = "\\\0";
char *p = str;
int n = 1000;
请计算
sizeof (str ) = ____________
sizeof ( p ) = ______________
sizeof ( n ) = ______________
答案:3 4 4
19.UCHAR *pucCharArray[10][10];
typedef union unRec
{
ULONG ulIndex;
USHORT usLevel[6];
UCHAR ucPos;
}REC_S;
REC_S stMax,*pstMax;

四字节对齐方式时: sizeof(pucCharArray) = __指针的数组,每个指针的地址都是4字节____, sizeof(stMax)=_______, sizeof(pstMax)=__地址______,sizeof(*pstMax)=________.
答案:400 12 4 12
20.typedef union unHead
{
UCHAR aucSrc [6];
struct tagContent
{
UCHAR ucFlag[3];
ULONG ulNext;
}Content;
}HEAD_S;
32CPU,VC编译环境下:
在强制一字节对齐情况下,请指出sizeof(HEAD_S) = ________;
在强制二字节对齐情况下,请指出sizeof(HEAD_S) = ________;
在强制四字节对齐情况下,请指出sizeof(HEAD_S) = ________;
答案:7 8 8
21.
UCHAR *pszTest = "hello";
UCHAR aucTest[] = "hello";
请问 sizeof(pszTest) = _____ , sizeof(*pszTest) = ______, sizeof(aucTest) = ______.
答案:4 1 6
22. struct BBB
{
long lNum;
char *pcName;
short sDate;
char cHa[2];
short sBa[6];
}*p;
p = 0x100000;
p + 0x1 = 0x____
(unsigned long)p + 0x1 = 0x______
(unsigned long *)p + 0x1 = 0x______
(char *)p + 0x1 = 0x______
答案:100018 100001 100004 100001
23.在4字节对齐的情况:
typedef struct tagRec
{
long lA1;
char cA2;
char cA3;
long lA4;
long lA5;
} REC_S;

void main(int argc, char *argv[])
{
REC_S stMax ;
printf("\r\n sizeof(stMax)= %d",sizeof(stMax));
return;
}
输出结果为:
sizeof(stMax)=____
答案:16
24.void main ()
{
unsigned long ulA = 0x11000000;
printf("\r\n%x",*(unsigned char *)&ulA);
return;
}
输出结果为:
答案:0
三、指出下列程序中导致不能出现预期结果的唯一错误(不考虑编程规范错误)
1.下面程序用于输出用户输入的字符串。请指出其中的问题
#define OK 0
#define ERR 1
#define ERROR (-1)
#define BUFFER_SIZE 256
int GetMemory(char **ppszBuf, int num)
{
if( NULL == ppszBuf )
{
ASSERT(0);
return ERROR;
}
*ppszBuf = (char *)malloc(num);
if(NULL == *ppszBuf)
{
return ERROR;
}
return OK;
}

void Test(void)
{
char *pcStr = NULL;
if(OK == GetMemory(&pcStr, BUFFER_SIZE))
{
scanf("%s",pcStr);/*这里假定BUFFER_SIZE足够大,不会导致越界*/
printf(pcStr);
free(pcStr);
}

return;
}
答案:要采用printf("%s", str)的形式打印,否则如果输入为%s, %d等形式可能会导致不可知现象。
2.此函数实现把32位IP地址(主机序)以字符串的方式打印出来,请找出代码中的错误:
char *IpAddr2Str(unsigned long ulIpAddr)
{
char szIpAddr[32];

(void)VOS_sprintf(szIpAddr, "%d.%d.%d.%d", ulIpAddr >> 24,
(ulIpAddr >> 16) & 0xff, (ulIpAddr >> 8) & 0xff, ulIpAddr & 0xff);

return szIpAddr;
}
答案:函数的局部变量是存放在堆栈中的,此函数返回了堆栈中的地址,函数退出后堆栈中的内容不可用。
3.如下程序用于输出"Welcome Home"。请指出其中的错误:
void Test(void)
{
char pcArray[12];
strcpy(pcArray,"Welcome Home");
printf("%s!", pcArray);
return;
}
答案:数组越界。
4.如下程序用于把"blue"字符串返回,请指出其中的错误:
char *GetBLUE(void)
{
char* pcColor ;
char* pcNewColor;
pcColor = "blue";
pcNewColor = (char*)malloc(strlen(pColor));
if(NULL == pcNewColor)
{
return NULL;
}
strcpy(pcNewColor, pcColor);
return pcNewColor;
}
答案:申请内存空间不足,字符串结尾还有'\0'。
5.下面程序期望输出str = hello world,请指出其中的错误:

char * GetStr(char *p)
{
p = "hello world";
return p;
}

void main()
{
char *str = NULL;

if(NULL != GetStr(str))
{
printf("\r\n str = %s",str);
}
return;
}
答案:无法返回字符串,参数使用错误。

阅读全文

与c语言编程例子大全相关的资料

热点内容
云服务器可以攻击吗 浏览:558
主力吸筹派发区域指标源码 浏览:695
单片机pc的低字节怎么算 浏览:230
pythoneval函数源码 浏览:242
linuxmongodb服务启动 浏览:766
在哪里下载核酸检测app 浏览:310
esxi启动虚拟机命令 浏览:969
军工级单片机 浏览:113
服务器安全保护是什么意思 浏览:789
删除运行命令 浏览:720
龙之召唤服务器如何 浏览:119
linux目录跳转 浏览:368
程序员和老板称兄道弟 浏览:759
直播网络连接源码 浏览:736
用安卓手机怎么登录苹果手机id 浏览:710
论文查重工具源码 浏览:401
android银联demo 浏览:86
智能算法发展 浏览:351
房车露营地用什么app 浏览:70
spark编程指南python 浏览:553