第二章 基本数据结构和运算
C++程序设计
第二章 基本数据结构和运算
依然是不太熟悉的点:
1、所谓算法:就是一些要执行的操作,他们描述了如何求解一个问题,这些操作的执行次序在算法中应描述清楚。
2、数据结构包括数据的表示和数据的处理两方面。
3、可以用一条语句来读入多个变量:
Std::cin>>x1>>x2>>x3;
4、除了使用命名空间可以简化cin的写法还有一种方式:
using std::cout;
using std::cin;
using std::endl;
这种情况下后面也是可以直接写cout cin endl的。
5、关于标识符:理论上一个标识符可以是任意长,但我们使用的具体的C++编译器可能会有限制,使用31个字符或者更短的标识符可保证程序的可移植性。
6、不要使用以下划线开头的标识符,以免混淆,因为C++编译器可能为一些内部实体使用了这类名字。
7、数据类型的同义表示:
类型名 同义表示
类型名 |
同义表示 |
Short |
Short int |
Unsigned short |
Unsigned short int |
Unsigned int |
Unsigned |
Long |
int |
Unsigned long |
Unsigned long int |
8、浮点型文字常量还可以用科学计数法来标识,例如1.23456e+2等价于1.23456e2等价于1.23456*,而1.23456e-2等价于 1.23456*
9、浮点数这个名称的由来:1、小数点型的数值用科学计数法来表示2、举例50.534e1转换成科学计数法时 小数点的位置进行浮动。
10、两种类型转换的方式:
Int i = (int) 4.5;
等价于:
Int i = static_cast<int>4.5;
两种形式是等价的,所以看书还是靠谱一些,买靠谱的书真的还比较靠谱。读书还是比较靠谱。
11、怎么把数字保留两位小数输出,比如这个数字是11.853。
Float f = 11.853f;
f4out = static_cast<int>(f*100)/100.0;
11.853*100 = 1185.3强制转换成1185 然后除以100.0 得到11.85。这样一种形式
12、很实用的例子,计算每月还贷金额:
月利率 = 年利率/12。
13、给一个钱数算他是怎么来的比如123.4,就有1个100,1个20,3个1块和4个1毛组成。找零的时候格外有用。
14、计算时间的。Ctime头文件中的time(0)函数,返回字格林威治标准时间1970年1月1日00:00:00至当前时刻所流式的秒数,格林威治标准时间1970年1月1日00:00:00称为UNIX纪元(unix epoch),因为unix操作系统正是1970年正式推出的。
看来果然应该多读书。原来整的应该多读书。
习题:
2.1下面那些标识符是合法的?
X,x,a++,--a,4#R,$4,#44,apps
X,x还有apps是合法的。
2.2下面哪些是C++关键字?
Main,include,int,x,y,radius
Include int 是关键字。
2.3将下面的为代码转换为C++代码:
步骤1:声明一个名为miles的double型便令,设置其初值为100.
步骤2:声明一个名为MILE_TO_KILOMETER、值为1.609的double型常量。
步骤3:声明一个名为kilometer的double型变量,将miles乘以MILE_TO_KILEMETER的结果赋予kilometer.
步骤4:在控制台显示kilometer的值。
double miles = 100;
const double MILE_TO_KILOMETER = 1.609;
doubel kilometer = miles * MILE_TO_KILOMETER;
std::cout<<kilometer<<endl;
2.4使用常量有什么好处?声明一个名为SIZE、值为20的int型的常量。
常量的出现,是为了使用方便,并且防止在程序中不小心而产生的修改。同时增加了程序的可读性。
static const int SIZE = 20;
2.5假定已有语句int a = 1和double d = 1.0,而且下面的每个表达式都是无关的,则每个表达式的结果是什么?
a = 46/9;//5
a = 46%9+4*4-2;//15
A = 45+43%5*(23*3%2);//48
A %=3/a+3;//4 做错了!!!这个是1.
D = 4+d*d+4;//9.0
D+=1.5*3+(++a);//7.5
D-=1.5*3 +a++;//-4.5
*/% 是一个运算级别的。
2.6给出下列表达式的结果
56%6//2
78%-4//2
-34%5//-4
-34%-5//-4
5%1//0
1%5//1
对于模出来的结果,是正还是负,取决于被模数,是正还是负。为正 结果为正,为负,结果为负。
应该是一个放之四海皆准的结果。
2.7查看一下在你的计算机上,short、int、long、float、和double的大小:
2 4 4 4 8
2.8 25/4的结果是多少?如果想要一个浮点数的结果,该如何重写这个表达式?
6,static_cast<double>25/4
2.9下面的语句正确吗?如果正确,给出输出结果?
cout<<”the output for 25/4 is ”<< 25/4 <<endl;
cout<<”the output for 25/4.0 is “<< 25/4.0 <<endl;
2.10将下面的算数表达式转换为C++表达式。
4/(3*(r+34))-9*(a+b*c)+(3+d*(2+a))/(a+b*d)
2.11下面那些叙述是对的?
A.C++中,任何表达式都可以作为语句使用。
B.表达式x++可以作为一个语句使用
C.语句x=x+5 也是一个表达式
D.语句 x= y = x = 0 是非法的
全对的。
2.12下面哪些是正确的浮点数文字常量?
12.3,1.23e+2,23.4e-2,-334.4,20,39F,40D
这个所谓浮点数文字常量,就是我们常说的浮点型:有两种,一种是小数点的,还有一种是科学计数法的,所以前四个都是浮点数文字常量。
2.13找出并修正下面代码中的错误。
#include <iostream>
Using namespace std;
Int main(){
Int i = k+1;//k没有定义
Cout<<i++<< << endl;//这中间不能这么写
Int i = 1;//重复定义
Cout<< i++ << << endl;//这中间不能这么写
Return 0;
}
2.14 在一个运算中,不同类型的数值可以一起使用吗?
可以
2.15 讲一个double型变量显式转换为int型,double值的小数部分如何处理?类型转换会改变要转换的变量的值么?
被截断,不会。
2.16给出如下代码的输出结果:
Double f = 12.5F;
Int i = f;
Cout<< “f is “<< f <<endl;//12.5
Cout<<” i is “<< i << endl;//12
2.17 使用打印语句输出字符’1’,’A’,’B’,’a’和’b’的ASCII编码。使用打印语句输出十进制ASCII编码40,59,79、85和90对应的字符。使用打印语句输出十六进制ASCII编码40,5A,71.72 和7A对应的字符。
1--49,A--65,B--66,a--97,b--98
40--’<’,59--’;’,79--’O’,85--’U’,90--’Z’
0x40--’@’,0x5A--’Z’,0x71--’q’,0x72--’r’,0x7A--’z’
2.18下面那些是正确的字符型文字常量?
‘1’,’\t’,’&’,’\b’,’\n’
都是吧
2.19如何显示出字符\和”?
\\ 和 \”
2.20 对下面代码中的表达式求值:
Int i = ‘1’;//48
Int j = ‘1’+’2’;//97
Int k = ‘a’;//97
Char c = 90;//z
2.21 下面的类型转换是否合法?如果合法,求出转换结果。
Char c = ‘A’;
Int i = c;//65
Float f = 1000.34f;
Int i = f;//1000
Double d = 1000.34;
Int i = d;//1000
Int i = 97;
Char c = i;//’a’
2.22如何得到当前时间的分钟值?
这个例子还是蛮有意思的:
用了半个小时弄懂这个问题还是值得的。
百度结果:
#include <iostream>
#include <ctime>
using namespace std;
int main(){
int totalSeconds = time(0);//得到从1970年1月1日到现在的秒数。
int currentSecond = totalSeconds % 60;//当前秒=总秒数%60.
int totalMinutes = totalSeconds / 60;//总分钟数 = 当前秒数/60
int currentMinute = totalMinutes % 60;//当前分钟数 = 总分钟数%60
int totalHours = totalMinutes / 60; //总分钟数/60= 当前小时数
int currentHour = totalHours % 24+8;//这个结果几次出来都是2想到时区问题了,但是想的方式不对,没出结果,
//现在是早上10点,几次输出的都是2。百思不得解,这个返回的是0时区的时间,北京也就是现在呆的地方时东8区,应该+2,所以,得到结果了。
cout << currentHour << ":" << currentMinute << ":" << currentSecond << endl;
system("pause");
return 0;
}
2.23如何表明程序中一行或一个段落是注释?
以//开头的一行或半行,或者以/**/ 包裹的段落中的内容就是注释。
2.24常量和变量的命名习惯是什么?根据命名习惯,下面那些项可以作为常量或变量的名字?
MAX_VALUE,Test,read,readInt
常量通常全部大写,并且在表示复杂意义时,多个单词之间用_连接
变量通常小写,在表示复杂意义是,多个单词使用驼峰式写法
MAX_VALUE 估计是常量
Test 估计是类名
read 估计是变量名
readInt 估计是函数名或者变量名
2.25 根据程序设计风格和文档编写的原则重新整理下面程序的格式。
#include <iostream>
using namespace std;
int main(){
cout << “2 % 3 = “<<2 % 3;
return 0;
}
2.26 描述什么是语法错误,运行时错误和逻辑错误。
语法错误就是在编译阶段会进行提示的错误,通常是由于,类型不一致,括号不匹配。等等原因,这种错误是会在集成开发环境中被提示的错误,属于比较容易处理的错误。
运行时的错误,是属于 在运行时程序会出现的错误,属于较难的错误。比如数组下标越界,除零异常,快速迭代异常,等错误。
逻辑错误通常是很困难的错误,那里哪里都对,可就是结果不对,比如刚刚出现的时区问题,这个既不属于语法错误,也不属于运行时的错误,但是2跟10的结果相去甚远。属于逻辑层面的问题,想到的话就很容易解释,想不到的话,就很麻烦。
程序设计练习
2.1(将摄氏温度值转换为华氏温度值)编写程序,读入一个double型的摄氏温度值,将其转换为华氏温度值并显示结果。转换公式如下:
fahrenheit = (9/5)* celsius+32
#include <iostream>
using namespace std;
int main(){
cout << "输入摄氏温度" << endl;
int celsius = 0;//selsiəs 音标。。。
cin >> celsius;
cout << "对应的华氏温度为:"<<celsius*9.0/5+32 << endl;
system("pause");
return 0;
}
2.2
#include <iostream>
//计算圆柱体体积 底面积*高
//底面积 = PI * R*R
#define PI 3.14159
using namespace std;
double getVolumeOfCylinder(double radius,double height){
if (radius>=0&&height>=0)
return PI*radius*radius*height;
}
int main(){
double radius = 0;
double height = 0;
cout << "输入圆柱体的半径" << endl;
cin >> radius;
cout << "输入圆柱体的高" << endl;
cin >> height;
cout << "圆柱体体积:" << getVolumeOfCylinder(radius, height) << endl;
system("pause");
return 0;
}
2.3
#include <iostream>
using namespace std;
//英尺转换为米,一英尺 = 0.305米 一英镑我记得=0.47365kg 所以基本上一英镑就是一斤。
//哦?34都有,写一起吧
double getMeter(double inch){
return inch*0.305;
}
double getKilogram(double pounds){//不过书上说是 1英镑 = 0.454kg。
return pounds *0.454;
}
int main(){
double inch = 0;
cout << "输入一个英寸值" << endl;
cin >> inch;
cout << inch << "对应的米的值为:" << getMeter(inch) << endl;
double pounds = 0;
cout << "输入一个英磅值" << endl;
cin >> pounds;
cout << pounds << "对应的公斤的值为:" << getKilogram(pounds) << endl;
system("pause");
}
2.5
#include <iostream>
using namespace std;
/*
不同于我国的消费习惯,外国有小费这个概念。
所以再买东西的时候我们要加一个小费费率以得到一个总的付款金额
*/
double realPay(double totalPurchase, double rate){
return totalPurchase*(1 + rate / 100);
}
int main(){
cout << "请输入购买物品的金额" << endl;
double totalPurchase = 0;
cin >> totalPurchase;
cout << "请输入小费费率,(如果是15.3%,请输入15.3)" << endl;
double rate = 0;
cin >> rate;
cout << "总花费金额为:" << realPay(totalPurchase, rate) << endl;
system("pause");
return 0;
}
2.6
关键是绘画这个图,写程序什么的其实都简单。
#include <iostream>
using namespace std;
//将一个整数中的所有数字相加 ,范围是0-1000
int getSurfaceSum(int number){
int sum = 0;
while (number>0){
sum += number % 10;
number /= 10;
}
return sum;
}
int main(){
int number = 0;
cout << "请输入一个(0-1000)的整数,计算它的每个数字之和" << endl;
cin >> number;
cout << "数字和为: "<<getSurfaceSum(number) << endl;
system("pause");
return 0;
}
2.7
#include <iostream>
using namespace std;
/* 将大写字母转化为小写字母*/
char toLowerCase(char a){
return a + 97 - 65;
}
int main(){
cout << "请输入一个大写的英文字符,将会转化成小写" << endl;
char c = 0;
cin >> c;
cout << "转化后的结果:" << toLowerCase(c) << endl;
system("pause");
return 0;
}
2.8
#include <iostream>
using namespace std;
/*求对应字符*/
char getCounterpartChar(int a){
return a;
}
int main(){
cout << "输入0-128之间的数字,得到对应的ASCII码" << endl;
int number = 0;
cin >> number;
cout << "对应的ASCII码是: " << getCounterpartChar(number) << endl;
system("pause");
return 0;
}
2.9
所以改成int类型的数值。
#include <iostream>
using namespace std;
/* 找零程序,不要想得太多太复杂,先把框架搭起来实现了,然后再具体而微。不能一下就做成什么样子的。
这个程序现在做就是了解一下那个时候的美元的货币币值,
或者想象成是在就是外国人要这样开发,就这几种币值。
给出11.56 输出11个1美元,2个25美分,0个10美分,1个5美分,1个1美分
*/
void getDetails(double money){
int dollarsCount = static_cast<int>(money);
int centsPart = static_cast<int>((money - dollarsCount) * 100);//56
int quartersCount = centsPart / 25;//2
int dimesCount = (centsPart - quartersCount * 25)/10;//0
int nickelsCount = (centsPart - quartersCount * 25 - dimesCount * 10) / 5;
int pennies = (centsPart - quartersCount * 25 - dimesCount * 10) % 5;
cout << "旧版 your amout " << money << "consists of" << endl
<< dollarsCount << " dollars" << endl
<< quartersCount << " quarters" << endl
<< dimesCount << " dimes" << endl
<< nickelsCount << " nickels" << endl
<< pennies << " pennies" << endl;
}
void getDetails(int money){
int dollarsCount = money/100;
int centsPart = money%100;//56
int quartersCount = centsPart / 25;//2
int dimesCount = (centsPart - quartersCount * 25) / 10;//0
int nickelsCount = (centsPart - quartersCount * 25 - dimesCount * 10) / 5;
int pennies = (centsPart - quartersCount * 25 - dimesCount * 10) % 5;
cout << "新版 your amout " << money << "consists of" << endl
<< dollarsCount << " dollars" << endl
<< quartersCount << " quarters" << endl
<< dimesCount << " dimes" << endl
<< nickelsCount << " nickels" << endl
<< pennies << " pennies" << endl;
}
int main(){
cout << "输入货币值比如11.56" << endl;
double money = 0;
cin >> money;
getDetails(money);
cout << "新版输入1156" << endl;
int amount = 0;
cin >> amount;
getDetails(amount);
system("pause");
return 0;
}
2.10
#include <iostream>
using namespace std;
double getInterestOfNextMonth(double loan,double interest){
return loan*(interest / 1200);
}
int main(){
cout << "计算下月利息,输入本金:比如100000" << endl;
double balance = 0;
cin >> balance;
cout << "年利率:比如8.25" << endl;
double interest = 0;
cin >> interest;
cout << "下月利息" << getInterestOfNextMonth(balance, interest) << endl;
system("pause");
return 0;
}
2.11
#include <iostream>
using namespace std;
double getfutureValue(double investmentAmount,double interestRate,double numberOfYears){//年利率转化成月利率
//输入的是一个 类似于3.25 的数值,/100 得到百分数形式的 /12 得到月利率。
//return pow(investmentAmount*(1 + interestRate / 1200), numberOfYears*12);
return investmentAmount*(pow(1 + interestRate / 1200, numberOfYears * 12));
}
int main(){
cout << "计算投资未来价值" << endl;
cout << "投资总额,比如1000" << endl;
double money = 0;
cin >> money;
cout << "年利率,比如3.25" << endl;
double rate = 0;
cin >> rate;
cout << "投资年限,比如1年" << endl;
double year = 1;
cin >> year;
cout << "未来价值: " << getfutureValue (money,rate,year)<< endl;
system("pause");
return 0;
}
2.12
#include <iostream>
using namespace std;
#define annualInterest 5.0
#define monthlyInterestRate annualInterest/1200 //1200 是12*100,12代表月份,100 是由于利率通常说的时候只有小数点,没有%。所以单独除一个。
double getAccountMoney(int month){
double root = 0.0;
double finalMoney = 0.0;
while (month--){
root += 100.0;//200.417
//printf("%f\n", root);
finalMoney = root*(1 + monthlyInterestRate);//100.417
root = finalMoney;
}
return finalMoney;
}
int main(){
cout << getAccountMoney(3);
system("pause");
return 0;
}