- 罕见的数据类型
枚举类型 enum 枚举类型名T {Sunday=1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
枚举类型名T 变量表
枚举类型只能进行赋值和比较运算。不能把整数赋给枚举型变量。枚举内部的元素会从0开始连续编码。
类型别名:
typedef int INTEGER;
字符型实例:
char ch = ‘M’; int i = ch; cout << “THe ASCII code for” << ch << “is” << i; ch = ch + 1; //发生两次(?)自动类型转换
了解变量占用多少字节:sizeof(float)
#include <cstdlib> //C standard library #include <ctime> srand(time(NULL)); //随机种子初始化 rand(); //生成0~RAND_MAX(32767)之间。若想生成0~a-1之间的a个数: rand()*a/(RAND_MAX + 1);
或
rand() % a
- //不够两位前面补0
#include<iomanip> cout << set(2)<< setfill('0')<< a << endl;
- //四舍五入保留i位小数
#include <iomanip> double result; cout << fixed << setprecision(i) << result << endl; //如果不加fixed, 则表示保留几位有效数字
- //除法运算,运算数为整型则结果为整型,若想输出实型:
3/4.0 或强制类型转换
- //强制类型转换
double(p)
静态类型转换:
char ch; int d = 10; ch = static_cast <char>(d);
- //定义符号常量 编译方式:直接替换
#define 符号常量 值
或
const 类型 符号常量=值
//水平移动到下一个区域 ‘\t’ 制表符
- //位运算
数据类型:整型/字符型。
&按位与:相当于且,两个都为1时为1.(用途:利用0&x=0,将数值中的某些位清零;利用1&x=x,检验数值中某些位的值。如,想保存奇数位,可以将这个数与0x5555按位与运算。)
|按位或:相当于或,两个二进制位都为0时结果为0.(用途:将某一位设成1用1|x;保留某一位的值用0|x。)
^按位异或:相同为0,否则为1.(用途:x^=1是x取反, x^=0是x的值;交换a, b 的值:a=a^b; b=b^a; a=a^b;)
~取反运算:注意32767取反之后是32768.用法:~x.
<<左移,二进制下往左移几位,后面补0,作用一次相当于原数*2
>>右移,作用一次相当于原数/2
- // 见P29函数
x的y次方pow(double x, double y) //注意是实型
绝对值函数int abs(int x)
double fabs(double x)
开方double sqrt(double x)
e^x double exp(double x)
ln x double log(double x)
lg x double log10(double x)
- //复合赋值运算符
x += 1 //是右结合的,右边是算数表达式可以不加括号
- //自增自减作为子表达式
x = 1; y = ++x ; //x = y = 2 先加再参与运算 y = x++ ; //x = 1, y = 2 先运算再加
//单引号字符 双引号字符串
//逻辑运算的结果是True/False,只有发生了自动类型转换才变成0/1
逻辑运算里的字符串,只有当字符串为空时是false。
- //优先级:算数表达式(++ > +) > 关系表达式(先< 、>再==) > 赋值表达式
! (结果一定是0或1) > 关系运算符 > && > ||
- // 短路求值:一旦能确定逻辑表达式的真假,就不继续执行下去了,右运算只有在左边满足某个条件时才执行.
- //if语句:1.条件可以是算数表达式、赋值表达式、变量。值为0时false,否则true
2.条件后面不能加 “;” 否则认为语句结束了
3.{别忘多个子句时用花括号括起来,否则else找不到if}
4.一个if和else算一个语句,不用花括号括也行
5.if-if语句是相互独立的,两个都要执行,除非第一个if后return。If-else语句是互斥的,if满足的话就直接跳过else部分
- //条件表达式 ? 表达式1 : 表达式2 三目运算符
cout << (flag ? “true” : “false”) << endl;
- //多分支switch语句+break 注意常量表达式里不能有变量
switch (控制表达式) //控制表达式必须为整型,包括字符型和枚举型{
case 常量表达式1 : 语句1 ; break ; //在其后加上break 跳出整个语句,否则继续向下 case 常量表达式2 : 语句2 ; //case后面可以跟复合语句,不需要{ } ...... case 常量表达式n : 语句n ; //多个表达式对应一个输出时,前面几个可以是空语句 default :语句n+1 ; //可以省略 }
- //break & continue
break 可用于while, for, do-while, switch
区分:continue是跳出当前循环周期,回到循环控制行。只能用于循环语句
- //for语句 for( ; ; )
1.循环控制行定义的变量在循环结束后就没了,不能再用了
2.i++ 不能有空格
3.不能省略分号
4.注意循环体对循环控制行的改变
5.有的题会规定不能使用循环,注意前一项能否推出后一项
6.注意边界、间隔
- //while 哨兵格式:
读入一个值; while(读入值 != 标志值) { 执行语句; 再读入一个值; }
- //do-while:
do { ... } while ( ); //别忘了分号
- //goto语句
goto 标号;
- //一维数组
1.定义:
double doubleArray1[10], doubleArray2[5];
2.元素个数不能是变量,可以是常量。
3.如果不对数组赋初值,则数值是随机的。
4.数组的初始化:
int a[10] = {0,1,2,3,4,5,6,7,8,9}; int a[10] = {0,1,2,3};//后四个元素为0 int a[ ] = {0,1,2,3};//数组的规模是4 Int a[ 10] = {0};//数组全为0
5.下标变量:下标从0开始。a[0], a[1], a[2]......下标不能是double
6.C++只保存整个数组的起始地址,不检查下标的合法性。注意避免下标越界。
7.查找:顺序查找。for循环,注意中间的语句可以为逻辑表达式。平均时间性能:(n+1)/2
二分查找。对于有序数组。变量lh, rh, mid.最坏的情况要找lb n次
8.排序:直接选择排序。时间复杂性O(n^2)
冒泡排序。比较相邻两个。理论上排序n个元素需要n-1趟起泡,但实际可能中间就排好了。注意定义一个bool看是不是冒泡结束
9.数组名是一个常量,不能放在赋值左边
10.if(a[index] > a[index++]) 错在:index自增了,而且比较了两个相等的值(先取值再自增)
11.探测数组长度:sizeof或者strlen(数组名)
12.构建不定长度的数组:std::vector / 指针 动态数组
- //二维数组
- 对每一行的部分元素赋初值:用花括号
- 引用一个值:a[i][j], 引用一行:a[i]
- 将矩阵看成回绕的,则下一行的位置:(row+1)%N, 上一行的位置:(row-1+N)%N.
- //字符串
- 数组长度是字符个数+1
- 空字符串“”占一个字节 ‘\0’
- ‘a’表示字符常量,占一字节,里面存储a的内码。“a”表示字符串,占两字节,第一字节里是a的内码,第二字节里是‘\0’
- char ch[]= “Hello, world”;(会补\0)或 char ch[]={“Hello, world”};(会补\0)或 char ch[]={‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘,’, ‘w’, ‘o’, ‘r’, ‘l’, ‘d’};(不会补\0)
- >> << 可以直接输入输出,直到遇见一个\0
- 用cin >>时不能输入空白字符。(是以空格、回车、tab为结束符)也无法控制输入的字符串长度,有可能内存溢出
- 用cin.getline(字符数组名, 数组长度, ‘.’) //结束标记也可以不指定,此时以回车作为结束
- cstring 函数:
- 字符串的比较:逐个比较内码值,直到出现不同字符或一个出现 ‘\0’。(不能直接char a[] > b[],可以用string a和b比大小。或者用函数)。比较原则是字典序.
- 定义char数组时赋初值为 ‘\0’,否则可能打印出乱码
- 字符串
char str[] = { "abcd" };sizeof(str) = 5;strlen(str) = 4 char *str = {"abcd"};sizeof(str) = 4//(或者8) strlen = 4
strlen求字符串的实际长度,不包括结束符。以\0为结束。
sizeof是求数组的分配大小。
12.string和char区别
赋值:已经定义的char数组,不可以通过ch1=ch2进行赋值,而应当使用strcpy(ch1[], ch2[]);表示将ch4赋给ch3.而string类型字符串则无此要求
合并:char[] 需要通过strcat函数实现,而string则可以通过“+”,简单实现
长度:char[]使用函数strlen获取字符串长度,string使用.size或.length获取,也可以先转换为char[]再获取长度
具体请见:
https://blog.csdn.net/gyxx1998/article/details/103038516?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166765053816782390589304%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166765053816782390589304&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-103038516-null-null.142^v63^control,201^v3^control_1,213^v1^t3_control2&utm_term=char%E5%92%8Cstring%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187
13.字符串会自动在末尾加上\0,因此长度自动加1,不能把 “LOVE”赋给一个长度为4的字符数组。字符数组最后一位不强制要求是\0,但是如果最后一位不是\0,没法用strlen函数。
- //函数
1.函数的定义:返回类型名 函数名 (形式参数表){ }
2.函数原型声明:返回类型 函数名 (形式参数说明);// ()内也可以写参数名,如(int numOfStar)
3.函数的调用:函数名 (实际参数表) ;//应避免写出与实际参数计算次序有关的调用
4.没有返回值的函数 用void
5.变量的作用域:无论何时一个函数被调用,它定义的变量都创建在一个称为栈的独立内存区域。调用函数相当于从栈中分配新的一个帧,给其中的变量分配内存空间。这个帧在其它活动函数的帧上面。函数执行结束之后回收帧。
局部变量:函数内部定义的变量,包括形式参数,其他函数不能引用。
全局变量:作用域是源文件中定义它的位置后的剩余部分。
当全局变量与局部变量同名时,在局部变量的作用域中全局变量被屏蔽。如果的确要引用全局变量,用作用域运算符 “::”
变量的存储类别:按变量在计算机内的存储位置(也称存储类别)来分,变量又分为自动变量(auto),静态变量(static),寄存器变量(register)和外部变量(extern)。变量定义格式:存储类别 数据类型 变量名表;
auto:如不专门说明。存储在栈中.
static:
register:变量不是存储在内存中,而是存储在CPU寄存器中。只有局部自动变量可以定义为寄存器变量,全局变量和静态的局部变量是不能存储在寄存器中的
extern:一定是全局变量。全局变量的作用域是从变量定义处到文件结束。如果在定义点以前的函数或另一源文件中的函数也要使用该全局变量,则在引用之前对此外部变量用关键字extern进行外部变量声明
数组作为函数的参数:
- 在函数中并没有定义新的数组(实际参数和形式参数的数组具有相同的地址)
- 对形式参数指定规模是没有意义的
- 形式参数数组不需要指定大小,[ ]内为空
- 函数如何知道数组的规模?用另一个整型参数表示
- 总结:数组传递需要两个参数,数组名和数组规模
标签:变量,double,C++,学期,char,大一上,数组,表达式,函数 From: https://www.cnblogs.com/YingJunShang/p/17763401.html