第二章数据的存储和读入
2.1变量和变量的类型
例2.1将整数65存储到计算机内存,并且输出
#include<iostream>
using namespace std;
int main()
{
int a;
a=65;
cout<<a<<endl;
return 0;
}
2.1.1变量与变量类型概念
内存:计算机存储数据与程序的地方,主要单位有
字节Byte=8bit(位)
1KB (Kilobyte 千字节)=1024B
1MB (Megabyte 兆字节 简称“兆”)=1024KB
1GB (Gigabyte 吉字节 又称“千兆”)=1024MB
1TB (Trillionbyte 万亿字节 太字节)=1024GB
1PB(Petabyte 千万亿字节 拍字节)=1024TB
1EB(Exabyte 百亿亿字节 艾字节)=1024PB
1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024 EB
1YB (Jottabyte 一亿亿亿字节 尧字节)= 1024 ZB
1BB (Brontobyte 一千亿亿亿字节)= 1024 YB
计算机高级语言通常用变量名标识数据存储在内存的位置,同时需要指明给变量名所在空间开辟多大的空间。那么,应该依据什么开辟空间的大小呢?高级语言把数据进行分类,称之为数据类型,在使用变量,需要定义变量的数据类型,系统依据定义的数据类型,给变量分配内存空间。例如,上例中a是int表示该数据类型为整型的空间,该整型空间占用4字节,允许放在a中的数据为-2147483648~2147483647范围内的整数。
例2.2阅读下列程序的运行结果,说一说变量a的作用
#include<iostream>
using namespace std;
int main()
{
int a;
a=65;
cout<<a<<endl;
a=100;
cout<<a<<endl;
return 0;
}
2.1.2变量名
在计算机语言中变量表示某个存储数据空间的名称,因此,命名时要遵守一定的规则
(1)只能出现字母,数字或下划线
(2)第一个字符不能是数字
(3)不能是C++关键字
(4)区分大小写
例2.3合法变量的认识
(A) int (B) 10days (C) my_book (D) us$D.count
变量定义的作用是,在内存中开辟一个类型标识符指定类型的空间,用变量名标识。
C++语言中,数据存入变量前,首先要定义变量
变量的定义格式如下
类型标识符 变量名1,变量名2,….,变量名n;
变量定义的两个关键要素是数据类型与变量名。
例2.4将实数65.5存储到计算机内存变量a中,并且输出
#include<iostream>
using namespace std;
int main()
{
float a;
a=65.5;
cout<<a<<endl;
return 0;
}
例2.5将字符'A'存储到计算机内存变量a中,并且输出
#include<iostream>
using namespace std;
int main()
{
char a;
a='A';
cout<<a<<endl;
return 0;
}
例2.6求长为7.5cm,宽为10.6cm的矩形面积,要求先将矩形长和宽分别存储到变量x,y中
#include<iostream>
using namespace std;
int main()
{
float x=7.5;
float y=10.6;
cout<<"Area of a rectangle"<<x*y<<endl;
return 0;
}
2.2赋值语句与数学表达式
例2.7求半径为7cm的圆面积
#include<iostream>
using namespace std;
int main()
{
float radius;
float area;
radius=7;
area=3.1415926*radius*radius;
cout<<"Circula area="<<area<<endl;
return 0;
}
为什么这里radius和area的类型是float,能不能为int,为什么?
2.2.1赋值语句
格式:变量 赋值运算符 表达式
赋值语句作用是,将运算的结果放到变量中存储起来。
赋值运算符用于对变量进行赋值,分为简单赋值(=),复合算术赋值(+=,-=,*=、/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共11种。
例2.8阅读下列程序,理解赋值语句
#include<iostream>
using namespace std;
int main()
{
int a=5;
cout<<a<<endl;
a=a+2;
cout<<a<<endl;
a=a+5;
cout<<a<<endl;
return 0;
}
例2.9阅读下列程序,理解复合算术赋值的功能
#include<iostream>
using namespace std;
int main()
{
int a,b;
a=b=3;
cout<<a<<" "<<b<<endl;
a+=b;
cout<<a<<" "<<b<<endl;
return 0;
}
说明:c++支持连等号赋值的表达形式,a+=b与a=a+b等效,前者执行速度比后者快。
例2.10编程实现两个变量x,y之间值的交换
方法一
#include<iostream>
using namespace std;
int main()
{
float x,y;
x=10.5;
y=30.6;
cout<<x<<" "<<y<<endl;
x+=y;y=x-y;x-=y;
cout<<x<<" "<<y<<endl;
return 0;
}
方法二
#include<iostream>
using namespace std;
int main()
{
float x,y,t;
x=10.5;
y=30.6;
cout<<x<<" "<<y<<endl;
t=x;x=y;y=t;
cout<<x<<" "<<y<<endl;
return 0;
}
2.2.2变量的自增与自减
C++语言中整型或浮点型变量的值加1可以使用自增运算符”++”。
有两中用法
用法1:变量名++;
用法2:++变量名;
这两种用法都能使变量的值加1,但它们是有区别的。
例2.11阅读下列程序,说一说变量自增两种用法的区别
#include<iostream>
using namespace std;
int main()
{
int n1,n2=5;
n2++;
cout<<n2<<endl;
++n2;
cout<<n2<<endl;
n1=n2++;
cout<<"n1="<<n1<<"n2="<<n2<<endl;
n1=++n2;
cout<<"n1="<<n1<<"n2="<<n2<<endl;
return 0;
}
2.2.3程序中的数学表达式
数学表达式由数据,变量,运算符,数学函数,括号组成,程序跌数学表达式需要用语言能够接受的运算符和数学函数表示。
例2.12已知a=5.5、b=6.7、c=9.3,编程求式子
#include<iostream>
using namespace std;
int main()
{
float a,b,c,f;
a=5.5;
b=6.7;
c=9.3;
f=(-b+4*a*c)/(2*a);
cout<<f<<endl;
return 0;
}
例2.13涨工资
#include<iostream>
using namespace std;
int main()
{
float x;
float y;
x=sqrt(5290.0/4000.0)-1;
y=5290*(1+x);
cout<<"2015年月工资为:"<<y<<"元";
return 0;
}
*例2.14求路程
#include<iostream>
using namespace std;
int main()
{
float v0=40/3.6,a=0.15;
int t=120;
float vt,s;
vt=v0+a*t;
s=v0*t+0.5*a*t*t;
cout<<"vt="<<vt<<" s="<<s<<endl;
return 0;
}
2.2.4常量定义
圆周率π是一个常数,对于常数可以定义一个常量来存储。所谓常量,即常量的值在程序中不能发生变化。
定义和说明一个常量的格式
类型说明符 const 常量名=值
或者
const 类型说明符 常量名=值
使用常用修改例7.2
#include<iostream>
using namespace std;
int main()
{
const float PI=3.14159265;
float radius;
float area;
radius=7;
area=PI*radius*radius;
cout<<"Circula area="<<area<<endl;
return 0;
}
使用常量有几个好处
(1)方便修改
(2)可读性强
(3)为了区别变量与常量,常量名通常用大写字母。
2.3数据类型转换
例2.15已知三角形的底为23,高为51,求面积
#include<iostream>
using namespace std;
int main()
{
int a,h;
float s;
a=23;
h=51;
s=a*h/2.0;//注意与s=a*h/2的区别
cout<<s<<endl;
return 0;
}
数据类型转换就是将数据(变量,表达式的结果)从一种类型转换到另一种类型。数据类型的转换有自动转换与强制转换两种。
2.3.1自动转换
在不同数据类型的混合运算中,编译器会隐式地进行数据类型的转换称为自动类型转换。
规则如下
(1)若参与运算的数据类型不同,则先转换成同一类型,然后进行运算
(2)转换按数据长度增加的方向进行,以保证精度不降低。
(3)在赋值运算中,赋值号两边的数据类型不相同时,将把右边表达式值的类型转换为左边变量的的类型。如果右边表达式值的数据类型长度比左边长,将丢失一部分数据。
(4)在赋值语句中,赋值号两边数据类型一定是相兼容的类型,如果等号两边数据类型不兼容,语句在编译时会报错。
2.3.2强制类型转换
当自动类型转换不能实现目的时,可以显式进行类型转换,称为强制类型转换。
强制类型转换的一般格式
(类型名)(表达式)
(类型名)(变量)
需要注意的是,无论是自动转换还是强制转换,都只是为了本次运算的需要而对变量的数据类型进行临时性转换,不改变数据说明时对变量定义的类型。
例2.16求三个数的和
#include<iostream>
using namespace std;
int main()
{
int a,b,c,s;
a=1562345672;
b=1456789343;
c=1234567832;
s=a+b+c;
cout<<s<<endl;
return 0;
}
运行结果
-41264449
为什么会出现这个错误的结果呢?
将s定义为long long试一试
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
long long s;
a=1562345672;
b=1456789343;
c=1234567832;
s=a+b+c;
cout<<s<<endl;
return 0;
}
为什么还是错呢?
进行强制转换
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
long long s;
a=1562345672;
b=1456789343;
c=1234567832;
s=(long long)a+b+c;
cout<<s<<endl;
return 0;
}
能这样写吗?
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
long long s;
a=1562345672;
b=1456789343;
c=1234567832;
s=(long long)(a+b+c);
cout<<s<<endl;
return 0;
}
说明:表达式运算过程的类型变化导致结果出错是程序设计中容易犯的错误,但是由于这种错误在程序编译时不报错,同时要在数据比较大的情况才发生,不容易发现,因此,数据类型变换是程序设计中需要注意的细节。
2.3.3字符型和整型的转换
将一个字符存放到内存单元时,实际上并不是把该字条本身放到内存中,而是将该字符相应的ASCII码存放到内存中。如字条’a’存放的是97。
例2.17字符类型赋给整型
#include<iostream>
using namespace std;
int main()
{
int i,j;
i='A';
j='B';
cout<<i<<' '<<j<<'\n';
return 0;
}
例2.18通过字符数据与整数进行算术运算进行字母的大小写转换。
#include<iostream>
using namespace std;
int main()
{
char c1,c2;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
cout<<c1<<' '<<c2<<endl;
return 0;
}
2.4变量的读入
例2.19从键盘输入一个三位数,然后将它反向输出。例如输入673,输出为376
#include<iostream>
using namespace std;
int main()
{
int x,y,x1,x2,x3;
cin>>x;
x1=x/100;
x2=(x-x1*100)%10;
x3=x%10;
y=x3*100+x2*10+x1;
cout<<y<<endl;
return 0;
}
2.4.1cin语句格式
cin>>变量1>>变量2>>..>>变量n
例2.20依据五组输入数据和运行结果分析cin数据读入方式
#include<iostream>
using namespace std;
int main()
{
char c1,c2;
int a;
float b;
cout<<"输入:"<<endl;
cin>>c1>>c2>>a>>b;
cout<<"输出:"<<endl;
cout<<c1<<endl;
cout<<c2<<endl;
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
(1)cin语句把空格字符与回车换行符作为分隔符,不输入给变量,如果相将空格字符或回车换行符(或任何其它键盘上的字符)输入给字符变量,可以用getchar()函数
(2)cin语句忽略多余的输入数据
(3)在组织输入流数据时,要仔细分析cin语句中的变量类型,按照相应的格式输入,否则容易出错。
例2.21过路时间和费用
#include<iostream>
using namespace std;
int main()
{
char guidepost;
double d,sk,cost;
double time,l,totalcost;
cin>>guidepost;
cin>>d>>s>>k>>cost;
time=d/s;
l=d/k;
totalcost=l*cost;
cout<<guidepost<<endl;
cout<<"time="<<time<<endl;
cout<<"totalcost="<<totalcost<<endl;
return 0;
}
2.5c语句中的scanf语句与printf语句
C++语句兼容c语言中基本语句语法,scanf语句与printf语句是c语句中的输入输出语句,在c++语言环境中亦可使用。对于大数据的输入输出,使用scanf语句和printf语句比c++输入输出流cin和cout效率高。
2.5.1printf格式输出函数
printf(“格式控制字符串”,输出列表);
p43
例2.22阅读下列程序和程序运行结果,说一说"%d"格式控制字符串和输出列表的表达式
#include<cstdio>
using namespace std;
int main()
{
printf("%d%d%d\n",9/8,4*(6+3)%5,(4*6+3)%5);
printf("%d %d %d\n",9/8,4*(6+3)%5,(4*6+3)%5);
printf("9/8=%d 4*(6+3)%5=%d (4*6+3)%5=%d\n",9/8,4*(6+3)%5,(4*6+3)%5);
printf("%d %d %d\n",41%6,41%(-6),(-41)%6);
return 0;
}
例2.23阅读下列程序和程序运行结果,说一说"%f"格式控制字串和输出表达方式
#include<cstdio>
using namespace std;
int main()
{
printf("9/8=%d 9.0/8=%f 9/8.0=%f 9.0/8.0=%f\n",9/8,9.0/8,9/8.0,9.0/8.0);
printf("10.0/6.0=%f\n",10.0/6.0);
printf("10.0/6.0=%.3f\n",10.0/6.0);
printf("10.0/6.0=%9.3f\n",10.0/6.0);
return 0;
}
例2.24阅读下列程序和程序运行结果,说一说"%c"格式控制字符串和输出表的表达方式
#include<cstdio>
using namespace std;
int main()
{
int a=88,b=89;
printf("%d %d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
2.5.2scanf格式输入函数
scanf(“格式控制字符串”,地址列表)
p46
例2.25阅读下列程序和程序运行结果,理解“%d”格式控制字符串和输入列表变量关系
#include<cstdio>
using namespace std;
int main()
{
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
例2.26阅读下列程序和程序运行结果,理解不同格式控制字符串和输入列表变量关系
#include<cstdio>
using namespace std;
int main()
{
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
例2.27阅读下列程序和程序运行结果,理解“*”格式控制字符串作用
#include<cstdio>
using namespace std;
int main()
{
int a,b;
scanf("%d%*d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
2.6顺序结构程序设计实例
2.28鸡兔同笼
#include<iostream>
using namespace std;
int main()
{
int a,b,x,y;
a=35,b=94;
x=2*a-b/2;
y=b/2-a;
cout<<"x="<<x<<" y="<<y<<endl;
return 0;
}
例2.29公交站
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f,timepast;
cin>>a>>b>>c>>d;
timepast=60*c+d-(60*a-b);
e=timepast/60;
f=timepast%60;
cout<<"公交车从首站到末站共用"<<e<<"小时"<<f<<"分钟"<<endl;
return 0;
}
例2.30加减混合运算
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
int x,y,z;
srand(time(0));
x=rand()%1000+1;
y=rand()%1000+1;
z=rand()%1000+1;
cout<<x<<"+"<<y<<"-"<<z<<"="<<x+y-z<<endl;
return 0;
}
例2.31求运算式
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int a,b,c,n;
double s;
cin>>a>>b>>c>>n;
s=pow(a,n)+pow(b,n)+pow(c,n);
cout<<setprecision(15)<<s<<endl;
return 0;
}
例2.32求等差数列各项的和
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int a,b,n;
long long s;
cin>>a>>b>>c;
s=((long long)a+b)*n/2;
cout<<s<<endl;
return 0;
}
浙公网安备 33010602011771号