一、基本语法
1.用VC++控制台应用程序输出第一个Hello World!
(1).创建一个C++控制台应用程序ConsoleTest
(2).在源文件ConsoleTest.cpp中输入以下代码:
#include "stdafx.h" //预编译头#include <iostream>using namespace std;int main(){ cout << "Hello World!\n"; getchar(); return 0;}
cout函数用于向屏幕中输出数据,cout<<表达式1<<表达式2...<<表达式n;
如果不引入“using namespace std;”,输出语句就要写成std::cout << "Hello World!";
getchar();或者system("pause");可以避免控制台程序执行完后一闪而过看不到内容
\n是转义字符,以“\”开始,与后面连接的字符一起表示转义后的字符,这里\n表示换行
2、格式化输出
printf函数为格式输出函数:printf(格式控制,输出列表)
格式控制:是用双引号括起来的字符串,包含两种字符,一种是格式字符,以"%"字符开头,将输出的数据转化为指定的格式输出;另一种是普通字符,原样输出字符,包括双引号内的逗号、空格和换行符。
输出列表:列出要输出的一些数据,可以是变量或表达式。
例1:输出普通字符
int main(){ printf("╔═════════════════╗\n"); printf("║ ║\n"); printf("║ 您好! ║\n"); printf("║ 欢迎光临寒舍 ║\n"); printf("║ 体验C++的独特魅力 ║\n"); printf("║ ║\n"); printf("╚═════════════════╝\n"); getchar(); return 0;
}
例2:输出不同类型的数据
int main(){ int Number = 1; float Price = 98.00; printf("╔═════════════════╗\n"); printf("║ ║\n"); printf("║ VC++编程 ║\n"); printf("║ 价格: %0.2f 元 ║\n",Price); //输出实型数据 printf("║ 数量: %d 个 ║\n",Number); //输出整型数据 printf("║ ║\n"); printf("║VC++编程,价格:%0.2f元,数量:%d个 ║\n", Price,Number); //一行输出多个参数 printf("║ ║\n"); printf("╚═════════════════╝\n");
getchar(); return 0;}
%0.2f将实数输出时保留小数点后两位,否则会默认6位小数
例3:输出字符表情
int main(){ printf("╔═════════════════╗\n"); printf("║ ║\n"); printf("║ ╭︿︿︿╮ ║\n"); printf("║ {/ $ $ /} ║\n"); printf("║ ( (oo) ) ║\n"); printf("║ ︶ ︶ ︶ ║\n"); printf("║ ║\n"); printf("╚═════════════════╝\n"); getchar(); return 0;
}
例4:获取用户输入的用户名
int main(){ char Username[10]; char Password[10]; cout << "请输入用户名:\n"; cin >> Username; cout << "请输入密码:\n"; cin >> Password; cout << "╔═════════════════╗\n"; cout << "║ 登录框 ║\n"; cout << "╠════════╦════════╣\n"; cout << "║ 用户名: ║ " << Username << setw(13 - strlen(Username)) << "║\n"; cout << "╠════════╬════════╣\n"; cout << "║ 密 码: ║ " << Password << setw(13 - strlen(Password)) << "║\n"; cout << "╚════════╩════════╝\n"; getchar(); getchar(); return 0;
}
cin函数用来获取用户输入的数据,cin>>变量1>>变量2>>...>>变量n;
char Username[10]; 数组,10是数组的大小strlen(Username) 计算字符串的长度为了使边框的侧边能够全部对齐,需要判断用户输入的“用户名”和“密码”的长度,然后根据其长度补充指定数量的空格,这里用到setw函数,该函数用于插入指定数量的空格,需要引入#include <iomanip>头文件。3、格式化输入
scanf函数为格式输入函数:scanf(格式控制,输出列表)
【注】printf和scanf都是在C语言中进行输入输出的函数,C++保留了C语言的这一用法
int main( ){ int a; float b; char c; scanf("%d %c %f",&a,&c,&b); //注意在变量名前要加地址运算符& printf("a=%d,b=%f,c=%c\n",a,b,c); return 0;}
运行情况如下:12 A 67.98↙(本行为输入,输入的3个数据间以空格相间)a=12,b=67.980003,c=A(本行为输出)输入的整数12送给整型变量a,字符'A'送给字符变量c,67.98送给单精度变量bc++中scanf函数的运用:
二、运算符的使用
1、简单的字符加密
#include "stdafx.h" //预编译头#include <stdio.h>int _tmain(int argc, _TCHAR* argv[]){ int result = 1; int i; int count = 0; char Text[128] = { '\0' }; //定义一个明文字符数组,->字符数组类型 char cryptograph[128] = { '\0' }; //定义一个密文字符数组 while (1) { if (result == 1) //如果是加密明文 { printf("请输入要加密的明文:\n"); //输出字符串 scanf("%s",&Text); //获取输入的明文,->scanf在if里 count = strlen(Text); for (i = 0; i<count; i++) //遍历明文 { cryptograph[i] = Text[i] + i + 5; //设置加密字符 } cryptograph[i] = '\0'; //设置字符串结束标记,->i是在外面定义的 //输出密文信息 printf("加密后的密文是:%s\n", cryptograph); } else if (result == 2) //如果是解密字符串 { count = strlen(Text); for (i = 0; i<count; i++) //遍历密文字符串 { Text[i] = cryptograph[i] - i - 5; //设置解密字符 } Text[i] = '\0'; //设置字符串结束标记 //输出明文信息 printf("解密后的明文是:%s\n", Text); } else if (result == 3) //如果是退出系统 { break; //break语句跳出循环 } else //考虑输入的命令是1、2、3以外的字符的情况 { printf("请输入正确命令符:\n"); //输出字符串 } //输出字符串 printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n"); printf("请输入命令符:\n"); //输出字符串 scanf("%d", &result); //获取输入的命令字符 } return 0;}
\0表示空字符,作为字符串结束符使用
这里加密的方式是将字符串中的每个字符加上它在字符串中的位置和一个偏移值5,以字符串mrsoft为例,第一个字符m在字符串中的位置为0,那么它对应的密文为m+0+5,即r。在本例中,字符的加密是通过“+”运算符实现的。在C++语言中,算术运算符功能如下:
+(加法运算符)、-(减法运算符)、*(乘法运算符)、/(除法运算符)、%(求模运算符)
2、实现两个变量的互换
int _tmain(int argc, _TCHAR* argv[]){
int iVar = 18; //定义一个变量iVar,初始值为18 int jVar = 10; //定义一个变量jVar,初始值为10 cout << "╔═════════════════╗" <<endl; cout << "║ 转换前iVar = " << iVar << " ║" <<endl; //输出变量iVar cout << "║ 转换前jVar = " << jVar << " ║" << endl; //输出变量jVar cout << "╠═════════════════╣" <<endl; iVar = iVar ^ jVar; //iVar与jVar进行按位异或运算,结果赋值给iVar jVar = iVar ^ jVar; //iVar与jVar进行按位异或运算,结果赋值给jVar iVar = jVar ^ iVar; //jVar与iVar进行按位异或运算,结果赋值给iVar cout << "║ 转换后iVar = " << iVar << " ║" <<endl; //输出iVar cout << "║ 转换后jVar = " << jVar << " ║" << endl; //输出jVar cout << "╚═════════════════╝"<<endl; getchar(); return 0;}
endl的作用是换行。
一个字节分为8位,每一位可以表示一个二进制数0或1,为了能够对一个字节中的某一位或几位进行操作,C++提供了6种位运算符:
& 按位与运算 仅当两个二进制位都是1时,结果为1,否则结果为0| 按位或运算 只要有一个二进制位为1,则结果为1,当两个二进制位都是0时,结果为0^ 按位异或 两个相应的二进制位均相同,则结果为0,否则结果为1~ 按位取反 即将0转换为1,将1转换为0<< 左移运算符>> 右移运算符本例是通过3次异或运算实现的,原理如图:
规律:
异或运算有交换律规则,即A^B^C=B^C^A;
同一个数相异或,结果为0,即A^A=0;
0异或任何数,值为任何数,即0^A=A;
根据这些规则,上图不难推出。
3、简单的位运算
当a = 2, b = 4, c = 6, d = 8时,编程求 a&c,b|d,a^d,~a的值
#include "stdafx.h" //预编译头int _tmain(int argc, _TCHAR* argv[]){ unsigned result; int a = 2, b = 4, c = 6, d = 8; printf("╔═════════════════╗\n"); printf("║ a=%d,b=%d,c=%d,d=%d ║\n", a, b, c, d); //输出四个变量的值 printf("╠═════════════════╣\n"); printf("║ 输出运算结果: ║\n"); result = a & c; printf("║ a & c = %u ║\n", result); //a&c的结果赋给result result = b | d; printf("║ b | d = %u ║\n", result); //b|d的结果赋给result result = a ^ d; //a^d的结果赋给result printf("║ a ^ d = %u ║\n", result); result = ~a; //~a的结果赋给result printf("║ ~ a = %u ║\n", result); printf("╚═════════════════╝\n"); getchar(); return 0;}
如果printf("║ ~ a = %d ║\n", ~a);则输出-3
注意位运算符和逻和辑运算符的区别:
逻辑与"&&"和按位与"&";逻辑或"||"和按位或"|"4、判断性别
提到判断时,除了if语句,还可以用三目元运算符“? : ”,使用形式为:
表达式1? 表达式2:表达式3
先求表达式1的值,如果为真,则表达式2的值为整个三目元表达式的值;如果为假,则表达式3的值为整个三目元表达式的值.
条件运算符优先于赋值运算符,比关系运算符和算术运算符都低。
条件运算符的结合方向为“自右至左”。在条件运算符中,表达式1的类型可以与表达式2和表达式3的类型不同。int _tmain(int argc, _TCHAR* argv[]){ char name[20]; int sex; printf("请输入姓名:\n"); scanf("%s", &name); printf("请输入1或0,1表示男,0表示女:\n"); scanf("%d", &sex); printf("═══════════════════\n"); printf(" 姓名: %s \n", name); printf("═══════════════════\n"); char* strSex = (sex == 1) ? "男" : "女"; //char strSex = (sex == 1) ? 'M' : 'F'; printf(" 性别: %s \n", strSex); printf("═══════════════════\n"); getchar(); getchar(); return 0;}
有关char* strSex = (sex == 1) ? "男" : "女";的讲解:
双引号""代表是字符串,内存中有一个\0的占位符,字符串就必须要char*如果改为char chSex = (sex == 1) ? '男' : '女';并修改:printf(" 性别: %c \n", strSex);会出现问题的是:
因为char不能显示中文,所以将其改为char chSex = (sex == 1) ? 'M' : 'F';才行(并且单引号内最多4个字符)。要解决中文显示的问题,可以把程序改成Unicode,用wchar可以显示中文,unicode:中文和英文默认统一是16位。
5、用宏定义实现值互换
定义一个带参数的宏swap(a,b),以实现两个整数之间的交换,并利用它将一维数组a和b的值进行交换。
宏定义的语法如下:
#define 宏名(参数表) 字符串注意事项:
(1)对带参数的宏的理解是将语句中的宏名后面括号内的形参字符串代替#define命令行中的对应参数。
(2)在宏定义时,宏名和带参数的括号之间不可以加空格,否则将空格以后的字符都作为替代字符串的一部分。注意宏定义是用宏名替换字符串,但不进行正确性检查。(3)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到源文件结束。可以使用#undef命令终止宏定义的作用域。(4)在进行宏定义时,可以引用已定义的宏名,可以层层替换。在程序中用双引号包起来的字符串内的字符,不进行替换。
(5)宏定义只作字符替换,不分配内存空间。宏定义不用在行末加分号。在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。#include "stdafx.h" //预编译头#define swap(a,b) {int c;c=a;a=b;b=c;} //定义一个带参的宏swapint _tmain(int argc, _TCHAR* argv[]){ int i, j, a[10], b[10]; //定义数组及变量为基本整型 printf("请向数组a中输入10个数:\n"); for (i = 0; i < 10; i++) scanf("%d", &a[i]); //输入一组数据存到数组a中 printf("请向数组b中输入10个数:\n"); for (j = 0; j < 10; j++) scanf("%d", &b[j]); //输入一组数据存到数组b中 printf("显示数组a:\n"); for (i = 0; i < 10; i++) printf("%d,", a[i]); //输出数组a中的内容 printf("\n显示数组b:\n"); for (j = 0; j < 10; j++) printf("%d,", b[j]); //输出数组b中的内容 for (i = 0; i < 10; i++) swap(a[i], b[i]); //实现数组a与数组b对应值互换 printf("\n输出转换后的数组a:\n"); for (i = 0; i < 10; i++) printf("%d,", a[i]); //输出互换后数组a中的内容 printf("\n输出转换后的数组b:\n"); for (j = 0; j < 10; j++) printf("%d,", b[j]); //输出互换后数组b中的内容 printf("\n"); getchar(); getchar(); return 0;}
6、整数加减法练习
练习者自己选择是进行加法还是减法运算,之后输入进行多少以内的加法或减法运算,具体数值会由计算机随机产生,输入答案,计算机会根据输入的数据判断结果是否正确。
#include "stdafx.h" //预编译头#include <conio.h>#include <stdlib.h>#include <time.h>int _tmain(int argc, _TCHAR* argv[]){ int a, b, c, sign, max; //定义基本整型变量 char sign1; //定义字符型变量,保存加法/减法的符号 printf("请输入运算符(1或者其他数字,1表示:-,其他表示数字:+):\n"); scanf("%d", &sign); //输入函数,输入数据赋给sign(表示加法/减法符号的数字) printf("请输入加减时的最大范围(<10000):\n"); scanf("%d", &max); //输入函数,输入数据赋给max srand((unsigned long)time(0)); //系统时钟设定种子 a = rand() % max; //产生小于max的随机数,如果输入max值为10,则a产生0~9的10个随机整数 b = rand() % max; //产生小于max的随即数并赋给b while ((a < b) && (sign == 1)) //选择减法操作时如果a小于b则重新产生随即数 { a = rand() % max; b = rand() % max; } sign1 = (sign == 1 ? '-' : '+'); //将选择的符号赋给sign1 printf("\n%d%c%d=", a, sign1, b); scanf("%d", &c); //输入运算结果 if ((sign == 1) && (a - b == c) || (sign != 1) && (a + b == c)) //判断运算结果是否正确 printf("OK!\n"); //等于正确答案输出ok else printf("答错了!\n"); //不等于正确答案输出错误 getch(); // 相当于getchar() getchar(); return 0;}
三、条件语句
1、李白喝酒问题
李白闲来街上走,提着酒壶去买酒。遇店加一倍,见花喝一斗。店不相邻开,花不成双长。三遇店和花,喝光壶中酒。借问此壶中,原有多少酒?
分析:“遇店加一倍,见花喝一斗”,说明遇到酒店就打一倍的酒,遇到花就喝掉酒壶中的一斗酒;店不相邻开,花不成双长”,说明店和花是交替遇见的;“三遇店和花,喝光壶中酒”,说明一共遇到3次店和3次花,并在最后遇见花时,喝光了酒壶中的酒。
这道题以倒序的方法比较容易思考:
第3次遇到花时,酒壶中酒的数量为0+1=1;第3次遇到店时,酒壶中酒的数量为1/2=0.5;第2次遇到花时,酒壶中酒的数量为0.5+1=1.5;第2次遇到店时,酒壶中酒的数量为1.5/2=0.75;第1次遇到花时,酒壶中酒的数量为0.75+1=1.75;第1次遇到店时,酒壶中酒的数量为1.75/2=0.875;#include "stdafx.h" //预编译头#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ double dSum = 0; //定义一个双精度变量,记录累加和的结果 for (int i = 0; i<6; i++) //根据遇到店和花的总次数循环:“三遇店和花”,即总循环次数为6 { if (i % 2 == 0) //如果i%2等于0时为遇到花 { dSum += 1; //将酒的数量加1斗 } else //否则为遇到店 { dSum /= 2; //将酒的数量减半 } } cout << "╔═════════════════╗" << endl; cout << "║ ║" << endl; cout << "║ 酒壶中有: " << dSum << "斗 ║" << endl; //输出结果 cout << "║ ║" << endl; cout << "╚═════════════════╝" << endl; getchar(); return 0;}
if语句格式有三种形式:
(1)if(表达式)
语句;(2)if(表达式)
语句1; else 语句2;(3)if(表达式1)
语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; ... else if(表达式m) 语句m; else 语句n;依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n,然后继续执行后续程序。
3种形式的if语句中,在if后面都有“表达式”,一般为逻辑表达式或关系表达式。在执行if语句时先对表达式求解,若表达式的值为0,则按“假”处理;若表达式的值为非0,则按“真”处理,执行指定的语句。
else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
if与else后面可以包含一个或多个内嵌的操作语句,当为多个操作语句时要用“{}”将几个语句括起来成为一个复合语句。
if语句可以嵌套使用即在if语句中又包含一个或多个if语句,在使用时应注意else总是与它上面的最近的未配对的if配对。
2、桃园三结义
桃园,一个地名,三结义,表示刘关张三兄弟按照年纪大小结为异姓兄弟,在这里出现了一个属性问题,那就是对于3个数进行的大小排序。
#include "stdafx.h" //预编译头int _tmain(int argc, _TCHAR* argv[]){ int a, b, c, t; //定义4个基本整型变量a,b,c,t printf("请输入3个人的年龄:\n"); //双引号内普通字符原样输出并换行 scanf("%d%d%d", &a, &b, &c); //输入任意3个数 if (a < b) //如果a小于b,借助中间变量t实现a,b值互换 { t = a; a = b; b = t; } if (a < c) //如果a小于c,借助中间变量t实现a,c值互换 { t = a; a = c; c = t; } if (b < c) //如果b小于c,借助中间变量t实现b,c值互换 { t = b; b = c; c = t; } printf("年龄排序如下:\n"); printf("%d,%d,%d\n", a, b, c); //输出函数将a,b,c的值顺序输出 getchar(); getchar(); return 0;}
用scanf函数设置输入数据时,可以设置不同的分隔符。例如本例中的"%d%d%d",在输入时需要通过空格或回车键入每一个输入数据,最后以Enter键来表示输入结束。除了这种方式以外,也可以通过符号来分隔,如"%d,%d,%d",在参数中加入逗号",",那么在进行输入数据时,也需要通过逗号来键入每一个输入数据,如输入“25,43,14”,然后再按Enter键结束输入即可。
3、何年是润年
如果某年能被4整除,但不能被100整除;或者该年能被400整除,则该年为润年。
#include "stdafx.h" //预编译头#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ int year; //定义基本整型变量year printf("请输入年份:\n"); scanf("%d", &year); //从键盘输入表示年份的整数 printf("╔═════════════════╗\n"); printf("║ ║\n"); if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) //判断闰年条件 printf("║ %d年是闰年 ║\n", year); //满足条件的输出是闰年 else printf("║ %d年不是闰年 ║\n", year); //否则输出不是闰年 printf("║ ║\n"); printf("╚═════════════════╝\n"); getchar(); getchar(); return 0;}
逻辑与"&&"(相当于其他语言中的AND),a&&b,若a,b为真,则a&&b为真。逻辑或"||"(相当于其他语言中的OR),a||b,若a、b之一为真,则a||b为真。逻辑非"!"(相当于其他语言中的NOT),!a,若a为真,则!a为假。三者的优先次序是:!>&&>||
4、小球称重
假设你有9个球和一个天平,其中一个略微重一些,要求称最少的次数找出这个较重的球。
分析:把球编为①②③④⑤⑥⑦⑧⑨号,然后在称量时会发生以下3种情况中的一种。第一次称量时,把①②③放在天平左侧,④⑤⑥放在天平右侧,如果左端下沉,说明重球在①②③中;如果右端下沉,说明重球在④⑤⑥中;如果左右两边相等则重球在⑦⑧⑨中。
第二次称量时,取出重的一组球,把一个放在天平左侧,一个放在天平右侧,哪端下沉,则天平上的那个球重,如果两边相等则没有称的那个球重。通过以上的称量方式,就可以在两次称量中找出较重的小球。
#include "stdafx.h" //预编译头#include <iostream>using namespace std;int Weight(int iArray[], int iNum) //用于称重的函数,iNum传入球的个数{ int iRet; //定义整型变量,用于记录结果 int iVar = iNum / 3; //用于记录3等分后,每组球的个数 int jVar, mVar, nVar, kVar; //定义整型变量,用于记录每组球的重量 jVar = mVar = nVar = 0; //初始化变量的值为0 for (int i = 0; i<iVar; i++) //循环累加每组球的重量 { jVar += iArray[i]; //第1组球的重量 mVar += iArray[i + iVar]; //第2组球的重量 nVar += iArray[i + iVar * 2]; //第3组球的重量 } //声明指向整型的指针变量pArray,动态产生一个无名数组,该数组包含iVar个整型变量,该数组的起始地址保存在指针变量pArray中。 int* pArray = new int[iVar]; //开辟一块空间,记录较重的一组球 if (jVar > mVar) //如果第1组球的重量大于第2组球的重量 { kVar = 0; //设置计算因子为0 } else if (jVar < mVar) //如果第1组球的重量小于第2组球的重量 { kVar = 1; //设置计算因子为1 } else if (jVar == mVar) //如果第1组球的重量等于第2组球的重量 { kVar = 2; //设置计算因子为2 } if (iVar == 1) //如果每组的球数为1 { iRet = iVar*kVar+1; //通过计算因子计算重球的号码 } else //每组的球数大于1 { for (int j = 0; j<iVar; j++) //根据球数进行循环 { pArray[j] = iArray[j + iVar*kVar]; //记录最重的一组球 } //递归调用Weight函数,以同样分组的方法称量小球 iRet = Weight(pArray, iVar) + iVar*kVar; } delete[] pArray; //释放空间 return iRet; //返回较重的小球号码}int _tmain(int argc, _TCHAR* argv[]){ int Ball[] = { 1, 1, 1, 1, 1, 1, 1, 2, 1 }; //定义数组,存储小球重量 int iWeightBall = Weight(Ball, 3); //调用Weight函数称量小球 cout << "比较重的小球号码:" << endl; //输出字符串 cout << iWeightBall << endl; //输出较重的小球值 getchar(); return 0;}
注意:自定义的函数要放在主函数main前面,否则main函数中调用该函数时会找不到调用的函数名。
5、购物街中的商品价格竞猜
#include "stdafx.h" //预编译头
int _tmain(int argc, _TCHAR* argv[]){ float bccd = 98.0; printf("编程全能词典的单价是多少?\n"); float Price; while (1) { scanf("%f",&Price); if (Price > bccd) { printf("你猜的价格高了!\n"); getchar(); } else if (Price < bccd) { printf("你猜的价格低了!\n"); getchar(); } else { printf("回答正确,编程全能词典的单价是%0.2f元\n",Price); break; } } getchar(); getchar(); return 0;}
6、促销商品的折扣计算
switch语句:测试一组有序类型(整型、字符型、枚举型、布尔类型等)的数据,发现匹配的常量时,将执行与该常量关联的数据。
switch( 表达式)
{ case 常量1: 语句; break;case 常量2: 语句; break;......case 常量n: 语句; break;default: 语句;}其中,表达式必须是有序类型,不能是实数或字符串类型。表达式逐一与case语句部分的常量匹配,如果发现有常量与表达式相匹配,则执行当前case部分的语句,直到遇到break语句为止,或者到达switch语句的末尾(没有遇到break语句)。当表达式没有发现与之匹配的常量时,将执行default部分的代码。default语句是可选的,如果代码中没有提供default语句,并且没有常量与表达式匹配,那么switch语句将不执行任何动作。
#include "stdafx.h" //预编译头int _tmain(int argc, _TCHAR* argv[]){ printf("╔═════════════════╗\n"); printf("║ 满 500可享受9折优惠 ║\n"); printf("╠═════════════════╣\n"); printf("║ 满1000可享受8折优惠 ║\n"); printf("╠═════════════════╣\n"); printf("║ 满2000可享受7折优惠 ║\n"); printf("╠═════════════════╣\n"); printf("║ 满3000可享受6折优惠 ║\n"); printf("╠═════════════════╣\n"); printf("║ 满5000可享受5折优惠 ║\n"); printf("╚═════════════════╝\n"); printf("请输入你消费的金额:\n"); float dMoney; scanf("%f", &dMoney); int iMoney = dMoney; switch (iMoney / 500) { case 0: printf("你的消费没有折扣,金额是:%0.2f\n", dMoney); break; case 1: printf("你的消费享受9折优惠,金额是:%0.2f,优惠后的金额是:%0.2f\n", dMoney, dMoney*0.9); break; case 2: case 3: printf("你的消费享受8折优惠,金额是:%0.2f,优惠后的金额是:%0.2f\n", dMoney, dMoney*0.8); break; case 4: case 5: printf("你的消费享受7折优惠,金额是:%0.2f,优惠后的金额是:%0.2f\n", dMoney, dMoney*0.7); break; case 6: case 7: case 8: case 9: printf("你的消费享受6折优惠,金额是:%0.2f,优惠后的金额是:%0.2f\n", dMoney, dMoney*0.6); break; default: printf("你的消费享受5折优惠,金额是:%0.2f,优惠后的金额是:%0.2f\n", dMoney, dMoney*0.5); break; } getchar(); getchar(); return 0;}
在switch语句中,如果多个case常量需要进行相同的处理,那么可以将多个case语句组织在一起,中间不加break语句,使多个case语句都可以执行同一个语句块。7、利用switch语句输出倒三角形
枚举类型能够将一组枚举常量与一个枚举类型名称关联。枚举类型就像是一个常量的集中营,在这个集中营中,常量被冠名为枚举常量,如果参数以某一个枚举类型定义参数类型,那么在调用该函数时,就只有该集中营中的枚举类型作为参数通过,虽然其他常量的值和枚举常量的值可以相同,但是由于不属于当前枚举类型这个集中营,所以在作为参数调用函数时不能通过。在C++中使用关键字enum定义一个枚举类型:
enum RecordsetState{RS_OPEN,RS_WAIT,RS_CLOSE}; //定义枚举类型在定义枚举类型时,可以为各个枚举常量提供一个整数值,如果没有提供整数值,默认第一个常量值为0,第二个常量值为1,依此类推。例如上面的代码中,RS_OPEN的值为0,RS_WAIT的值为1,RS_CLOSE的值为2.
#include "stdafx.h" //预编译头#include <iostream>using namespace std;typedef enum NUMBER{ ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN };
int _tmain(int argc, _TCHAR* argv[]){ cout << "╔═══════════════╗" << endl; NUMBER num = FIVE; //定义枚举变量,并赋初值 switch (num) { case SEVEN: cout << "║ ************* ║" << endl; case SIX: cout << "║ *********** ║" << endl; case FIVE: cout << "║ ********* ║" << endl; case FOUR: cout << "║ ******* ║" << endl; case THREE: cout << "║ ***** ║" << endl; case TWO: cout << "║ *** ║" << endl; case ONE: cout << "║ * ║" << endl; } cout << "╚═══════════════╝" << endl; getchar(); return 0;}
为枚举常量赋默认值,下面的语句就是为枚举常量提供数值:
enum RecordsetState {RS_OPEN=3,RS_WAIT,RS_CLOSE=6};上面的语句将枚举常量RS_OPEN设置为3,将枚举常量RS_CLOSE设置为6,没有为RS_WAIT提供默认值,RS_WAIT的数值为前一个枚举常量值加1,因此RS_WAIT的数值为4