您的位置:首页 > 编程语言

15.8 编程练习

2016-04-28 02:26 337 查看
1.编写一个将二进制字符串转化为数字值的函数。也就是说,如果您有一下语句:

char *pbin="01001001";

那么您将可以把pbin作为参数传递给函数,使该函数返回一个int值25.

(题目是不是出错了,01001001拿计算器算是等于73)

#include <stdio.h>
#include <string.h>
int tointeger(char * str);
int POW(int p);
int main(void)
{
char pbin[9]="01001001";

printf("to integer is %d\n",tointeger(pbin));
}
int POW(int p)
{
int result=1;
int i;
for(i=0;i<p;i++)
{
result=result*2;
}
return result;
}
int tointeger(char * str)
{
int i;
int p;
int num;
int size=strlen(str);
for(i=size-1,p=0,num=0;i>=0;i--,p++)
{
num+=((str[i]-'0')*POW(p));
}

return num;
}

2.编写一个程序,该程序用命令行参数读取两个二进制字符串,并且打印对每个数使用~运算符的结果。以及对这两个数使用&,|,^运算符的结果。使用二进制字符串形式显示结果。

#include <stdio.h>
#include <string.h>
int StrToNum(const char * str);
int Pow(int p);
void NumToStr(int num,char *argv[],int index);

int main(int argc,char *argv[])
{

int num1,num2;

num1=StrToNum(argv[1]);
num2=StrToNum(argv[2]);
printf("argv[1]=%d	",num1);
printf("argv[2]=%d\n",num2);
NumToStr(~num1,argv,1);
NumToStr(~num2,argv,1);
NumToStr((num1 & num2),argv,1);
NumToStr((num1 | num2),argv,1);
NumToStr((num1 ^ num2),argv,1);
}

int StrToNum(const char * str)
{
int size=strlen(str);
int i,j;
int num=0;
for(i=size-1,j=0;i>=0;i--,j++)
{
num=num+(str[i]-'0')*Pow(j);
}
return num;
}

int Pow(int p)
{
int result=1;
int i;
for(i=0;i<p;i++)
result=result*2;
return result;
}

void NumToStr(int num,char *argv[],int index)
{
char ps[100];
int size=strlen(argv[index]);
int i;
for(i=size-1;i>=0;i--)
{
ps[i]=(num & 01)+'0';
num>>=1;
}
ps[size]='\0';
printf("%s\n",ps);
}
3.编写一个函数,该函数接受一个int参数,并返回这个参数中打开的位的数量。在程序中测试该函数。

#include <stdio.h>
#include <stdbool.h>
#define MASK 01
int AmountOfOpenBit(int n);
int main(void)
{
int number;
printf("Please enter a number to find how many bits are opened.\n");
while(scanf("%d",&number)==1)
{
printf("There are %d bits are opened.\n",AmountOfOpenBit(number));
printf("Enter another number.(q to quit:)\n");
}
}
int AmountOfOpenBit(int n)
{
int total=0;
int size=sizeof(int)*8;
int i;
for(i=0;i<size-1;i++,n>>=1)
{
if(n & MASK)
total++;
}
return total;
}
4.编写一个函数,该函数接受两个int参数,一个值和一个位的位置。如果指定的位上的值是1.则该函数返回1,否则返回0.在程序中测试该函数。
#include <stdio.h>
#include <stdbool.h>
#define MASK 01
bool isOpened(int number,int code);
int main(void)
{
int number,code;
printf("Please enter two number to see is it opened.\n");
while(scanf("%d %d",&number,&code)==2)
{
isOpened(number,code);
if(isOpened(number,code))
printf("It is opened.\n");
else
printf("It is closed.\n");
printf("Enter another number.q to quit:\n");
}
}
bool isOpened(int number,int code)
{

int i;
bool isopen=false;
for(i=0;i<code;i++)
number>>=1;
if(number & MASK)
isopen=true;
return isopen;
}

5.编写一个函数,该函数将一个unsigned int 中的所有位向左旋指定数量的位。例如,rotate_1(x,4)将x中的所有位向左移动4个位置,而且左端丢失的位会重新出现在右端。也就是说,把高位移动出的为放入低位。在程序中测试该函数。

#include <stdio.h>
#include <string.h>
#define MASK 01
void MoveBits(int num,int code);
void show(char *str,int size);
int main(void)
{
unsigned int number;
int code;
printf("Please enter two number to operat.\n");
while(scanf("%d %d",&number,&code)==2)
{
MoveBits(number,code);
printf("Enter another number.q to quit:\n");
}
}

void MoveBits(int num,int code)
{
int size=sizeof(unsigned int)*8;
char source[size+1];
char AfterMove[size+1];
int i,j;

/*把数字转换成字符数组*/
for(i=size-1;i>=0;i--,num>>=1)
{
source[i]=(num & MASK)+'0';
}
source[size]='\0';
show(source,size);

/*把code位后面的二进制拷贝进AfterMove字符数组*/
strcpy(AfterMove,&source[code]);

/*把code位之前的二进制接入AfterMove字符数组*/
strncat(AfterMove,source,code);
show(AfterMove,size);

}

void show(char *str,int size)
{
int i;
for(i=0;i<size;i++)
{

putchar(str[i]);
if((i+1)%8==0)
putchar(' ');
}
printf("\n");
}
6.设计一个字段结构用来存储以下信息

Font ID:0到255之间的一个数

Font Size:0到127之间的一个数

Bold:Off 或者 On

Italic:Off 或者On

Underlin:Off或者On

在程序中使用这个结构来现实字体参数,并使用循环的菜单来让用户改变参数。例如,程序的一个运行示例如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MASK 01
#define ON 01
#define OFF 00

typedef struct font{
unsigned int id			:	8	;
unsigned int size		:	7	;
unsigned int bold 		:	1	;
unsigned int italic		:	1	;
unsigned int underline	:	1	;
unsigned int 			:	14	;
}FONT;

const char *ALIGNMENT[3]={"left","center","right"};
const char *onoff[2]={"off","on"};
const char *TITLE="ID SIZE ALIGNMENT B I U";
const char *BLANK=" ";
const int TITLELEN=strlen(TITLE);

void ShowStructure(FONT a,char alignment);
void Menu(void);
void endline(void);

int main(void)
{
FONT a={
1,
12,
OFF,
OFF,
OFF,
};
char alignment='l';
char choice;

ShowStructure(a,alignment);
Menu();

printf("Enter a label to perform process (q to quit):\n");
choice=getchar();
endline();
while(choice!='q')
{
switch(choice)
{
int value;
case 'f':
printf("Enter Font ID (0~255):\n");
/*检查输入合法性*/
while(scanf("%d",&value)!=1 || value<0 || value>255)
{
endline();
printf("Illegal input.Please enter a number (0~255):\n");
}
endline();
a.id=value;
break;

case 's':
printf("Enter Font size (0~127):\n");
/*检查输入合法性*/
while(scanf("%d",&value)!=1 || value<0 || value>127)
{
endline();
printf("Illegal input.Please enter a number (0~127):\n");
}
endline();
a.size=value;
break;

case 'a':
printf("Select alignment:\n");
printf("l) left		c)center	r)right\n");
alignment=getchar();
endline();
while(alignment!='l'&&alignment!='c' &&alignment!='r')
{
printf("Illegal input.Please enter a character like l or c or r:\n");
alignment=getchar();
endline();
}
break;

case 'b':
a.bold=(a.bold ^ MASK);
break;

case 'i':
a.italic=(a.italic ^ MASK);
break;

case 'u':
a.underline=(a.underline ^ MASK);
break;

default :
printf("Enter right labels.\n");

}
ShowStructure(a,alignment);
Menu();
printf("Enter a label to perform process (q to quit):\n");
choice=getchar();
endline();
printf("\n");
}

}
void ShowStructure(FONT a,char alignment)
{
char Before[50];
char After[50]={'\0',};
char temp[4];
int sourcelen;
int D_value;
int i;

/*把结构体ID中的数据转换成字符串写入数组*/
strcpy(Before,itoa(a.id,temp,10));
/*追加一个空格*/
strcat(Before,BLANK);

/*把结构体size中的数据转换成字符串写入数组*/
strcat(Before,itoa(a.size,temp,10));
strcat(Before,BLANK);

/*把结构体bold数据写入下标*/
strcat(Before,onoff[a.bold]);
strcat(Before,BLANK);

/*把结构体italic数据写入下标*/
strcat(Before,onoff[a.italic]);
strcat(Before,BLANK);

/*把结构体underline数据写入下标*/
strcat(Before,onoff[a.underline]);
strcat(Before,BLANK);

sourcelen=strlen(Before);
D_value=TITLELEN-sourcelen;

/*打印标题*/
printf("%s\n",TITLE);

/*调整对齐方式*/
if(alignment=='l')
{
/*左对齐直接打印*/
strcpy(After,Before);
}
if(alignment=='c')
{
/*居中对齐,前面填充一半空格*/
for(i=0;i<D_value/2;i++)
{
strcat(After,BLANK);
}
strcat(&After[i],Before);
}
if(alignment=='r')
{
/*右对其方式,前面填充空格*/
for(i=0;i<D_value;i++)
{
strcat(After,BLANK);
}
strcat(&After[i],Before);
}
printf("%s\n",Af
a1e5
ter);
printf("\n");
}

void Menu(void)
{
printf("f) change font		s) change size		a) changge alignment\n");
printf("b) toggle bold		i) toggle italic	u) toggle underline\n");
printf("q) quit\n");
}

void endline(void)
{
int ch;
while((ch=getchar())!='\n')
continue;
}

7.编写一个与练习6所描述的功能相同的程序,使用一个unsigned long来保存字体信息,使用位运算符而不是位成员来管理这些信息。

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

#define MASK_ID 0x3ff00
#define MASK_SIZE 0x380ff

const char *ALIGNMENT[3]={"left ","center ","right "};
const char *onoff[2]={"off ","on "};
const char *TITLE="ID SIZE ALIGNMENT B I U";
const char *BLANK=" ";
const int TITLELEN=strlen(TITLE);

void Menu(void);
void endline(void);
void show(unsigned long set,char alignment);

int main(void)
{
int mask=01;
unsigned long set=3073;
char alignment='l';
char choice;
show(set,alignment);
Menu();

printf("Enter a label to perform process (q to quit):\n");
choice=getchar();
endline();
while(choice!='q')
{
switch(choice)
{
int value;
case 'f':
printf("Enter Font ID (0~255):\n");
/*检查输入合法性*/
while(scanf("%d",&value)!=1 || value<0 || value>255)
{
endline();
printf("Illegal input.Please enter a number (0~255):\n");
}
endline();
/*ID位于0~7位。先清零*/
set=set&MASK_ID;
/*设置ID的值*/
set=set|value;
break;

case 's':
printf("Enter Font size (0~127):\n");
/*检查输入合法性*/
while(scanf("%d",&value)!=1 || value<0 || value>127)
{
endline();
printf("Illegal input.Please enter a number (0~127):\n");
}
endline();
/*SIZE位置0*/
set=set&MASK_SIZE;
/*设置SIZE位的值*/
value<<=8;
set=set|value;
break;

case 'a':
printf("Select alignment:\n");
printf("l) left		c)center	r)right\n");
alignment=getchar();
endline();
while(alignment!='l'&&alignment!='c' &&alignment!='r')
{
printf("Illegal input.Please enter a character like l or c or r:\n");
alignment=getchar();
endline();
}
break;

case 'b':
mask=01;
mask=mask<<15;
set=set^mask;
break;

case 'i':
mask=01;
mask=mask<<16;
set=set^mask;
break;

case 'u':
mask=01;
mask=mask<<17;
set=set^mask;
break;

default :
printf("Enter right labels.\n");

}

show(set,alignment);
Menu();
printf("Enter a label to perform process (q to quit):\n");
choice=getchar();
endline();
printf("%ld\n",set);
}

}

void Menu(void)
{
printf("f) change font		s) change size		a) changge alignment\n");
printf("b) toggle bold		i) toggle italic	u) toggle underline\n");
printf("q) quit\n");
}

void endline(void)
{
int ch;
while((ch=getchar())!='\n')
continue;
}
void show(unsigned long set,char alignment)
{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: