摧残了一个早上之后,总算把这一章的c++作业完成个百分之八十了,书里的习题是敲了又敲,争取把那些东西弄清楚,不过,有一些题目看起来没法理解,就暂时先不写了。到时再修改一下吧,来吧,展示我的成果吧
作业1
例题2.1
bool函数的最简单调用,不过,我发现了一个问题,既然在c++的运算中,把 0.0 的值赋给flag,发现程序输出的是false而不是书里所写的true,引发了我的一个疑问,double类型的0.0在bool类型中是属于非0呢还是等于0呢,希望大神能够帮我解答一下。
/***************************************
** 布尔类型的应用例子 **
** 自动化1121 李庆典 **
***************************************/
#include<iostream> //编译预处理命令
#include<iomanip> //控制符所需头文件
using namespace std; //标准名字空间
int main() //主函数
{
bool flag = true; //定义一个bool函数,并初始化为true
cout<<flag<<endl; //输出默认情况下的判断值(既1)
cout<<boolalpha<<flag<<endl; //用boolalpha控制符输出判断值(既true)
cout<<flag+5<<endl; //把bool数据当成int数据来使用
flag = 0; //对bool数据进行赋值
cout<<"执行语句flag =0 ;后,flag的值为"<<boolalpha<<flag<<endl;
flag = 1; //对bool数据进行赋值
cout<<"执行语句flag =1 ;后,flag的值为"<<boolalpha<<flag<<endl;
flag = 2; //对bool数据进行赋值
cout<<"执行语句flag =2 ;后,flag的值为"<<boolalpha<<flag<<endl;
flag = 0.0; //把bool数据赋值double数据
cout<<"执行语句flag =0.0 ;后,flag的值为"<<boolalpha<<flag<<endl;
cout<<"验证bool数据在运算过程中为int类型数据"<<endl;
return 0;
}
然后是2.2例题了
因为在其他作业上花费的时间比较多,所以,这些例题就没有多大改动,这是赋值语句的一些举例练习
/****************************************************
** 赋值语句以及赋值表达式的使用 **
** 自动化1121 李庆典 **
****************************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int a,b,c,d;
a=4;
b=a;
a=5;
c=d=6;
c*=a; //c=c*a
d%=a+b; //d=d%(a+b)
cout<<"a = "<<a<<endl //输出结果
<<"b = "<<b<<endl
<<"c = "<<c<<endl
<<"d = "<<d<<endl;
system("pause");
}
例题2-3
讲了一下数据溢出情况的一些不正常显示,所以,在我们学习c++时候,要根据实际情况来修改定义数值类型,从而防止出现因数据溢出而显示不正常的现象
/***********************************************
** 数据溢出情况 **
** 自动化1121 李庆典 **
***********************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间
int main () //主函数
{
short i,j,m,n;
i=1000;
j=1000;
m=i+j;
n=i*j;
cout<<"m = "<<m<<endl //输出
<<"n = "<<n<<endl
<<"已经溢出了short的范围,显示错误"<<endl; //n以及溢出了short的范围,显示错误
return 0;
}
例题2.4
自增自减预算符的相关运算,注意++i与i++它们之间,虽然都是自增但是在自增与运算的顺序是不同的
++i 是先自增,然后再赋值,并且它可以作为左值被赋值
而i++是先参与运算使用完了之后再对i重新自增赋值,是右值表达式
/*****************************************
** 自增自减运算符的举例(只举++) **
** 自动化1121 李庆典 **
*****************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int i=6,j,k;
j=++i; //i(6)自增后把值(7)赋给j
k=i++; //先把i(7)赋给k,然后i自增
++i=1; //++i可以作为左值被赋值,执行语句自增后重新赋值i=1
cout<<"i = "<<i<<endl
<<"j = "<<j<<endl
<<"k = "<<k<<endl;
return 0;
}
额,这道题基本上原封不动的,主要是举例讲了一下条件表达式的使用,格式为 条件?表达式1:表达式2
若是条件成立,则执行表达式1,不成立则执行表达式2
另外,此道题目也向我们描述了一个字符串转换的技巧,同一字母对应的大小写在ASCII码相差的位置是32,要想变换大小写也是一个很简单的事,不过,在我们不知道其相差位置的时候,用下面的语句来转换也是很不错的
/***************************************
** 条件运算符以及条件表达式的举例 **
** 将小写字符转换成大写字符 **
** 自动化1121 李庆典 **
***************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
char ch;
cout<<"please input a character"<<endl
<<"请输入一个字符,程序将把其转换成大写字母"<<endl;
cin>>ch;
ch = ch>= 'a'&& ch <= 'z'? ch -'a'+'A':ch;
//上述语句是对输入字符的判断以及对其的转换
cout<<"输出结果为:"<<ch<<endl;
return 0;
}
例题2.6 不写了,主要讲了自动类型的转换,
例题2.7 强制类型转换
有两种表达格式 (数据类型)表达式
数据类型(表达式)
前者是c语言使用的格式,后者是c++使用的格式,不过在实际使用中发现两种形式都是可以用的
/***************************************
** 数据类型强制转换示范 **
** 自动化1121 李庆典 **
***************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间
int main() //主函数
{
int ab ,ac;
double b=3.14;
char c='a';
ab = int(b); //将b强制转换成int类型赋给ab
ac = int(c); //将c强制转换成int类型赋给ac,输出为c的ASCII字符编号
cout<<"b = "<<b<<endl //输出
<<"ab = "<<ab<<endl
<<"c ="<<c<<endl
<<"ac ="<<ac<<endl;
return 0;
至此,作业1就完成了,都是书里的题,比较简单但是也很重要,基础这东西一定要打好,而且,一定要养成一个好习惯说不要遗漏一些分隔符啊括号之类的,虽然要是有错了我们调试编译时会提醒我们修改,但是能不错还是不要错号。
作业2
作业2是写一个程序计算三角形的面积与周长,在实际过程中,我想到了三角形的边长不仅要是正数,而且还有可能是小数,所以我用了float类型来定义输入的三角形边长:此外,我还主要到了输入的边也是需要判断是否能够构成一个三角形,所以我引入了一个条件判断语句,用“任意三角形两边之和大于第三边”这个公理来判定,若是不合适就重新输入(),这里又涉及到了一个重新输入的问题,记得在上一次的作业中,我乱七八糟的想开个玩笑,但是实在不会跳出条件循环,不过,后来我在自己买的c语言书上看到了goto这个功能很强大的函数,直接在c++里试用发现同样也可以用在我想要的目的。然后就是计算了周长还好,很容易,但是面积比较难,涉及到开方,在同学的提醒以及网上搜了一下,然后就调用了math.h文件用sqrt命令来开方,通过余弦定理来求正弦,然后在用公式s=1/2*absinc来求三角形的面积
/**********************************************
** 计算三角形的面积以及周长 **
** 自动化1121 李庆典 **
**********************************************/
#include <iostream> //预编译处理命令
#include<math.h> //数学调用符号所需头文件(网上找的)
using namespace std; //标准名字空间
int main () //主函数
{
float a,b,c,d,e; //定义一些函数
double mianji,zhouchang;
shuru: //goto语句的调用
cout<<"请输入所求三角形的三条边"<<endl; //输入三角形的三条边
cin>>a>>b>>c;
if(a+c>b&&a+b>c&&c+b>a) //判断输入的边是否构成三角形
{
d=(a*a+b*b-c*c)/(2*a*b); //求某一个角的余弦值
e=sqrt(1-d*d); //求这一个角的正弦值
mianji=0.5*a*b*e; //计算面积
zhouchang=a+b+c; //计算周长
cout<<"该三角形的面积为"<<mianji<<endl //输出结果
<<"该三角形的周长为"<<zhouchang<<endl;
goto shuru; //返回,继续下一个运算
}
else //若输入的边不构成三角形,则错误重新输入
{
cout<<"输入有错,请确认边长是否能构成三角形后重新输入"<<endl;
goto shuru;
}
return 0;
}
作业3
作业三是写程序分析一下书本的例题,然后我发现只要是建一个项目,里面至少要22mb左右的内容,其中,各种外部依赖项都要14mb,有点夸张,于是直接把两个程序糅合在一起了,反正能够运行就好了,不过,分析倒是写的少了
/****************************************************
** 第二章课后习题3的计算结果 **
** 自动化1121 李庆典 **
****************************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间
int main()
{
cout<<"为了减少C++项目的占用空间,把两道题目解答整合了"<<endl;
cout<<"请输入你想要看的题号,1或者2"<<endl;
int a; //输入题号从而查看结果
cin>>a;
if(a==1)
{ cout<<"int e=1,f=4,g=2;"<<endl //输出第一道题目
<<"float m=10.5,n=4.0,k;"<<endl
<<"k=(e+f)/g+sqrt(double(n))*1.2/g+m;"<<endl;
int e=1,f=4,g=2;
float m=10.5,n=4.0,k;
k=(e+f)/g+sqrt(double(n))*1.2/g+m;
cout<<"运算结果 = "<<k<<endl; //输出第一道题目答案
}
if(a==2)
{
cout<<"float x=2.5,y=4.7"<<endl //输出第二道题目
<<"int a=7"<<endl
<<"x+a%3*(int(x+y)%2)/4"<<endl;
float x=2.5,y=4.7;
int a=7;
cout<<"运算结果为"<<((x+a%3*(int(x+y)%2)/4))<<endl; //输出第二道题目答案
}
return 0;
}
作业4
作业4写一个程序解一元二次方程,这个也比较简单,同样需要调用math.h函数来开方,注意当△=b^2-4ac小于0时方程无实数解,这里同样需要判断结构,我还多加了一个用于判断其解是否相等。
/*************************************
** 解一元二次方程 **
** 自动化1121 李庆典 **
*************************************/
#include<iostream> //预编译处理命令
#include<math.h> //数学函数调用所需头文件
using namespace std;
int main() //主函数
{
float a,b,c,e,x1,x2;
cout<<"解一元二次方程,请输入其系数"<<endl //输入一元二次方程的系数
<<"请输入两次项系数a"<<endl;
cin>>a;
cout<<"请输入一次项系数b"<<endl;
cin>>b;
cout<<"请输入常数项系数c"<<endl;
cin>>c;
e=b*b-4*a*c; //△的运算
if(e<0) //判断该方程是否有实根
{
cout<<"该一元二次方程没有实根"<<endl;
}
else
{
x1=((-b)+sqrt(double(e)))/(2*a); //求根
x2=((-b)-sqrt(double(e)))/(2*a);
if(x1=x2) //判断是否有相同实根
cout<<"该一元二次方程只有一个解,既 x="<<x1<<endl;
else
cout<<"该一元二次方程有两个解,既 x1="<<x1
<<" x2="<<x2<<endl;
}
return 0;
}
暂时先这样吧 第5道以及第6道题还没有做呢 晚一点更新吧
来了
作业5
设计一个加密程序并对你的名字进行加密,先把这个加密程序放上来吧 这个是参考其它同学的加密程序自己改的,用到了数组(还没学,不熟),待会让老师来帮我看看我想糅合的一个兼具加密和解密的程序吧、
/**********************************************
** 输入英文名字并加密,之后解密 **
** 自动化1121 李庆典 **
**********************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间1
int main() //主函数
{
char a[25],b[25],c[25]; //定义四个一维字符型数量组
cout<<"欢迎进行名字加密与解密程序"<<endl; //加密解密选择
int i;
cout<<"请输入你要加密的名字"<<endl; //输入要加密的名字
cin.get(a,25); //从键盘获取字符
cout<<"该名字的加密成果为:"<<endl; //加密结果输出
for(i=0;i<25;i++)
{
if(a[i]==0)
{
break;
}
b[i]=a[i];
b[i]=b[i]+6;
c[i]=b[i];
cout<<c[i];
}
cout<<endl; //输出加密结果
return 0;
}
这个是糅合了加密与解密的程序,但是一直调试不成功,调试时直接跳到了最后,在老师的指导下,我终于发现了程序的错误,加了个清除缓存的代码 fflush(stdin) 在cin.get(a,25)之前,在输入之前清除缓存的数据以防止影响后面的程序,才终于使得程序编写成功并能够正确运行。
/**********************************************
** 输入英文名字并加密,之后解密 **
** 自动化1121 李庆典 **
**********************************************/
#include<iostream> //预编译处理命令
using namespace std; //标准名字空间1
int main() //主函数
{
char a[25],b[25],c[25],e[25]; //定义四个一维字符型数量组
int k;
cout<<"欢迎进行名字加密与解密程序"<<endl; //加密解密选择
cout<<"加密请输入“1”,解密请输入任意数"<<endl;
cin>>k;
if(k==1) //加密
{
//int i;
cout<<"请输入你要加密的名字"<<endl; //输入要加密的名字
fflush(stdin); //清除输入缓存
cin.get(a,25); //从键盘获取字符
// cin>>a;
cout<<"该名字的加密成果为:"<<endl; //加密结果输出
for(int i=0;i<25;i++)
{
if(a[i]==0)
{
break;
}
b[i]=a[i];
b[i]=b[i]+9; //加密方法
c[i]=b[i];
cout<<c[i];
}
cout<<endl;
}
else //解密
{
cout<<"请输入你要解密的名字"<<endl; //输入要解密的名字
fflush(stdin); //清除输入缓存
cin.get(a,25);
cout<<"该名字的解密成果为:"<<endl; //解密结果输出
for(int i=0;i<25;i++)
{
if(a[i]==0)
{
break;
}
b[i]=a[i];
b[i]=b[i]-9; //解密方法
e[i]=b[i];
cout<<e[i];
}
cout<<endl;
}
return 0;
}
在实际的程序编写中,在反复练习中才能够不断发现问题,解决问题,提高问题,不过 程序编写我觉得最重要的还是说要细心,在调试过程中积累一些编写经验。
不过,我后面写的几个程序都是调试了很多次,每一种情况都去试一下看是否对,期间也出现了很多错误然后一点一点修改,要我列举一点出来还真的不大会,因为至少得再来一个这样的篇幅我才能写完错误,就暂时不写了先o(╯□╰)o