实验作业
1.输入课本各个例题,调试运行程序,并分析程序,将每一个程序改写2到3个版本,自己分析程序结果,然后再调试运行,核对分析结果的对错。
2.编写程序输入一个三角形的三条边,计算其面积和周长;
3.编写程序计算并输出课本本章习题3表达式的值并分析结果。
4.编写一个程序,输入一个一元二次方程的三个系数,并计算其方程的解,然后输出。
5.编写程序,自己确定一个加密算法,将自己的音标姓名(英文)加密,并输出加密后结果,请注释你的加密算法。
6.在一个自动控制设备中,控制字位数16位,控制设备产生机械动作(如削,压等)的是指令字的低8位,其中保护强制停机动作的控制命令是低8位是全为0,控制报警声音是指令的高第1位,0为报警,1为不报警。请编写程序,在紧急状况启动时,向控制器输入控制指令。
7.积累调试程序经验,收集错误信息原因(每个同学收集3-5条错误信息原因,并输入电脑形成文字)。
课本例题1:
#include "stdafx.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"numerb of bytes in int is "<<sizeof(int)<<endl;
cout<<"numerb of bytes in long int is "<<sizeof(long)<<endl;
cout<<"numerb of bytes in shott int is "<<sizeof(short)<<endl;
cout<<"numerb of bytes in float is "<<sizeof(float)<<endl;
cout<<"numerb of bytes in double is "<<sizeof(double)<<endl;
cout<<"numerb of bytes in long double is "<<sizeof(long double)<<endl;
cout<<"numerb of bytes in char is "<<sizeof(char)<<endl;
return 0;
}
运行结果:4,4,2,4,8,8,1。
课本例题2:
// 课本第二章.cpp : 定义控制台应用程序的入口点。
//功能:布尔类型使用举例
#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
bool a=true;
cout<<a<<endl;
cout<<boolalpha<<a<<endl;
cout<<a+5<<endl;
a=0;
cout<<"执行语句a=0;后a的值为:"<<boolalpha<<a<<endl;
a=0.0;
cout<<"执行语句a=0.0;后a的值为:"<<a<<endl;
cout<<"执行语句a=0.0;后a的值为:"<<boolalpha<<a<<endl;
return 0;
}
与书上所描述的不同,1处输出不为实型,2处也不是"true"!这是怎么回事呢?
程序3
// 课本第二章.cpp : 定义控制台应用程序的入口点。
//功能:赋值语句表达式语句的运用
#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a,b,c,d,t;
a=4;
b=a;
a=5;
c=d=6;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl;
c*=a;
d%=a+b;
//等价于:
//d=d%(a+b);
t=a; //交换a b的值
a=b; //
b=t; //
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl;
return 0;
}
经验证,对于表达式a=a%b;若b>a,则结果为a=a;
程序4
// 课本第二章.cpp : 定义控制台应用程序的入口点。
//功能:数据溢出举例
#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
short a,b,c,d;
char i,j;
a=1000;
b=1000;
c=a+b;
d=a*b;
i=a;
j=125;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl; //
cout<<"i="<<i<<endl; //
cout<<"j="<<j<<endl;
return 0;}
程序5:
// 课本第二章.cpp : 定义控制台应用程序的入口点。
//功能:强制类型转换
#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
int ab,bc;
double b=3.14;
char c='A';
ab=int(b);
bc=int(c);
cout<<"b="<<b<<endl;
cout<<"ab="<<ab<<endl;
cout<<"c="<<c<<endl;
cout<<"bc="<<bc<<endl;
return 0;
}
// 课本第二章.cpp : 定义控制台应用程序的入口点。
//功能:已知三角形三边求面积和周长
#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double a,b,c,S,P,t;//a,b,c为三边,S为面积,P为周长
char key=1,exit,K;
while(key)
{
cout<<"请分别输入三角形的三个边:"<<endl;
cin>>a>>b>>c;
P=a+b+c;
t=P/2;
S=sqrt(t*(t-a)*(t-b)*(t-c));
cout<<"该三角形的面积为:"<<S<<endl
<<"该三角形的周长为:"<<P<<endl;
K=1;
cout<<"是否计算下一个?enter:Y or N"<<endl;
while (K)
{
cin>>exit;
if(exit=='Y'||exit=='y')
{key=1;K=0;}
else if(exit=='N'||exit=='n')
{key=0;K=0;}
else
cout<<"无效按键,按N结束,按Y计算下一个"<<endl;
}
}
return 0;
}
// 课本第二章.cpp : 定义控制台应用程序的入口点。
//功能:已知三角形三边求面积和周长
#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double a,b,c,S,P,t;//a,b,c为三边,S为面积,P为周长
char key=1,exit,K;
while(key)
{
cout<<"请分别输入三角形的三个边:"<<endl;
cin>>a>>b>>c;
if((a+b<c)||(a+c<b)||(b+c<a)) //判断条件
cout<<"输入错误,这三个数不能构成三角形"<<endl;
else
{
P=a+b+c;
t=P/2;
S=sqrt(t*(t-a)*(t-b)*(t-c));
cout<<"该三角形的面积为:"<<S<<endl
<<"该三角形的周长为:"<<P<<endl;
}
K=1;
cout<<"是否计算下一个?enter:Y or N"<<endl;
while (K)
{
cin>>exit;
if(exit=='Y'||exit=='y')
{key=1;K=0;}
else if(exit=='N'||exit=='n')
{key=0;K=0;}
else
cout<<"无效按键,按N结束,按Y计算下一个"<<endl;
}
}
return 0;
}
执行效果
3.课本习题3
// xiti31.cpp : 定义控制台应用程序的入口点。
//课本习题3.(1)(2)编成一个了
#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int e=1,f=4,g=2,a=7;
float m=10.5,n=4.0,k;
float x=2.5,y=4.7,z;
k=(e+f)/g+sqrt((double)n)*1.2/g+m;
//(e+f)/g=2,
//sqrt((double)n)=2.0,
//sqrt((double)n)*1.2/g=1.2;
//k=2+1.2+10.5
z=x+a%3*(int(x+y)%2)/4;
//括号优先int(x+y)=7,
//int(x+y)%2=1,
//a%3=1,
//a%3*(int(x+y)%2)=1,
//a%3*(int(x+y)%2)/4=0,
//z=x+a%3*(int(x+y)%2)/4=2.5+0=2.5
cout<<"k="<< k<<endl
<<"z="<<z<<endl;
return 0;
}
4.编写一个求一元二次方程的程序
// jieercifangc1.cpp : 定义控制台应用程序的入口点。
/**********************************
**输入一元二次方程的系数求解方程***
**可以输出虚数! ! ! ! ! ! ! ! ! **/
#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double a,b,c,x1,x2,t,Re,Im;
cout<<"请分别输入方程二次项、一次项、常数项系数"<<endl;
cin>>a>>b>>c;
t=b*b-4*a*c;
//可以使用幂函数pow(),
//t=pow(b,2)-4*a*c;
if(t>=0)
{
x1=(-b+sqrt(t))/(2*a);
x2=(-b-sqrt(t))/(2*a);
cout<<"x1="<<x1<<endl
<<"x2="<<x2<<endl;
}
else
{
Re=(-b)/(2*a);
Im=sqrt(-t)/(2*a);
cout<<"X1="<<Re<<"+"<<Im<<"i"<<endl;
cout<<"X2="<<Re<<"-"<<Im<<"i"<<endl;
}
return 0;
}
5.确定一个加密算法,将自己的音标姓名(英文)加密,并输出加密后结果
#include "stdafx.h"
#include<iostream>
#include<cstring>
using namespace std;
#define uchar unsigned char
void jiami(uchar s);
int _tmain(int argc, _TCHAR* argv[])
{
uchar i,k;
char xm[20];
cout<<"请输入您的英文名"<<endl;
cin.get(xm,20);
k=strlen(xm);
for(i=0;i<k;i++)
jiami(xm[i]);
cout<<endl;
return 0;
}
void jiami(uchar s)
{
uchar a,b;
a=~s;
b=a+2;
cout<<b;
}
取反后加2,不能使用其他位运算符,否则会使结果混乱,例如0xfe和0xff右移一位,结果是相同的。当然,可以使用循环位移函数。
改进程序,加密并解密:
// jiamijiemin1.cpp : 定义控制台应用程序的入口点。
//设计算法加密和解密
#include "stdafx.h"
#include<iostream>
#include<cstring>
using namespace std;
#define uchar unsigned char
uchar jiami(uchar s); //加密函数
uchar jiemi(uchar s); //解密函数
uchar _crol_ (uchar a,int b);//自定义循环左移函数
uchar _cror_ (uchar a,int b);//自定义循环右移函数
int main()
{
uchar i,k,mima,yuanma;
char xm[20]; //姓名存放数组
char jxm[20]; //解码字符存放数组
cout<<"请输入您的英文名"<<endl;
cin.get(xm,20);
k=strlen(xm);
cout<<"加密之后:";
for(i=0;i<k;i++)
{
mima=jiami(xm[i]);
cout<<mima;
jxm[i]=mima;
}
cout<<endl;
cout<<"解密效果:";
for(i=0;i<k;i++)
{
yuanma=jiemi(jxm[i]);
cout<<yuanma;
}
cout<<endl;
return 0;
}
uchar jiami(uchar s)
{
uchar a,b;
a=~s; //先求反码
a=_crol_(a,3);//循环左移3位
b=a+5;
a=_cror_(b,2);//加5后循环右移2位
b=~a; //再求反码
return b; //返回b
}
uchar jiemi(uchar s) //解密函数,算法与加密相反即可
{
uchar a,b;
a=~s;
a=_crol_(a,2);
b=a-5;
a=_cror_(b,3);
b=~a;
return b;
}
uchar _crol_ (uchar a,int b)
{
uchar i,j,k,m;
for(i=0;i<b;i++)
{
j=a&0x01;
if(j)
k=1;
else
k=0;
m=a>>1;
if(k)
a=m|0x80;
else
a=m|0x00;
}
return a;
}
uchar _cror_ (uchar a,int b)
{
uchar i,j,k,m;
for(i=0;i<b;i++)
{
j=a&0x80;
if(j)
k=1;
else
k=0;
m=a<<1;
if(k)
a=m|0x01;
else
a=m|0x00;
}
return a;
}
效果如图:
6.设计一个程序控制设备
// Cokzg1.cpp : 定义控制台应用程序的入口点。
//输出一个控制信号,使设备急停的程序
#include "stdafx.h"
#include<iostream>
#include <bitset>
using namespace std;
int main()
{
short a,b;
cout<<"信号输入(输入一个两位数,可以是字母)"<<endl;
cin>>a;
cout<<bitset<16>(a)<<endl;//看看a的二进制数是什么样的,方便对照结果
b=0xff00; //1111111100000000
a=a&b; //按位与之后a的高8位不变,低8位全为0,能急停,是否报警
//得看输入的信号,若急停时必须报警,只需将b的高1位改为0,即0xfe00
//若不需要报警,即高一位必须为1,只需将结果与0x0100按位或再赋值给a
//b=0x0100;
//a=a|b;
cout<<"a="<<a<<endl; //这是十进制数
cout<<bitset<16>(a)<<endl; //输出二进制看看是否符合要求
return 0;
}
结果如图
7.错误信息收集
1.\visual studio 2012\c++编程\jiami1\jiami1\jiami1.cpp(29): error C4716: “jiami”: 必须返回一个值
2.