基本数据类型


2.2.1整型数据

短整型(short int)

有符号短整型(signed short int)

无符号短整型(unsigned short int)

一般整型(int)

有符号一般整型(signed int)

无符号一般整型(unsigned int)

长整型(long int)

有符号长整型(signed long int)

无符号长整型(unsigned long int)

(1)十进制整数。

(2)八进制整数。在常数的开头加一个数字0,就表示这是以八进制数形式表示的常数。

(3)十六进制整数。在常数的开头加一个数字0和一个英文字母X(或x),就表示这是以十六进制数形式表示的常数。

2.2.2实型数据

单精度(float)

双精度(double)

长双精度(long double)

(1)十进制小数形式

(2)指数形式

2.2.3字符型数据

有符号字符型(signed char)

字符型char

无符号字符型(unsigned char)

2.2.4宽字符型数据

宽字符型数据(wchar_t)

2.2.5布尔型数据

逻辑型(bool)

2.2.6空类型

空类型(void)就是无值型

3.2字符串String

字符串变量必须先定义后使用,定义字符串变量要用类名string。如

string string1;                    //定义string1为字符串变量

string string2=″China″;             //定义string2同时对其初始化

要使用string类的功能时,必须在本文件的开头将C++标准库中的string头文件包含进来,即应加上#include <string>

字符串变量的运算

在以字符数组存放字符串时,字符串的运算要用字符串函数,如strcat(连接)、strcmp(比较)、strcpy(复制),而对string类对象,可以不用这些函数,而直接用简单的运算符。

(1) 字符串复制用赋值号

string1=string2;其作用与“strcpy(string1,string2);”相同。

(2) 字符串连接用加号

string string1=″C++″;                   //定义string1并赋初值

string string2=″Language″;               //定义string2并赋初值

string1=string1 + string2;               //连接string1和string2

(3) 字符串比较直接用关系运算符

==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)等关系运算符来进行字符串的比较。

  • //输入3个字符串,要求将字母按由小到大的顺序输出。

#include <iostream>

#include <string>

using namespace std;

int main( ){

string string1,string2,string3,temp;

cout<<"please input three strings:";

cin>>string1>>string2>>string3;

if(string2>string3)

{temp=string2;string2=string3;string3=temp;}

if(string1<=string2)

{cout<<string1<<" "<<string2<<" "<<string3<<endl;}

else if(string1<=string3) {

cout<<string2<<" "<<string1<<" "<<string3<<endl;

}else cout<<string2<<" "<<string3<<" "<<string1<<endl;

return 0;

}

  • //一个班有n个学生,需要把每个学生的姓名和学号输入计算机保存。然后可以通过输入某一学生的姓名查找其有关资料。当输入一个姓名后,程序就查找该班中有无此学生,如果有,则输出他的姓名和学号,如果查不到,则输出“本班无此人”。为解此问题,可以分别编写两个函数,函数input_data用来输入n个学生的姓名和学号,函数search用来查找要找的学生是否在本班。

#include <iostream>

#include <string>

using namespace std;

int n;string name[50],num[50];

int main( ){

void input_data( );

void search(string find_name);

string find_name;

cout<<"please input number of this class:";

cin>>n;

input_data( );

cout<<"please input name you want find:";

cin>>find_name;

search(find_name);

return 0;

}

void input_data( ){

int i;

for (i=0;i<n;i++){

cout<<"input name and NO of student"<<i+1<<":";

cin>>name[i]>>num[i];

}

}

void search(string find_name){

int i;bool flag=false;

for(i=0;i<n;i++){

if(name[i]==find_name){

cout<<name[i]<<"has been found, his number is "<<num[i]<<endl;

flag=true;

break;

}

if(flag==false){

cout<<"can't find this name";

}

}

}

3.3结构体(structure)类型

3.3.1结构体类型概念

在一个组合项中包含若干个类型不同的数据项。C和C++允许用户自己指定这样一种数据类型,它称为结构体。它相当于其他高级语言中的记录(record)。

声明一个结构体类型的一般形式为

struct 结构体类型名

{成员表列};

struct Student{            //声明一个结构体类型Student

int num;                 //包括一个整型变量num

char name[20];           //包括一个字符数组name,可以容纳20个字符

char sex;                //包括一个字符变量sex

int age;                 //包括一个整型变量age

float score;              //包括一个单精度型变量

char addr[30];           //包括一个字符数组addr,可以容纳30个字符

};                    //最后有一个分号

3.3.2结构体类型变量

struct Student               //声明结构体类型Student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}student1,student2;  //定义两个结构体类型Student的变量student1,student2

struct Date          //声明一个结构体类型Date

{ int month;

int day;

int year;

};

struct Student                //声明一个结构体类型Student

{ int num;

char name[20];

char sex;

int age;

Date birthday;            //Date是结构体类型,birthday是Date类型的成员

char addr[30];

}student1,student2; //定义student1和student2为结构体类型Student的变量

3.3.3结构体变量的初始化

struct Student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}student1={10001,″Zhang Xin″,′M′,19,90.5,″Shanghai″};

Student student2={10002,″Wang Li″,′F′,20,98,″Beijing″;

3.3.4引用结构体变量中的成员。

#include <iostream>

using namespace std;

struct Date{

int year;

int month;

int day;

};

struct Student{

int num;

char name[20];

char sex;

Date birthday;

float score;

}student1,student2={10002,"Wang Li",'f',5,23,1982,89.5};

int main( ){

student1=student2;

cout<<student1.num<<endl;

cout<<student1.name<<endl;

cout<<student1.sex<<endl;

cout<<student1.birthday.month<<'/'<<student1.birthday.day<<'/'<<student1.birthday.year<<endl;

cout<<student1.score<<endl;

return 0;

}

3.3.5结构体数组

每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。

struct Student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

};

Student stu[3];      //定义Student类型的数组stu

也可以直接定义一个结构体数组,如

struct Student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu[3];

struct

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu[3];

3.3.6结构体数组的初始化

与其他类型的数组一样,对结构体数组可以初始化。如

struct Student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}sty[3]={{10101,″Li Lin″,′M′,18,87.5,″103 Beijing Road″},

{10102,″Zhang Fun″,′M′,19,99,″130 Shanghai Road″},

{10104,″Wang Min″,′F′,20,78.5,″1010,Zhongshan Road″}};

3.3.7结构体数组应用

对候选人得票的统计程序。设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。可以定义一个候选人结构体数组,包括3个元素,在每个元素中存放有关的数据。

#include <iostream>

#include <string.h>

using namespace std;

struct Person{

char name[20];

int count;

};

int main( ){

Person leader[3]={"Li",0,"Zhang",0,"Fun",0};

int i,j;

char leader_name[20];

for(i=0;i<10;i++){

cin>>leader_name;

for(j=0;j<3;j++)

if(strcmp(leader_name,leader[j].name)==0) {

leader[j].count++;

}

}

cout<<endl;

for(i=0;i<3;i++){

cout<<leader[i].name<<":"<<leader[i].count<<endl;

}

return 0;

}

3.3.8指向结构体变量的指针

一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素

1. 通过指向结构体变量的指针引用结构体变量中的成员

#include <iostream>

#include <string>

using namespace std;

int main( ){

struct Student{

int num;

string name;

char sex;

float score;

};

Student stu;

Student *p=&stu;

stu.num=10301;

stu.name="Wang Fun";

stu.sex='f';

stu.score=89.5;

cout<<stu.num<<" "<<stu.name<<" "<<stu.sex<<" "<<stu.score<<endl;

cout<<(*p).num<<" "<<(*p).name<<" "<<(*p).sex<<" "<<(*p).score<<endl;

return 0;

}

2.说明如何建立和输出一个简单链表。输出各结点中的数据。

#define NULL 0

#include <iostream>

using namespace std;

struct Student{

long num;

float score;

struct Student *next;

};

int main( ){

Student a,b,c,*head,*p;

//对结点a的num和score成员赋值

a.num=31001;a.score=89.5;

//对结点b的num和score成员赋值

b.num=31003;b.score=90;

//对结点c的num和score成员赋值

c.num=31007;c.score=85;

//将结点a的起始地址赋给头指针head

head=&a;

//将结点b的起始地址赋给a结点的next成员

a.next=&b;

//将结点c的起始地址赋给b结点的next成员

b.next=&c;

//结点的next成员不存放其他结点地址

c.next=NULL;

//使p指针指向a结点

p=head;

do{

//输出p指向的结点的数据

cout<<p->num<<" "<<p->score<<endl;

//使p指向下一个结点

p=p->next;

} while(p!=NULL);//输出完c结点后p的值为NULL

return 0;

}

3.3.9结构体类型数据作为函数参数

有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求在main函数中为各成员赋值,在另一函数print中将它们的值输出。

(1) 用结构体变量作函数参数

#include <iostream>

#include <string>

using namespace std;

struct Student{

int num;

string name;

float score[3];

};

int main( ){

//函数声明,形参类型为结构体Student

void print(Student);

Student stu;

stu.num=12345;

stu.name="Li Fung";

stu.score[0]=67.5;

stu.score[1]=89;

stu.score[2]=78.5;

//调用print函数,输出stu各成员的值

print(stu);

return 0;

}

void print(Student stu){

cout<<stu.num<<" "<<stu.name<<" "<<stu.score[0]<<" "

<<stu.score[1]<<" "<<stu.score[2]<<endl;

}

(2) 用指向结构体变量的指针作实参

#include <iostream>

#include <string>

using namespace std;

struct Student{

int num;

//用string类型定义字符串变量

string name;

float score[3];

//定义结构体student变量stu并赋初值

}stu={12345,"Li Fung",67.5,89,78.5};

int main( ){

//函数声明,形参为指向Student类型数据的指针变量

void print(Student *);

//定义基类型为Student的指针变量pt,并指向stu

Student *pt=&stu;

//实参为指向Student类数据的指针变量

print(pt);

return 0;

}

//定义函数,形参p是基类型为Student的指针变量

void print(Student *p){

cout<<p->num<<" "<<p->name<<" "<<p->score[0]<<" "

<<p->score[1]<<" "<<p->score[2]<<endl;

}

(3) 用结构体变量的引用作函数参数

#include <iostream>

#include <string>

using namespace std;

struct Student

{ int num;

string name;

float score[3];

}stu={12345,"Li Li",67.5,89,78.5};

int main( ){

//函数声明,形参为Student类型变量的引用

void print(Student &);

//实参为结构体Student变量

print(stu);

return 0;

}

//函数定义,形参为结构体Student变量的引用

void print(Student &stud){

cout<<stud.num<<" "<<stud.name<<" "<<stud.score[0]<<" "

<<stud.score[1]<<" "<<stud.score[2]<<endl;

}

3.3.10 动态分配和撤销内存的运算符new和delete

常常需要动态地分配和撤销内存空间C++提供了较简便而功能较强的运算符new和delete来取代C语言的malloc和free函数。

#include <iostream>

#include <string>

using namespace std;

//声明结构体类型Student

struct Student{

string name;

int num;

char sex;

};

int main( ){

//定义指向结构体类型Student的数据的指针变量

Student *p;

//用new运算符开辟一个存放Student型数据的空间

p=new Student;

//向结构体变量的成员赋值

p->name="Wang Fun";

p->num=10123;

p->sex='m';

//输出各成员的值

cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;

//撤销该空间

delete p;

return 0;

}

3.4共用体(union)类型

3.4.1共用体的概念

有时需要使几种不同类型的变量存放到同一段内存单元中。变量在内存中占的字节数不同,但都从同一地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为共用体(union)类型的结构。

声明共用体类型的一般形式为

union 共用体类型名

{成员表列

};

union data

{ int i;

char ch;

double d;

}a,b,c;

(有共用体类型名)

union

{ int i;

char ch;

double d;

}a,b,c;

(无共用体类型名)

结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。

3.4.2对共用体变量的访问方式

不能引用共用体变量,而只能引用共用体变量中的成员。

a.i (引用共用体变量中的整型成员i)

a.ch(引用共用体变量中的字符型成员ch)

a.f (引用共用体变量中的双精度型成员d)

设有若干个人员的数据,其中有学生和教师。学生的数据中包括: 姓名、号码、性别、职业、年级。教师的数据包括: 姓名、号码、性别、职业、职务。

如果job项为s(学生),则第5项为grade(年级)。即Li是3年级的。如果job项是t(教师),则第5项为position(职务)。Wang是prof(教授)。显然对第5项可以用共用体来处理(将class和position放在同一段内存中)。

要求输入人员的数据,然后再输出。为简化起见,只设两个人(一个学生、一个教师)。

#include <iostream>

#include <string>

//因为在输出流中使用了控制符setw

#include <iomanip>

using namespace std;

struct{

int num;

char name[10];

char sex;

char job;

//声明共用体类型

union P{

int grade;

char position[10];

//成员category 为共用体变量

}category;

//定义共用体数组person,含两个元素

}person[2];

int main( ){

int i;

for(i=0;i<2;i++){

cin>>person[i].num>>person[i].name>>person[i].sex>>person[i].job;

//若是学生则输入年级

if(person[i].job=='s') cin>>person[i].category.grade;

//若是教师则输入职务

else if (person[i].job=='t') cin>>person[i].category.position;

}

cout<<endl<<"No.  Name   sex  job  grade/position"<<endl;

for(i=0;i<2;i++){

if (person[i].job=='s')

cout<<person[i].num<<setw(6)<<person[i].name<<" "<<person[i].sex

<<" "<<person[i].job<<setw(10)<<person[i].category.grade<<endl;

else

cout<<person[i].num<<setw(6)<<person[i].name<<" "<<person[i].sex

<<" "<<person[i].job<<setw(10)<<person[i].category.position<<endl;

}

return 0;

}

3.5枚举(enumeration)类型

如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。

声明枚举类型用enum

enum weekday{sun,mon,tue,wed,thu,fri,sat};

声明枚举类型的一般形式为

enum  枚举类型名  {枚举常量表列};

在声明了枚举类型之后,可以用它来定义变量。如

weekday  workday,week_end;

这样,workday和week_end被定义为枚举类型weekday的变量。

口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。

//需要用到输入输出操作

#include <iostream>

//在输出时要用到setw控制符

#include <iomanip>

//

using namespace std;

int main( ){

//声明枚举类型color

enum color {red,yellow,blue,white,black};

//定义color类型的变量pri

color pri;

//n是累计不同颜色的组合数

int i,j,k,n=0,loop;

//当i为某一颜色时

for (i=red;i<=black;i++)

//当j为某一颜色时

for (j=red;j<=black;j++)

//若前两个球的颜色不同

if (i!=j){

//只有前两个球的颜色不同,才需要检查第3个球的颜色

for (k=red;k<=black;k++)

//3个球的颜色都不同

if ((k!=i) && (k!=j))

{n=n+1;                //使累计值n加1

cout<<setw(3)<<n;         //输出当前的n值,字段宽度为3

for (loop=1;loop<=3;loop++)   //先后对3个球作处理

{switch (loop)              //loop的值先后为1,2,3

{case 1: pri=color(i);break;  //color(i)是强制类型转换,使pri的值为i

case 2: pri=color(j);break;  //使pri的值为j

case 3: pri=color(k);break;  //使pri的值为k

default:break;

}

//判断pri的值,输出相应的"颜色"

switch (pri)

{case red:cout<<setw(8)<<"red"; break;

case yellow:cout<<setw(8)<<"yellow"; break;

case blue:cout<<setw(8)<<"blue"; break;

case white:cout<<setw(8)<<"white"; break;

case black:cout<<setw(8)<<"black"; break;

default:break;

}

}

cout<<endl;

}

}

//输出符合条件的组合的个数

cout<<"total:"<<n<<endl;

return 0;

}

3.6 用typedef声明类型

typedef声明一个新的类型名来代替已有的类型名。

typedef int INTEGER;        //指定用标识符INTEGER代表int类型

typedef float REAL;         //指定用REAL代表float类型

这样,以下等价: ① int     i,j;  float a,b;② INTEGER i,j; REAL  a,b;

3.7类(class)类型

03C++基本数据类型的更多相关文章

  1. 03-C#笔记-数据类型

    --- # 1 数据类型 --- ## 1 和C++不同的数据类型: byte: 8位,0~255 decimal:范围大于double,128位 sbyte: 8位,-128~127 uint 32 ...

  2. 03C#数据类型

    C#数据类型 值类型和引用类型区别 在C#语言中,值类型变量存储的是指定数据类型的数据,值类型变量的值(或实例)存储在栈(Stack)中,赋值语句是传递变量的值.引用类型(例如类就是引用类型)的实例, ...

  3. JavaScript 中的数据类型

    Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...

  4. JS 判断数据类型的三种方法

    说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...

  5. Python高手之路【二】python基本数据类型

    一:数字 int int(整型): 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值 ...

  6. UniqueIdentifier 数据类型 和 GUID 生成函数

    UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格 ...

  7. SQL Server常见数据类型介绍

    数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅. 1.整数类型 int 存储范围是-2,147,483,648到2,147,483 ...

  8. 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...

  9. python 数据类型 ----字典

    字典由一对key:value 组成的 python中常用且重量级的数据类型 1. key , keys, values 字典由一对key:value 组成的 python中常用且重量级的数据类型 1. ...

随机推荐

  1. 关于使用Xshell远程连接启动tomcat导致图片不显示,报错Could not initialize class sun.awt.X11GraphicsEnvironment解决方案

    如果您是使用xshell远程启动tomcat,导致二维码.验证码,头像等各种图片不显示,并且打开图片链接报错Could not initialize class sun.awt.X11Graphics ...

  2. Session管理之ThreadLocal

    ref=toolbar" target="_blank">ref=toolbar_logo" target="_blank"> ...

  3. IIS6下PHP配置(转载)

    Windows 2003+IIS6+PHP5.4.10配置PHP支持空间的方法 (2013-01-10 16:48:56)标签: php it php环境 php配置 分类: PHP环境配置简介:一般 ...

  4. iOS_20_微博自己定义可动画切换的导航控制器

    终于效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/ ...

  5. caioj1472: 后缀自动机1:多个串的LCS

    子串母串跑合并答案 一个点的fail的dep是比任意一条根到这个点路径长度要小的. 那么改就可以直接来了. #include<cstdio> #include<iostream> ...

  6. 开始学习java编程

    先看视屏,学习JAVA语法先,后面再看java web mvc,以及myeclipse http://i.youku.com/u/UMzM4MjMxNjMy/videos 争取20天内进步很大.

  7. hdoj--2186--悼念512汶川大地震遇难同胞——一定要记住我爱你(模拟水题)

     悼念512汶川大地震遇难同胞--一定要记住我爱你 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  8. 洛谷P2680 运输计划——树上差分

    题目:https://www.luogu.org/problemnew/show/P2680 久违地1A了好高兴啊! 首先,要最大值最小,很容易想到二分: 判断当前的 mid 是否可行,需要看看有没有 ...

  9. FreeMarker:

    ylbtech-FreeMarker: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbt ...

  10. .NET 导入导出Excel

    第一种方式:OleDb 需要安装office,且读数据慢,而且有数据格式的Cell读出数据不正确等问题.放弃. 第二种方式:NPOI开源库 使用NPOI导入导出Excel应该是.NET开发很常用的手段 ...