经典笔试题123

原创 2016年05月30日 11:03:23

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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

经典基础C++笔试题(附答案)

一、选择题 1. 若用数组名作为函数调用时的实参,则实际上传递给形参的是( A ) A. 数组首地址 B. 数组的第一个元素值 C. 数组中全部元素的值 D. 数组元素的个数 2. 有关函数重载的正确...

白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)

首先来看看原题 微软2010年笔试题在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1...

【经典】《Java170道面试笔试题全面含答案》涉及java/数据库/框架/系统/设计模式相关

《Java170道面试题全集》《Java170道面试笔试题全面含答案》涉及java/数据库/框架/系统/设计模式相关 1、面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几(四)个方面:  ...
  • hotpots
  • hotpots
  • 2017年08月06日 16:02
  • 5142

100道经典Hadoop常见面试/笔试题及答案解析

100道常见Hadoop面试/笔试题,都是带有答案解析的哦,各类题型都有,单选题、多选题、判断题和简单题,这是第一版,下周推出第二版,将会加入更多面试/笔试题。 1 单选题 1.1 ...

数据库经典笔试题及答案

Student(S#,Sname,Sage,Ssex)学生表      S#:学号;Sname:学生姓名;Sage:学生年龄;Ssex:学生性别 Course(C#,Cname,T#)课程表    ...

经典笔试题:从十亿个整数中选择前100大整数的算法实现

转自:http://www.cnblogs.com/kanong/archive/2010/10/06/1844490.html 最近几天都在研究一些面试,笔试题,发现有一种题型很经常出现,如从十亿个...
  • RuizeMa
  • RuizeMa
  • 2011年04月02日 11:42
  • 1339

经典C++笔试题收藏

1.求下面函数的返回值(微软) int func(x)  {      int countx = 0;      while(x)      {            countx ++;...

C语言经典笔试题(二)

C语言经典笔试题(二)

白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)

微软2010年笔试题 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1...

经典笔试题 最长公共子串(连续)问题

最长公共子串(连续)问题 动态规划有一个经典问题是最长公共子分类: 编程练习 数据结构和算法 序列,但是这里的子序列不要求连续,如果要求序列是连续的,我们叫公共子串,那应该...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经典笔试题123
举报原因:
原因补充:

(最多只允许输入30个字)