第三周任务

实验作业

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:



程序6:

// 课本第二章.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;
}



: 2.输入三角形三个边,求周长和面积

// 课本第二章.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;
}


经反复调试终于Ok了,可以随意计算和退出,但还是不够完美,我们知道三角形两边之和大于第三边,否则不能构成三角形,所以,对于随机输入的数据,程序应该识别是否构成三角形再计算。修改后如下

// 课本第二章.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.

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值