题目:将一个正整数转换成二进制数据
程序分析:将一个十进制数转换为二进制,要将十进制数不断除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--)//倒序输出数组a,m的初值为15
{
printf("%d",a[m]);
if(m%4==0)
printf(" ");
}
printf("/n");
}
题目:将一个n进制的数转换为十进制
程序分析:因为是n进制数,如果大于10,,则表示时要用到A、B、C……这样的字符,所以要用字符数组来存放输入的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) | 4(2) | 5(1) | 规律 |
空格数 | 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");
}
}