嵌入式系统C语言编程大赛初赛

    这几天一直都在忙着这东西,花了不少时间终于搞定了,感想和收获很多。下面拿来给大家分享一下!总共5个题,其中的C题让我调试了很长时间!

Problem A: 位操作
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 2513 Accepted: 840

Description

假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其他位保持不变。对给定的寄存器值R,及X,Y,编程计算更改后的寄存器值R。

Input

仅一行,包括R,X,Y,以逗号","分隔,R为16进制表示的32位整数,X,Y在0-31之间且Y>=3,(Y-X)的绝对值>=3,保证两次置位不会重合

Output

更改后的寄存器值R(16进制输出)

Sample Input

12345678,0,3

Sample Output

1234567c


Problem B: 破译密码
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 1254 Accepted: 806

Description

据说最早的密码来自于罗马的凯撒大帝。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A都分别替换成字母F)。而你要获得消息原文,也就是要将这个过程反过来。

密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z M
原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

注意:只有字母会发生替换,其他非字母的字符不变,并且消息原文的所有字母都是大写的。

Input

最多不超过100个数据集组成,每个数据集之间不会有空行,每个数据集由3部分组成:

  1. 起始行:START
  2. 密码消息:由1到200个字符组成一行,表示凯撒发出的一条消息.
  3. 结束行:END


在最后一个数据集之后,是另一行:ENDOFINPUT

Output

每个数据集对应一行,是凯撒的原始消息。

Sample Input

START NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT

Sample Output

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE


Problem C: 小孩报数问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 1641 Accepted: 722

Description

有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。

Input

第一行输入小孩的人数N(N<=64)
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号","间隔

Output

按人名输出小孩按顺序出列的顺序,每行输出一个人名

Sample Input

5 Xiaoming Xiaohua Xiaowang Zhangsan Lisi 2,3

Sample Output

Zhangsan Xiaohua Xiaoming Xiaowang Lisi


Problem D: 时间日期格式转换
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 1387 Accepted: 694

Description

世 界各地有多种格式来表示日期和时间。对于日期的常用格式,在中国常采用格式的是“年年年年/月月/日日”或写为英语缩略表示的”yyyy/mm/dd”, 此次编程大赛的启动日期“2009/11/07”就是符合这种格式的一个日期,而北美所用的日期格式则为“月月/日日/年年年年”或”mm/dd /yyyy”,如将“2009/11/07”改成这种格式,对应的则是”11/07/2009”。对于时间的格式,则常有12小时制和24小时制的表示方 法,24小时制用0-24来表示一天中的24小时,而12小时制只采用1-12表示小时,再加上am/pm来表示上午或下午,比如”17:30:00”是 采用24小时制来表示时间,而对应的12小时制的表示方法是”05:30:00pm”。注意12:00:00pm表示中午12点,而12:00:00am 表示凌晨12点。

对于给定的采用”yyyy/mm/dd”加24小时制(用短横线”-”连接)来表示日期和时间的字符串,请编程实现将其转换成”mm/dd/yyyy”加12小时制格式的字符串。

Input

第一行为一个整数T(T<=10),代表总共需要转换的时间日期字符串的数目。
接下来的总共T行,每行都是一个需要转换的时间日期字符串。

Output

分行输出转换之后的结果

Sample Input

2

2009/11/07-12:12:12

1970/01/01-00:01:01

Sample Output

11/07/2009-12:12:12pm

01/01/1970-12:01:01am



Problem E: 字母旋转游戏
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 1861 Accepted: 659

Description

给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下:
   A   B   C   D   E   F   G   H



V W X Y Z A B I



U J K L M N C J



T I H G F E D K



S R Q P O N M L

Input

M为行数,N为列数,其中M,N都为大于0的整数。

Output

分行输出相应的结果

Sample Input

4 9

Sample Output

A B C D E F G H I V W X Y Z A B C J U J I H G F E D K T S R Q P O N M L

下面是我这几天的劳动成果,顺便也给大家分享一下!



题A:

#include <stdio.h>

long r;

void main()

{

int x,y;

scanf("%x,%d,%d",&r,&x,&y);

r&=~(1<<x);

r|=3<<(y-1);

r&=~(1<<(y-2));

printf("%x/n",r);

}



题B:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define uchar unsigned char

struct data

{

char a[10];

char b[200];

char c[3];

};



void main()



{

uchar i,j,t;

struct data p[100];

for(i=0;i<100;i++)

{

gets(p[i].a);

if(strlen(p[i].a)==10)

break;

gets(p[i].b);

gets(p[i].c);

t++;

}



for(i=0;i<t;i++)

for(j=0;j<200;j++)

{

if(p[i].b[j]>='F'&&p[i].b[j]<='Z')

p[i].b[j]-=5;

else if(p[i].b[j]>='A'&&p[i].b[j]<='E')

p[i].b[j]+=21;

}

for(i=0;i<t;i++)

puts(p[i].b);

}



题C:

#include<stdio.h>

#include<string.h>

void main()

{

unsigned int n,w,s,i,x,flag;

char a[64][15];

scanf("%u",&n);

for(i=0;i<n;i++)

scanf("%s",a[i]);

scanf("%u,%u",&w,&s);

printf("%s/n",a[w+s-2]);

x=w+s-2;

n--;

while(n)

{

for(i=x;i<n;i++)

{

if(flag==1) break;

else strcpy(a[i],a[i+1]);

}

if(n-x<s)

{

if(n-x==0){ if(n==1)printf("%s/n",a[0]);

else {printf("%s/n",a[x+s%n-n-1]);x+=s%n-n-1;flag=0;}

}

else { printf("%s/n",a[x+s-n-1]);x+=s-n-1;flag=0;}

}

else if(n-x==s)

{ printf("%s/n",a[x+s-1]);x+=s-n;flag=1;}

else

{ printf("%s/n",a[x+s-1]);x+=s-1;flag=0;}

n--;

}

}



题D:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

void main()

{

int nian[10],yue[10],ri[10],shi[10],fen[10],miao[10];

int i,t;

char a[10];

scanf("%d",&t);

for(i=0;i<t;i++)

{

scanf("%d/%d/%d-%d:%d:%d",&nian[i],&yue[i],&ri[i],&shi[i],&fen[i],&miao[i]);

if(shi[i]==0)

{ shi[i]=12;a[i]='a';}

else if(shi[i]==12)

a[i]='p';

else if(shi[i]>12)

{ shi[i]-=12;a[i]='p';}

else a[i]='a';

}

for(i=0;i<t;i++)

{

printf("%02d/%02d/%d-%02d:%02d:%02d%cm/n",yue[i],ri[i],nian[i],shi[i],fen[i],miao[i],a[i]);

}

}



题E:

#include<stdio.h>


#include<stdlib.h>

void main()


{


int i,j,M,N,x1,y1,x2,y2;

char **a=NULL;

scanf("%d%d",&M,&N);

a=(char **)malloc(M*sizeof(char *));

for(i=0;i<M;i++)

a[i]=(char *)malloc(N*sizeof(char));

x2=M/2,y2=N/2;


x1=M,y1=N;

while(1)

{ for(i=M-x1,j=N-y1;j<y1-1;j++)

{

if(i==0&&j==0)

a[i][j]='A';

else

{

if(a[i][j-1]=='Z')

a[i][j]='A';

else a[i][j]=a[i][j-1]+1;

}

a[i][j+1]=a[i][j]+1;

}

for(i=M-x1,j=y1-1;i<x1-1;i++)

{

if(a[i][j]=='Z')

a[i+1][j]='A';

else a[i+1][j]=a[i][j]+1;

}

if(i==M-x1)break;

for(i=x1-1,j=y1-1;j>N-y1;j--)

{

if(a[i][j]=='Z')

a[i][j-1]='A';

else a[i][j-1]=a[i][j]+1;

}

for(i=x1-1,j=N-y1;i>M+1-x1;i--)

{

if(a[i][j]=='Z')

a[i-1][j]='A';

else a[i-1][j]=a[i][j]+1;

}

x1--;y1--;

if(x1==x2||y1==y2)break;


}


for(i=0;i<M;i++)

{

for(j=0;j<N;j++)

{

printf(" %c",a[i][j]);

}

printf("/n");

}


for(i=0;i<M;i++)

{ free(a[i]);a[i]=NULL; }

free(a);

a = NULL;


}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值