C程序设计

来源:互联网 发布:域名投资技巧 编辑:程序博客网 时间:2024/05/12 10:03

 

 

题目:将一个正整数转换成二进制数据

 

程序分析:将一个十进制数转换为二进制,要将十进制数不断除2取余,一直到余数为0为止,然后,从下往上将余数写出即为其二进制形式的数。

    在程序中用一个长度为16的数组来存放二进制数(两个字节),因为是正整数所以始终最高位为0,也就是要用数组中的15个位置来存放每次取余的数据。

的应用,两侧均为整型数据。

的应用,两侧均为整型数据时所得结果为整形数据,运算中的两个数有一个数为实数,则结果是double型。

 

代码如下;

#include<stdio.h>

void main()

{

int i,j,n,m;

int a[16]={0};//定义数组a初始值为0

printf("输入一个正整数/n");

scanf("%d",&n);//输入一个正整数

for(m=0;m<15;m++)

{

i=n%2;//取余

j=n/2;//取商

n=j;//将商赋给n

a[m]=i;//将余数存入数组中

}

for(m=15;m>=0;m--)//倒序输出数组am的初值为15

{

printf("%d",a[m]);

if(m%4==0)

printf(" ");

}

printf("/n");

}

题目:将一个n进制的数转换为十进制

程序分析:因为是n进制数,如果大于10,,则表示时要用到ABC……这样的字符,所以要用字符数组来存放输入的n进制数,所以根据字符与ASCNII对照表

         如果是0~9之间的字符数据 

               t=a[i]-'0';

         如果是字母

               t=a[i]-'A'+10

代码如下:

#include<stdio.h>

#include<string.h>

void main()

{

long t1;

int i,n,t,t3;

char a[100];

printf("请输入一个数/n");

gets(a);//输入一个字符串到字符数组

strupr(a);//将字符串的小写字母换成大写字母

t3=strlen(a);//得到字符串的实际长度(不包括'/0')

t1=0;

printf("请输入该数的进制数/n");

scanf("%d",&n);

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

{

if(a[i]-'0'>=n&&a[i]<'A'||a[i]-'A'+10>=n)//判断输入的数据是否在相应的进制中

{

printf("输入的数据错误,程序结束!/n");

return;//如果不在退出程序

}

if(a[i]>='0'&&a[i]<='9')//判断是否为数字

t=a[i]-'0';

else if(n>=11&&(a[i]>='A'&&a[i]<'A'+n-10))//判断为字母

t=a[i]-'A'+10;

t1=t1*n+t;//不断乘相应的进制数

}

printf("转换为十进制后的数为:%d/n",t1);

}

 

 

 

 

 

题目:输入32位的二进制数将其转换为十进制的得到IP地址(例:192.168.1.1

 

程序分析:即为将二进制的数转换为十进制,共32为二进制数,以每8位二进制数转换为十进制

 

代码如下:

#include<stdio.h>

int bin_dec(int x,int n)//递归函数

{

if(n==0)

{

return 1;

}

return x*bin_dec(x,n-1);

}

void main()

{

int i;

int ip[4]={0};//将数组初始化为0

char a[33];//输入32为二进制数,因为最后一位为/0,所以为32

printf("请输入一个二进制数:/n");

scanf("%s",a);//输入字符串

for(i=0;i<8;i++)//得出0-7转换的结果

{

if(a[i]=='1')

{

ip[0]+=bin_dec(2,7-i);

}

}

for(i=8;i<16;i++)//得出8-15转换的结果

{

if(a[i]=='1')

{

ip[1]+=bin_dec(2,15-i);

}

}

for(i=16;i<24;i++)//得出16-23转换的结果

{

if(a[i]=='1')

{

ip[2]+=bin_dec(2,23-i);

}

}

for(i=24;i<32;i++)//得出24-31转换的结果

{

if(a[i]=='1')

{

ip[3]+=bin_dec(2,32-i);

}

if(a[i]=='/0')

break;

}

printf("/nip:/n");

printf("%d.%d.%d.%d/n",ip[0],ip[1],ip[2],ip[3]);

}

 

 

 

 

 

题目:输入一个数,在这个数以内进行加减法运算,具体要计算的两个数值由计算机随机产生,由用户输入计算后的答案,计算机根据根据输入的结果判断是否正确。

 

分析:用到rand()函数来抽取随机数,a=rand()%m的具体含义就是产生吗以内的任意随机数(不含m本身)

为了每次运行程序得到的随机序列是不相同的,需用系统时间为种子来抽取随机数即

srand((unsigned long)time(0));

 

代码如下:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

void main()

{

int a,b,c,sign,m;

char sign1;

printf("请选择运算符号:1.'-'2.'+'/n");

while(1)//无穷循环

{

scanf("%d",&sign);

if(sign==1)

{

sign1='-';

break;//选择正确的运算符号后推出循环

}

else if(sign==2)

{

sign1='+';

break;//选择正确的运算符号后推出循环

}

else

{

printf("输入错误,请重新出入/n");//选择错误,重新输入

}

}

printf("请输入一个最大数:");

scanf("%d",&m);

srand((unsigned long)time(0));//设定系统时间为种子

a=rand()%m;//产生小于m的随机数

b=rand()%m;//产生小于m的随机数

while((a<b)&&(sign==1))//当是减法操作时,a必须大于b

{

a=rand()%m;

b=rand()%m;

}

printf("/n%d%c%d=",a,sign1,b);

scanf("%d",&c);

if((sign==1)&&(a-b==c)||(sign!=1)&&(a+b==c))//判断用户输入的结果是否正确

printf("OK!/n");

else

printf("结果错误!!!/n");

}

 

 

 

题目:输入一个数n,一此数为准输出以第n行为对称的菱形,例如:输入3,输入图形

         *

   ***

  *****

   ***

*

 

 

程序分析:

n=3

n

行数(i

1

2

3

规律

空格数

2

1

0

n-i

星号数

1

3

5

2*i-1

n-1

行数(i

42

51

规律

空格数

1

2

n-i

星号数

3

1

2*i-1

其实后n-1行就是以前n行的反序输出

代码如下:

#include<stdio.h>

void main()

{

int i,j,n;

printf("请输入一个数:/n");

scanf("%d",&n);

//n

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

{

for(j=1;j<=n-i;j++)//输出每行空格,空格数为n-i

printf(" ");

for(j=1;j<=2*i-1;j++)//输出每行星号数,星号数位2*i-1

printf("*");

printf("/n");

}

//n-1

for(i-=2;i>=1;i--)/*此处i-=2的含义是上一个for循环结束后i又加了次1,再减次1//从第n+1行开始*/

{

for(j=1;j<=n-i;j++)//输出每行空格,空格数为n-i

printf(" ");

for(j=1;j<=2*i-1;j++)//输出每行星号数,星号数位2*i-1

printf("*");

printf("/n");

}

}