0x09 数字
通常,当我们需要用到数字时,我们会使用原始的数据类型,如 int、short、long、float 和 double 等等。这些用于数字的数据类型,其可能的值和数值范围
常用姿势
#include <iostream>
using namespace std;
int main ()
{
// 数字定义
short s;
int i;
long l;
float f;
double d;
// 数字赋值
s = 10;
i = 1000;
l = 1000000;
f = 230.47;
d = 30949.374;
// 数字输出
cout << "short s :" << s << endl;
cout << "int i :" << i << endl;
cout << "long l :" << l << endl;
cout << "float f :" << f << endl;
cout << "double d :" << d << endl;
return 0;
}
数学函数
序号 |
函数 & 描述 |
1 |
double cos(double); 该函数返回弧度角(double 型)的余弦。 |
2 |
double sin(double); 该函数返回弧度角(double 型)的正弦。 |
3 |
double tan(double); 该函数返回弧度角(double 型)的正切。 |
4 |
double log(double); 该函数返回参数的自然对数。 |
5 |
double pow(double, double); 假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。 |
6 |
double hypot(double, double); 该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。 |
7 |
double sqrt(double); 该函数返回参数的平方根。 |
8 |
int abs(int); 该函数返回整数的绝对值。 |
9 |
double fabs(double); 该函数返回任意一个十进制数的绝对值。 |
10 |
double floor(double); 该函数返回一个小于或等于传入参数的最大整数。 |
#include <iostream>
#include <cmath>
using namespace std;
int main ()
{
// 数字定义
short s = 10;
int i = -1000;
long l = 100000;
float f = 230.47;
double d = 200.374;
// 数学运算
cout << "sin(d) :" << sin(d) << endl;
cout << "abs(i) :" << abs(i) << endl;
cout << "floor(d) :" << floor(d) << endl;
cout << "sqrt(f) :" << sqrt(f) << endl;
cout << "pow( d, 2) :" << pow(d, 2) << endl;
return 0;
}
随机数
在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。
下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main ()
{
int i,j;
// 设置种子
srand( (unsigned)time( NULL ) );
/* 生成 10 个随机数 */
for( i = 0; i < 10; i++ )
{
// 生成实际的随机数
j= rand();
cout <<"随机数: " << j << endl;
}
return 0;
}
0x10 数组
简介
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
实际使用
声明数组
声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ];
这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C++ 数据类型。例如,要声明一个类型为 double 的包含 10 个元素的数组 balance,声明语句如下:
double balance[10];
现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。
初始化数组
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
如果省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};
访问数组
double salary = balance[9];
实例
#include <iostream>
using namespace std;
#include <iomanip>
using std::setw;
int main()
{
int n[10]; // 声明数组 n 是一个包含 10 个整数的数组
// 初始化数组元素
for (int i = 0; i < 10; i++)
{
n[i] = i + 100; // 设置元素 i 为 i + 100
}
cout << "Element" << setw(13) << "Value" << endl;
// 输出数组中每个元素的值
for (int j = 0; j < 10; j++)
{
cout << setw(7) << j << setw(13) << n[j] << endl;
}
return 0;
}
0x11 字符串
C风格字符串
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个。char greeting[6] = {'H', 'e', 'l', 'l', 'o', ''};
依据数组初始化规则,可以把上面的语句写成以下语句:
char greeting[] = "Hello";
不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 '' 放在字符串的末尾
#include <iostream>
using namespace std;
int main()
{
char greeting[6] = { 'H', 'e', 'l', 'l', 'o', ' ' };
cout << "Greeting message: " << endl;
cout << greeting << endl;
return 0;
}
C++中的函数操作以null结尾的字符串
序号 |
函数 & 目的 |
1 |
strcpy(s1, s2); 复制字符串 s2 到字符串 s1。 |
2 |
strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。 |
3 |
strlen(s1); 返回字符串 s1 的长度。 |
4 |
strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
5 |
strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
6 |
strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
char str1[11] = "Hello";
char str2[11] = "World";
char str3[11];
int len ;
// 复制 str1 到 str3
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
// 连接 str1 和 str2
strcat( str1, str2);
cout << "strcat( str1, str2): " << str1 << endl;
// 连接后,str1 的总长度
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
C++中的string类
C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;
// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl;
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
0x12 指针
每个变量都有一个内存位置,每一个内存位置都定义了可使用连字号&,运算符访问的地址,表示了内存中的地址
#include <iostream>
using namespace std;
int main()
{
int var1;
char var2[10];
cout << "var1 变量的地址: ";
cout << &var1 << endl;
cout << "var2 变量的地址: ";
cout << &var2 << endl;
return 0;
}
指针
指针也是一个变量,其值为另一个变量的地址,即内存位置的直接地址,同其他变量或常量一样,使用指针存储其他变量地址钱必须对其进行声明,格式如下:
type *var-name;
type是指针的基类型,必须是一个有效的C++数据类型,var-name为指针变量的名称,用来声明指针的*同乘法是一样的
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch /* 一个字符型的指针 */
所有指针的值的实际数据类型,整型、浮点型、字符型均一样,每个都代表内存地址的十六进制数,不同数据类型的指针间唯一不同:指针所指的变量或常量的数据类型不同
C++中使用指针
定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值
#include <iostream>
using namespace std;
int main()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl;
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl;
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
}