关闭

经典笔试题123

311人阅读 评论(0) 收藏 举报
分类:

1.实现对一个8bit位数据(unsigned char 类型)的指定位(例如第n位)的置0或置1操作,并保持其他位不变。

函数原型:

void bit_set(unsigned char *p_data,unsigned char position,int flag)

函数参数说明:P_data是指定的原数据,position是指定位(取值范围为1~8),flag表示是置0还是置1.

举例说明一下,比如数字15,q它的二进制序列为0000 1111


代码实现:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

void bit_set(unsigned char *p_data,unsigned char position,int flag)
{
    assert(p_data);
	assert((position>=1)&&(position<=8));
	if(flag==1)//置1操作
	{
	    *p_data |= (1<<(position-1));
	}
	else if(flag==0)//置0操作
	{
	    *p_data &= ~(1<<(position-1));
	}
	
	else
	{
	    printf("flag参数错误!\n");
	}
}
int main()
{
   unsigned char num=0;
   unsigned char pos=0;
   int flag=0;
   printf("请输入各自的值:num pos flag\n");
   scanf("%d %d %d",&num,&pos,&flag);
   bit_set(&num,pos,flag);
   printf("%d\n",num);
   system("pause");
   return 0;
}


2.将一个字符串循环右移n位

函数原型:

void RightLoopMove(char *pStr,unsigned short steps)
下面用常用的两种方法实现



代码实现:

<pre name="code" class="cpp">#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
//void reverse(char *left,char *right)//翻转函数
//{
//    assert(left);
//	assert(right);
//	while(left<right)
//	{
//	    char tmp=*left;
//		*left=*right;
//		*right=tmp;
//		left++;
//		right--;
//	}
//}
//void RightLoopMove(char *pStr,unsigned short steps)//三步翻转法
//{
//    int len=strlen(pStr);
//if(steps>len)//防止给出的翻转位数大于字符串长度
//	{
//	     steps%=len;
//	}
//	reverse(pStr,pStr+len-1-steps);
//	reverse(pStr+len-steps,pStr+len-1);
//	reverse(pStr,pStr+len-1);
//}
void RightLoopMove(char *pStr,unsigned short steps)//循环右移
{
	int len=strlen(pStr);
	assert(pStr);
	if(steps>len)//防止给出的翻转位数大于字符串长度
	{
	     steps%=len;
	}
	while(steps)
	{
	   int cur=0;
	   char tmp=pStr[len-1];
     for(cur=len-1; cur>0; cur--)
	 {
		 pStr[cur]=pStr[cur-1];
	 }
	pStr[cur]=tmp;
	steps--;
	}
}
int main()
{
    char arr[]="abcdef";/*因为参数需要修改,必须采用数组传参,
	                   指针传参为字符串的首地址,不能被修改*/
	unsigned short steps=0;
	printf("请输入你要循环右移的位数:");
	scanf("%d",&steps);
	RightLoopMove(arr,steps);
	printf("%s\n",arr);
	system("pause");
	return 0;

}



3,编写程序实现字符串到整数的转换,如"12345"---->12345.

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<ctype.h>//isspace isdigit的库函数


enum State//判断程序是否正常结束
{
   INVALID,//值为0,表示非正常结束
   VALID//值为1,表示正常结束
};
enum State state;//定义枚举类型的变量
int my_atoi(char *str)
{
   int flag=1;//符号位
   long long ret=0;//设置一个较大的数保存返回值,防止溢出
   assert(str);
   state=INVALID;//先赋值为非正常结束
   while(isspace(*str))//判断字符串是否为空白字符
   {
       str++;
   }
   if(*str=='\0')//空字符串,直接结束
   {
       return 0;
   }
   if(*str=='-')//第一个字符为‘-’,转换后为负数
   {
       flag=-1;
	   str++;
   }
   else if(*str=='+')//正数的情况
   {
       str++;
   }
   while(isdigit(*str))//判断是否为数字字符
   {
       ret=ret*10+flag*(*str-'0');
	   if(ret>INT_MAX || ret<INT_MIN)//判断数据是否溢出,若溢出,直接返回
	   {
	       return 0;
	   }
	   str++;
   }
   if(*str=='\0')//表示正常结束,找到字符串的'\0'
   {
       state=VALID;
	   return (int)ret;
   }
   else//异常结束
   {
     return ret;//可能丢掉一部分数据
   }

}
int main()
{
   char *p="12345";
   int ret=my_atoi(p);
   printf("%d\n",ret);
   system("pause");
   return 0;
}



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:187987次
    • 积分:3168
    • 等级:
    • 排名:第11255名
    • 原创:120篇
    • 转载:4篇
    • 译文:1篇
    • 评论:74条
    博客专栏
    文章分类
    最新评论
    C专区
    一门流行40余年的编程语言,你,值得拥有!