C++学习笔记06

C++ 数字

实例

#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;
}

当上面的代码被编译和执行时,它会产生下列结果:

short  s :10
int    i :1000
long   l :1000000
float  f :230.47
double d :30949.4
C++ 数学运算

C++ 中,除了可以创建各种函数,还包含了各种有用的函数供使用。这些函数写在标准 CC++库中,叫做内置函数。可以在程序中引用这些函数。
C++内置了丰富的数学函数,可对各种数字进行运算。下表列出了C++中一些有用的内置的数学函数。
为了利用这些函数,您需要引用数学头文件<cmath>

函数描述
double cos(double)该函数返回弧度角(double 型)的余弦。
double sin(double)该函数返回弧度角(double 型)的正弦。
double tan(double)该函数返回弧度角(double 型)的正切。
double log(double)该函数返回参数的自然对数。
double pow(double, double)假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。
double hypot(double, double)该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。
double sqrt(double)该函数返回参数的平方根。
int abs(int)该函数返回整数的绝对值。
double fabs(double)该函数返回任意一个浮点数的绝对值。
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;
}

当上面的代码被编译和执行时,它会产生下列结果:

sin(d) :-0.634939
abs(i)  :1000
floor(d) :200
sqrt(f) :15.1812
pow( d, 2 ) :40149.7
C++ 随机数

在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 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;
}

当上面的代码被编译和执行时,它会产生下列结果:

随机数: 1748144778
随机数: 630873888
随机数: 2134540646
随机数: 219404170
随机数: 902129458
随机数: 920445370
随机数: 1319072661
随机数: 257938873
随机数: 1256201101
随机数: 580322989
srand函数是随机数发生器的初始化函数。

原型: void srand(unsigned seed);
用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。如: srand(1); 直接使用 1 来初始化种子。不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用time 函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给 srand 函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_tt变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。
例子:

#include <stdlib.h>
#include <stdio.h>
#include <time.h> /*用到了time函数,所以要有这个头文件*/
#define MAX 10
 
int main( void)
{
    int number[MAX] = {0};
    int i;
    srand((unsigned) time(NULL)); /*播种子*/
    for(i = 0; i < MAX; i++)
    {
        number[i] = rand() % 100; /*产生100以内的随机整数*/
        printf("%d ", number[i]);
    }
    printf("\n");
    return 0;
}
关于 c++ 随机数的补充(取一定范围的随机数)
#include <iostream>
#include<stdio.h>
#include<time.h>
#define random(x)(rand()%x)
using namespace std;

int main()
{
    srand((int)time(0));//部署随机种子
    for (int i = 0; i < 10; i++){
        cout << random(100) << endl;
        //输出0-100的随机数
    };
    return 0;
}

补充说明:

  • 1、rand 随机数产生的范围:在标准的 C 库中函数 rand() 可以生成 0~RAND_MAX 之间的一个随机数,其中 RAND_MAXstdlib.h 中定义的一个整数,它与系统有关,至少为 32767
  • 2、使用 rand()srand() 产生指定范围内的随机整数的方法:“模除+加法”的方法。如要产生 [m,n] 范围内的随机数 num,可用:int num=rand()%(n-m+1)+m;(即 rand()%[区间内数的个数]+[区间起点值]
使用随机数来发红包:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <math.h>

using namespace std;

int main()
{
    int i, number;
    int best;//手气最佳
    float total;

    cout << "请输入红包金额:";
    cin >> total;
    cout << "请输入抢红包人数:";
    cin >> number;
    /* 生成随机数 */
    // 设置种子
    srand((unsigned)time(NULL));
    float a[1024];//保存每个人的随机数。最多支持1024个人抢红包。
    float b[1024];//保存每个人获得的红包金额。
    float suma = 0;//随机数总和。
    float sumb = 0;//红包总和。
    int max = 0;
    for (i = 0; i < number; i++)
    {
        // 生成实际的随机数
        a[i] = rand() % 100;
                
        if (a[i] > max){
            max = a[i];
            best = i;//获取手气最佳
        }
        suma += a[i];
    }

    for (i = 0; i < number - 1; i++)
    {
        b[i] = a[i] / suma * total;//按照随机数计算每个人实际获得的金额
        sumb += round(b[i] * 100) / 100.0;//将红包金额保留两位小数
        //输出信息
        cout << "第" << setiosflags(ios::right)<< setw(3) << i + 1 << 
            "个人的红包是:" << setiosflags(ios::right) << setw(6) << 
            setiosflags(ios::fixed) << setprecision(2) << 
            round(b[i] * 100) / 100.0 ;
        if (best == i){
            cout << "(手气最佳)" << endl;
        }
        else {
            
            cout << endl;
        }
    }
    //最后一人的红包金额等于总金额减去前面的金额。
    cout << "第" << setiosflags(ios::right)<<
        setw(3) << number << "个人的红包是:" <<
        setiosflags(ios::right) << setw(6) << setiosflags(ios::fixed) <<
        setprecision(2) << round((total - sumb) * 100) / 100.0;
    if (best == number - 1){
        cout << "(手气最佳)" << endl;
    }
    else {

        cout << endl;
    }
    return 0;
}

结果:

请输入红包金额:100
请输入抢红包人数:101个人的红包是:  0.382个人的红包是:  3.063个人的红包是: 11.664个人的红包是:  4.405个人的红包是: 17.026个人的红包是: 14.537个人的红包是:  6.128个人的红包是: 13.199个人的红包是: 11.8510个人的红包是: 17.79(手气最佳)
请按任意键继续. . .

C++ 数组

C++ 支持数组数据结构,它可以存储一个固定大小相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。

所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

声明数组

C++中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:

type arrayName [ arraySize ];

这叫做一维数组。arraySize 必须是一个大于零的整数常量,type可以是任意有效的 C++数据类型。例如,要声明一个类型为double的包含 10个元素的数组 balance,声明语句如下:

double balance[10];

现在 balance 是一个可用的数组,可以容纳 10 个类型为double的数字。

初始化数组

C++ 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

大括号 { }之间的值的数目不能大于我们在数组声明时在方括号 [ ]中指定的元素数目。
如果省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:

double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

您将创建一个数组,它与前一个实例中所创建的数组是完全相同的。下面是一个为数组中某个元素赋值的实例:

balance[4] = 50.0;

上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。以下是上面所讨论的数组的的图形表示:
在这里插入图片描述

访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:

double salary = balance[9];

上面的语句将把数组中第 10 个元素的值赋给 salary 变量。下面的实例使用了上述的三个概念,即,声明数组数组赋值访问数组
实例

#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;
}

上面的程序使用了 setw()函数来格式化输出。当上面的代码被编译和执行时,它会产生下列结果:

Element        Value
      0          100
      1          101
      2          102
      3          103
      4          104
      5          105
      6          106
      7          107
      8          108
      9          109

Array 直接初始化 char 数组是特殊的,这种初始化要记得字符是以一个 null 结尾的。
实例

char a1[] = {'C', '+', '+'};          // 初始化,没有 null

char a2[] = {'C', '+', '+', '\0'};    // 初始化,明确有 null

char a3[] = "C++";                    // null 终止符自动添加
const char a4[6] = "runoob";          // 报错,没有 null 的位置

a4 是错误的,虽然 a4 包括 6 个直接字符,但是 array大小是 7:6个字符 + 一个null。正确的是:

const char a4[7] = "runoob";

Array是固定大小的,不能额外增加元素.当我们想定义不固定大小的字符时,可以使用 vector(向量)标准库。

实例
#include <iostream>
#include <vector>
using namespace std;
 
int main() {
   // 创建向量用于存储整型数据
   vector<int> vec; 
   int i;

   // 显示 vec 初始大小
   cout << "vector size = " << vec.size() << endl;

   // 向向量 vec 追加 5 个整数值
   for(i = 0; i < 5; i++){
      vec.push_back(i);
   }

   // 显示追加后 vec 的大小
   cout << "extended vector size = " << vec.size() << endl;

   return 0;
}

vec 的大小随着 for 循环的输入而增大。
执行以上代码,输出结果:

vector size = 0
extended vector size = 5

C++中,setw(int n)用来控制输出间隔,(n-1个空格)。
setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。

cout<<setfill('*')<<setw(5)<<'a'<<endl;

则输出:

****a //4个*和字符a共占5个位置。

数组初始化时可以用聚合方法,但是赋值时候不可以用聚合方法。举例如下:
合法:

int array[] = {5,10,20,40};

不合法:

int array[]int main()
{
  array[] = {5,10,20,40};
  return 0;
}

数组在使用时可以是一个含有变量的表达式,但是,在数组声明时必须用常量表达式。例如:

// 合法
const int a=19;
long b[a];

// 合法
const int a=19;
long b[a+5];

// 不合法
int a=19;
long b[a+5];

如果想声明一个任意长度的数组,可以用显式的类型转换,例如:

int a=19;
int b[(const int)a];

也可以定义一个常量来声明,例如:

int a=19;
const int a1=a;
int b[a1];

C++ 数组的长度:

#include<iostream>
using namespace std;

template<class T>

int length(T& arr)
{
    //cout << sizeof(arr[0]) << endl;
    //cout << sizeof(arr) << endl;
    return sizeof(arr) / sizeof(arr[0]);
}

int main()
{
    int arr[] = { 1,5,9,10,9,2 };
    // 方法一
    cout << "数组的长度为:" << length(arr) << endl;
    // 方法二
    //cout << end(arr) << endl;
    //cout << begin(arr) << endl;
    cout << "数组的长度为:" << end(arr)-begin(arr) << endl;
    system("pause");
    return 0;
}

输出结果为:

数组的长度为:6
数组的长度为:6

对于字符串数组,可以用 strlen()函数来获取字符串数组的长度。

Vector(向量):C++ 中的一种数据结构,确切的说是一个。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。
用法:

  • 1.文件包含:
    首先在程序开头处加上#include<vector>以包含所需要的类文件 vector
    还有一定要加上 using namespace std;
  • 2.变量声明:
    2.1 例: 声明一个int向量以替代一维的数组:vector <int> a; (等于声明了一个 int 数组 a[],大小没有指定,可以动态的向里面添加删除)。
    2.2 例: 用 vector 代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector <int *> a 。同理想用向量代替三维数组也是一样,vector <int**>a; 再往上面依此类推。
    3.具体的用法以及函数调用:
    3.1 得到向量中的元素和数组一样,例如:
vector <int *> a
int b = 5;
a.push_back(b);//该函数下面有详解
cout<<a[0];       //输出结果为5

使用数组给向量赋值:

vector<int> v( a, a+sizeof(a)/sizeof(a[0]) );

或者:

int a[]={1,2,3,4,5,6,7,8,9};
typedef vector<int> vec_int;
vec_int vecArray(a,a+9);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值