if语句的语法和while类似
if(test-condition)
statement
比如:假设读者希望程序计算输入的空格数和字符总数,则可以在while循环使用cing.get(char)读取字符,使用if预计识别空格字符并计算,使用.确定句尾
#includeint main(void) { using namespace std; int spaces = 0; int total = 0; char ch; cin.get(ch); while (ch != '.') { if(ch == ' ') { ++spaces; } ++total; cin.get(ch); } cout << "spaces = " << spaces << endl; cout << "total = " << total << endl; return 0; }
结果:
chararcters total in sentence.
spaces = 3
total = 31
*如果遇到的字符不是点,那是不是空格呢,前面触发点+1,后面触发空格+1
1:if else语句对比以下两个程序,感受数据提升
1)使用++ch,不会丢失char
#includeint main(void) { using namespace std; char ch; cout << "Type ,and I shall repeat.n"; cin.get(ch); while (ch!='.') { if(ch == 'n') cout << ch; else cout << ++ch; cin.get(ch); } cout << endl; return 0; }
结果:
Type ,and I shall repeat.
a
b
c
d
.
2)使用ch + 1,变成了数据类型提升,输出就是数字
#includeint main(void) { using namespace std; char ch; cout << "Type ,and I shall repeat.n"; cin.get(ch); while (ch!='.') { if(ch == 'n') cout << ch; else cout << ch + 1; cin.get(ch); } cout << endl; return 0; }
结果:
Type ,and I shall repeat.
c
100
d
101
别忘了{}
3:if else if else结构看如下程序:
#includeint main(void) { using namespace std; const int Fave = 27; int n; cout << "Enter number in the range 1-100 to find your favorite number : "; do { cin >> n;//先输入 if(n < Fave) cout << "Too low ,guess again!" << endl; else if(n > Fave) cout << "Too high ,guess again!" << endl; else cout << Fave << " is the right number." << endl; } while (n != Fave);//如果不是Fave呢 return 0; }
结果如下:
Enter number in the range 1-100 to find your favorite number : 24
Too low ,guess again!
27
27 is the right number.
*相等运算符最好这样声明!
if(3 == myNumber)
就算少写了等号,也不会报错
二、逻辑表达式逻辑运算符的优先级比关系运算符低
1:逻辑OR运算符:||满足其一就行
C++规定,||运算符是一个顺序点,如果左侧的表达式为true,则C++不会去判定右侧表达式
看下程序:
#include2:逻辑AND运算符:&&int main(void) { using namespace std; cout << "This program may reformat your hard disk n" "and destroy all your data. n" "do you wish to continue? "; char ch; cin >> ch; if(ch=='y' || ch == 'Y') cout << "You were warned!" << endl; else if(ch == 'n' || ch == 'N') cout << "A wise choise.." << endl; else cout << "That wasn't a y or n!" << endl; return 0; }
必须同时满足
如果左侧为false,则整个逻辑表达式必定为false,在这种情况下,C++不会对右侧进行判定了
看下程序:
#includeconst int ArSize = 6; int main(void) { using namespace std; float value[ArSize]; float temp; int i; cout << "Enter six numbers and campare with your level:" << endl; cout << "Terminate condition: when you make 6 numbers or enter a nagative number" << endl; cout << "First value: "; cin >>temp; while (i < ArSize && temp >= 0) { value[i] = temp; ++i; if (i < ArSize) { cout << "Next value:"; cin >> temp; } } if (i == 0) { cout << "No date--byte." << endl; } else { cout << "Enter your level: "; float level; cin >> level; int count = 0; for (int j = 0; j < i; j++) { if (value[j] > level) count++; } cout << count << " numbers are bigger than your level" << endl; } return 0; }
结果如下:
Enter six numbers and campare with your level:
Terminate condition: when you make 6 numbers or enter a nagative number
First value: 12
Next value:55
Next value:5
Next value:6
Next value:5
Next value:43
Enter your level: 10
3 numbers are bigger than your level
*程序说明
1)声明一个浮点型的数组,大小为6,初始化一个浮点型的数,用于捕获和存放
2)while循环就是为了提醒和存放数据
3)存放完成后,后面定义一个float标准进行比较
4)出现负数直接返回
3:用&&来设置取值范围使用if (age >17 && age < 35)而不是if (17 < age < 35) !
看下例:
#includeint main(void) { using namespace std; const char *qualify[] = { "Perfect","Great","Good","Just soso","failed" }; int score; int index; cout << "Enter your score: "; cin >> score; if(score >= 90 && score <= 100) { index = 0; } else if (score >= 80 && score < 90) { index = 1; } else if(score >= 70 && score < 80) { index = 2; } else if(score >= 60 && score < 70) { index = 3; } else index = 4; cout << "Your qualify: " << qualify[index] << endl; return 0; }
结果:
Enter your score: 96
Your qualify: Perfect
*用了index,这样就减少了代码量,不然每一行都输出你的成绩,比较麻烦
4:逻辑NOT运算符:!!运算符的优先级高于所有的关系运算符和算术运算符的,记得加()。
看代码
#include#include bool is_int(double x);//记得声明函数啊,不然没法用哦 int main(void) { using namespace std; double num; cout << "Enter an interger value: "; cin >> num; while (!is_int(num))//如果不是int,就重新输入 { cout << "Out of range, please enter again: "; cin >> num; } int value = int(num);//否则就输出强制转换为int类型的number cout << "You have enter an interger: " << value << endl; return 0; } bool is_int(double x) //定义了一个bool类型的判断是否是int的函数,参数是double,返回值是bool { if(x<= INT_MAX && x >= INT_MIN) //如果输入在int的最大最小范围之内,就确定是int return true; else return false; }
结果:
Enter an interger value: 10000000000000
Out of range, please enter again: 10
You have enter an interger: 10
*
1)记得引用函数
2)记得类型转换
5:逻辑运算符细节&&运算符的优先级高于||
三、字符函数库cctype这个头文件还是很好用的,能判断你输入的是不是字母,数组,控制符,小写,大写,标点,十六进制等。。
写个代码:
#include#include //这就是很好用的那个玩意儿 int main(void) { using namespace std; int whitespace = 0; int digits = 0; int chars = 0; int punch = 0; int others = 0; char ch; cout << "Enter text for analysis , and @ to terminate the input." << endl; cin.get(ch); while (ch != '@') { if(isalpha(ch)) chars++; else if(isspace(ch)) whitespace++; else if(isdigit(ch)) digits++; else if(ispunct(ch)) punch++; else others++; cin.get(ch); } cout << chars << " letters," << whitespace << " whitespaces," << digits << " digits," << punch << " punchs," << others << " others." << endl; return 0; }
结果:
Enter text for analysis , and @ to terminate the input.
My dinner with Andre, scheduled for 2013.
@
29 letters,7 whitespaces,4 digits,2 punchs,0 others.
*就是调用了cctype头文件,能够判断大小写字母数字字符空格什么的
四、?:运算符(条件运算符)C++ 有一个长被用来代替if else语句的运算符,这个运算符被称为条件运算符(?:),它是C++中唯一一个需要3个操作数的运算符。通用格式如下:
expression1 ? expression2 : expression3
如果1为true,则整个条件表达式的值为2,否则就是3
常见用法,见以下代码:
#includeint main(void) { using namespace std; int a,b; int c; cout << "Enter two intergers: n"; cin >> a >> b; c = a > b ? a : b; cout << c; return 0; }
结果:
Enter two intergers:
10
20
20
对于比较复杂的条件语句,用if else更好,如果指示简单的关系表达式,用?:(条件表达式)更方便。
五、Switch语句Switch语句更能够容易从大型列表中进行选择
Switch (integer - expression)
{
case 1 :statement
case 2:statement
...
default : statement
}
程序不会在执行到下一个case处自动停止,要让程序执行完一组特定语句后停止,必须使用break语句,这将导致程序switch后面的语句处执行!
以下程序会演示switch和break
#includeusing namespace std; void showmenu(void); void report(void); void comfort(void); int main(void) { showmenu(); int choice; cin >> choice; while (choice != 5) { switch (choice) { case 1: cout << "an"; break; case 2: report(); break; case 3: cout << "boss was in all day.n"; break; case 4: comfort(); break; default: cout << "That's not a choicen"; break; } showmenu(); cin >> choice; } cout << "Bye!n"; return 0; } void showmenu(void) { cout << "Please enter 1,2,3,4,5 as your choice:" << endl; cout << "1) alarm 2) report" << endl; cout << "3) alibi 3) comfort" << endl; cout << "5) quit" << endl; } void report(void) { cout << "It has been an excellet week for bussiness.n"; } void comfort(void) { cout << "in the industry. The board of directors thinkn"; }
运行结果如下:
Please enter 1,2,3,4,5 as your choice:
1) alarm 2) report
3) alibi 3) comfort
5) quit
1
Please enter 1,2,3,4,5 as your choice:
1) alarm 2) report
3) alibi 3) comfort
5) quit
2
It has been an excellet week for bussiness.
Please enter 1,2,3,4,5 as your choice:
1) alarm 2) report
3) alibi 3) comfort
5) quit
3
boss was in all day.
Please enter 1,2,3,4,5 as your choice:
1) alarm 2) report
3) alibi 3) comfort
5) quit
4
in the industry. The board of directors think
Please enter 1,2,3,4,5 as your choice:
1) alarm 2) report
3) alibi 3) comfort
5) quit
5
Bye!
*
1)定义了三个没有参数没有返回值的方法
2)switch 记得要加break
3)函数记得引用
如果没有break,它就会一直执行下去,有时候其实也有用
1:将枚举量作为标签定义一个枚举,然后在switch里面直接用就行了,见下面程序
#includeenum {red,orange,yellow,green,blue,violet,indigo};//定义枚举量 int main(void) { using namespace std; int code; cout << "Enter color code(0~6):"; cin >> code; while(code >= red && code <= indigo) { switch (code) { case red: cout << "You choose red!" << endl; break; case orange: cout << "You choose orange!" << endl; break; case yellow: cout << "You choose yellow!" << endl; break; case green: cout << "You choose red!" << endl; break; case blue: cout << "You choose blue!" << endl; break; case violet: cout << "You choose violet!" << endl; break; case indigo: cout << "You choose indogo!" << endl; break; } cout << "Enter color code(0~6):"; cin >> code; } cout << "Bye!" << endl; return 0; }
结果:
Enter color code(0~6):0
You choose red!
Enter color code(0~6):1
You choose orange!
Enter color code(0~6):2
You choose yellow!
Enter color code(0~6):3
You choose red!
Enter color code(0~6):4
You choose blue!
Enter color code(0~6):5
You choose violet!
Enter color code(0~6):6
You choose indogo!
Enter color code(0~6):8
Bye!
*里面不用default了,因为就那么点变量,while跳出来以后再进行选择
2:switch和if elseif lese更适合处理取值范围
switch语句每个标签都是单独的值,必须是整数或者char,不能判断浮点型,更不能判断取值范围了
六、break和continue语句break和continue都能使程序跳过部分代码
但是break是跳过当前循环,continue是跳过循环体剩下的语句,直接进行下一轮循环
下面的程序是演示两条语句是如何工作的
#includeconst int ArSize = 80; int main(void) { using namespace std; char line[ArSize]; int spaces = 0; cout << "Enter a line of text:" << endl; cin.get(line,ArSize); cout << "Complete line: " << line << endl; for(int i = 0; line[i] != ' '; i++) { cout << line[i]; if(line[i]=='.') break; //如果找到句号,直接就跳出循环 if(line[i]!=' ') continue;//如果没有找到空格,直接跳出循环 spaces++; } cout << endl; cout << "Spaces = " << spaces << endl; return 0; }
结果:
Enter a line of text:
hello world.good morning
Complete line: hello world.good morning
hello world.
Spaces = 1
*
1)如果执行了continue,后面的space++就不执行了,直接跳到i++部分
2)比如说,我们第一个字符是h,对于h,先会打印出来,然后到if,它不是句号,所以不会break,紧接着到了下一个if语句,它如果不是空格,那么就会执行continue而跳过space++,直接到下一个i。
七、读取数字的循环当我们使用cin进行输入数字时,如果不小心输入了字母,单词,就会发生如下情况:
·n值保持不变
·不匹配的输出留在队列中
·cin对象中的一个错误标记被设置
·对cin方法调用返回false
那如何解决呢??
看下例直接:
#includeusing namespace std; int main(void) { int num1,num2; cout << "First num: "; cin >> num1; cin.clear();//reset input while (cin.get()!='n'); cout << "Second num: "; cin >> num2; cout << "num1 = " << num1 << ", num2 = " << num2 << endl; return 0; }
结果:
First num: xyz
Second num: 2
num1 = 0, num2 = 2
*
1)使用cin.clear()方法来重置输入
2)把留在队列的错误输入值使用while(cin.get()!='n')来重置
再看个捕鱼的例子:
#includeconst int Max = 5; using namespace std; int main(void) { double fish[Max]; cout << "Please enter the weight of your fish:" << endl; cout << "You may enter up to " << Max << " fish to terminate." << endl; cout << "fish #1 n"; int i = 0; while (i < Max && cin >> fish[i]) //第二个条件的意思是你输入的必须要满足它是重量,如果是其他类型直接跳出 { if(++i < Max) cout << "fish # " << i+1 << ": " << endl; } double total = 0.0; for (int j = 0; j < i; j++) //这个意思是,你录入多少条,就输出多少条,并不是Max { total += fish[j];//这里是j不是i } cout << "total =" << total << endl; if (i == 0) { cout << "No fish" << endl; } else cout << "Average weight of " << i << " fish: " << total / i << endl; return 0; }
结果:
Please enter the weight of your fish:
You may enter up to 5 fish to terminate.
fish #1
2.3
fish # 2:
3.2
fish # 3:
4.4
fish # 4:
1.2
fish # 5:
3.3
total =14.4
Average weight of 5 fish: 2.88
*
那如果输入错误,应该采取哪种措施呢?
·重置cin以接受新的输入
·删除无效输入
·提示用户输入新的输入
那我们看下面的程序:读取高尔夫得分,并计算平均得分,如果输入错误,会提示输入错误,重新输入。
#includeconst int Max = 5; using namespace std; int main(void) { int golf[Max]; cout << "Please enter your golf scores:n"; cout << "You must enter " << Max << " rounds.n" ; int i; for (i = 0; i < Max; i++) { cout << "Round" << i+1 << ":" << endl; while(!(cin >> golf[i]))//这里取反就是说,输入的不是数字,而是其他类型 { cin.clear(); while(cin.get() != 'n') //删除用户的信息,消耗掉回车前的信息,用get() continue;//跳出while循环 cout << "Please enter a number : n"; } } double total = 0; for (i= 0; i < Max; i++) { total += golf[i]; } cout << "The average score is : " << total / Max << "." << endl; return 0; }
结果如下:
Please enter your golf scores:
You must enter 5 rounds.
Round1:
22
Round2:
33
Round3:
ad
Please enter a number :
22
Round4:
dd
Please enter a number :
11
Round5:
22
The average score is : 22.
*注意while那块的continue,如果不加的话,会输出三遍“please enter a number”
八、简单文件输入/输出不能总要通过键盘输入,假设从文件导入数据会更好,这里先介绍简单的文本文件I/O
1:文本I/O和文本文件使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。不管目标数据类型是什么,输入一开始都是字符数据——文本数据,然后cin对象负责将文本转换为其他其他类型。我们来看下是如何进行的。
假设有如下示例输入行:
38.5 19.2
首先来看使用char数据类型的情况:
char ch;
cin >> ch;
输入行中的第一个字符被赋给ch,第一个字符是数字3,其二进制编码被存储在变量ch中。
输入和目标变量都是字符,因此不需要进行转换。注意这里存储的不是数值3,而是3的编码
对于int类型:
int n;
cin >> n;
cin会不断读取,直到遇到非数字字符
也就是说,它读取3和8,这样句点将称为输入队列中的下一个字符。cin通过计算发现,这两个字符对应数值38,因此将38的二进制编码复制到变量n中
对于double类型:
double x;
cin >> x;
cin不断读取,直到遇到第一个不属于浮点数的字符
cin读取3,8,句号和5,使得空格称为输入队列中的下一个字符,所以会把38.5的二进制编码复制到x中
对于char数组类型
char word[50];
cin >> wordk;
cin将不断读取,直到遇到空白字符
所以会读取3、8、点和5,使得空格称为输入队列中的下一个字符。存储的是'3','8','.'
然后cin将这4个字符编码存储到数组word中,并在末尾加上一个
最后看另一种char数组存储情况
char word[50]
cin.getline(word,50);
这种情况下,cin将一直读取,直到遇到换行符
所有字符都会被存储到数组word中,并在末尾加上一个空字符,换行符被丢弃,输入队列中的下一个字符是下一行中的第一个字符,这里不需要进行任何转换(存进去的都是字符)
本章讨论的文件IO相当于控制台IO,因此仅适用于文本文件
2:写入到文本文件中再复习以下cout的东西
·必须包含头文件iostream
·头文件iostream定义了一个用于处理输出的ostream类
·头文件iostream声明了一个名为cout的ostream变量
·必须有命名空间std
·结合cout和运算符 <<来显示各种信息
文件输出和它非常类似
·必须包含头文件fstream
·头文件fstream定义了一个用于处理输出的ofstream类
·需要声明一个或多个ofstream对象,并以自己喜欢的方式对其进行命名,条件是遵守常用的命名规则
·必须使用命名空间std
·需要将ofstream对象和文件关联起来,为此,方法之一是使用open()方法
·使用完了后,应该使用close()关闭
·可以结合使用ofstream对象和运算符<<来输出各种类型的数据
下列代码演示了这种方法:
#include#include using namespace std; int main(void) { char automobile[50]; int year; double a_price; double d_price; ofstream outFile;//1.创建一个输出文件流的对象 outFile.open("carinfo.txt"); //2.使用outfile创建文本文件 cout << "Enter the make and model of automobile: "; cin.getline(automobile,50); cout << "Enter the model year: "; cin >> year; cout << "Enter the orignal asking price: "; cin >> a_price; d_price = a_price * 0.913; cout << "Make and model: " << automobile << endl; cout << "Year: " << year << endl; cout << "Was asking: " << a_price << endl; cout << "Now asking: " << d_price << endl; outFile << "Make and model: " << automobile << endl; outFile << "Year : " << year << endl; outFile << "Was asking: " << a_price << endl; outFile << "Now asking: " << d_price << endl; return 0; }
*
1)文件流中并没有预先创建好类似cin和cout之类的对象,需要自己创建,它由ofstream和ifstream组成
2)ofstream创建,然后调用open方法
3)调用完了以后,使用cout类似的方法,使用outFile方法就行了
结果如下:
Enter the make and model of automobile: Flitz Perky
Enter the model year: 2009
Enter the orignal asking price: 13500
Make and model: Flitz Perky
Year: 2009
Was asking: 13500
Now asking: 12325.5
同时生成了carinfo的文本文件
但是这里的Was asking里面只显示了一位,如何能让他显示小数点后两位呢?
下面使用fixed修正:
#include#include //文件流中并没有预先创建好类似cin和cout之类的对象,需要自己创建,它由ofstream和ifstream using namespace std; int main(void) { char automobile[50]; int year; double a_price; double d_price; ofstream outFile;//1.创建一个输出文件流的对象 outFile.open("carinfo.txt"); //2.使用outfile创建文本文件 cout << "Enter the make and model of automobile: "; cin.getline(automobile,50); cout << "Enter the model year: "; cin >> year; cout << "Enter the orignal asking price: "; cin >> a_price; d_price = a_price * 0.913; cout << "Make and model: " << automobile << endl; cout << "Year: " << year << endl; cout << "Was asking: " << a_price << endl; cout << "Now asking: " << d_price << endl; outFile << "Make and model: " << automobile << endl; outFile << "Year : " << year << endl; outFile << "Was asking: " << a_price << endl; outFile << "Now asking: " << d_price << endl; cout << fixed; cout.precision(2);//显示两位 cout.setf(ios_base::showpoint); cout << "Make and model: " << automobile << endl; cout << "Year: " << year << endl; cout << "Was asking: " << a_price << endl; cout << "Now asking: " << d_price << endl; outFile << fixed; outFile.precision(2);//显示两位 outFile.setf(ios_base::showpoint); outFile << "Make and model: " << automobile << endl; outFile << "Year: " << year << endl; outFile << "Was asking: " << a_price << endl; outFile << "Now asking: " << d_price << endl; return 0; }
显示如下:
Enter the make and model of automobile: Nissan
Enter the model year: 2011
Enter the orignal asking price: 200000
Make and model: Nissan
Year: 2011
Was asking: 200000
Now asking: 182600
Make and model: Nissan
Year: 2011
Was asking: 200000.00
Now asking: 182600.00
再来看文本文件:
从文本内容可以看得出来,并不是追加文件,而是把原来的内容删除了,重新写入
3:读取文本文件再跟cin对比以下:
文本输入:
·必须包含头文件iostream
·头文件iostream定义一个用于处理输入的istream类
·头文件iostream声明一个名为cin的istream变量
·必须写出命名空间std
·结合>>来读取各种类型数据
·使用cin的方法get()和getling()方法读取一行
·可以结合使用cin和eof()、fail()方法来判断输入是否成功
·对象cin本身被用作测试条件时,如果最后一个读取操作成功,会被转换为Bool的true。
文件输入:
·头文件包含fstream
·头文件fstream定义一个用于处理输入的ifstream类
·需要声明一个或多个ifstream变量,并命名
·指出命名空间std
·需要将ifstream对象和文件关联起来,方法之一是open()方法
·使用完了用close()关闭
·结合ifstream对象和运算符>>读取各种数据类型
·可以使用get()或getline()方法
·可以结合使用cin和eof()、fail()方法来判断输入是否成功
·对象ifstream本身被用作测试条件时,如果最后一个读取操作成功,会被转换为Bool的true。
代码如下:
#include#include #include const int SIZE = 60; using namespace std; int main(void) { char filename[SIZE]; ifstream inFile; cout << "Enter name of data file: "; cin.getline(filename,SIZE); inFile.open(filename); if(!inFile.is_open())//如果不能打开就打开失败,退出 { cout << "could not open the file " << filename << endl; cout << "Program terminating." << endl; exit(EXIT_FAILURE); } cout << "Success open the txt file." << endl;//记得别忘了后缀txt double value; double sum = 0.0; int count = 0; inFile >> value; while (inFile.good())//如果从文件当中能读取数据,一直到读取不到,就退出循环 { ++count; sum += value; inFile >> value; } if (inFile.eof())//end of file,读取到文件末尾,判断文末必须有 { cout << "End of file!" << endl; } else if(inFile.fail())//如果读取失败 cout << "Input terminater by data mismachted." << endl; if(count == 0) cout << "No data processed." << endl; else { cout << "Items read: " << count << endl; cout << "Sum = " << sum << endl; cout << "Average: " << sum / count << endl; } inFile.close(); return 0; }
*
1)声明fstream头文件,然后使用ifstream类,创建一个对象,然后调用open()方法
2)判断是否打开,使用is_open()方法,如果不能打开就使用exit()方法,它位于cstrlib头文件中
3)使用while循环使用good()方法,看能否从文件中读取数据
4)判断是否到文件尾,使用eof方法
5)读取失败使用inFail中的fail()方法
6)如果数量太少的话,比如时0,就返回没有值
运行结果:
Enter name of data file: 6-19file.txt
Success open the txt file.
End of file!
Items read: 11
Sum = 186.9
Average: 16.9909
1:
同样进入while循环
第一种执行完if语句之后,会重新检测一遍ch中的字符
而第二种执行完if语句后,会把其中的空格部分都去掉,避免了重复检测
2:在如下代码中,如果用ch+1替换++ch有什么变化?
解:我们的输入是字符,主要部分的目的是把字符向前一位
如果++ch变成ch+1,那就会变成数字,而不是字符
3:请阅读以下代码,假设输入如下:
Hi!
Send $10 or $20 now!
则输出将是什么?
定义char型和整型ct1和ct2,然后进入while循环
如果输入的字符不是’$‘,那么就进入循环,打印出这个字符,然后ct2++
后面的if语句里面是赋值,把$给了ch,所以永远为真,ct2++,然后输出$,就往复循环,直到while的条件不满足,即碰到$就停止,然后输出ct1,ct2
H$i$!$
$S$e$n$d$ $ ,这时候碰到了$,停止while循环,跳出,打印ch1,ch2
此时输出ch1和ch2=9;
4:创建表示下述条件的逻辑表达式:
a:weight大于或等于115,但是小于125
weight >=115 && weight < 125;
b:ch为q或Q
ch ='q' || 'Q';
c:x为偶数,但不是26
(x%2)=0 && (x != 26),注意偶数的表达方式
d:x为偶数,但不是26倍数
(x%2)= 0 && (x % 26 != 0),注意不是倍数的表达方式
e:donation为1000-2000或guest为1
(donation >= 1000 && donation <= 2000) || (guest == 1)
f:ch是小写字母或大写字母(假设小写字母和大写字母是依次编码的,但在大小写之间编码不是连续的)
(ch >= a" && ch <= z") || (ch >= A" && ch <= Z")
5:在英语中,“i will not speak”的意思和"i will speak"相同,在C++中,!!x和 x是否相同呢?
如果x是bool类型是OK的
如果x是int,那么!x就true,再取反变成false,然后变成true,所以不行
6:创建一个条件表达式,其值为变量的绝对值。也是说,如果变量x为正,则表达式的值为x,但是如果x为负,则表达式的值为-x——这是一个正值
int x;
if(x >= 0)
cout << x;
else
cout << -x;
但是推荐用条件表达式,对于这种比较简单的判断式:
(x >=0) : x ? -x
7:用switch语句改写下面代码:
switch (ch)
{
case 'A':
a_grade++;
break;
case 'B':
b_grade++;
break;
case 'C':
c_grade++;
break;
case 'D':
d_grade++;
break;
default:
break;
}
8:对于如下程序,与使用数字相比,使用字符(如a或c),表示菜单选项和case标签有何优势呢?(比如用户输入q或5)
#includeusing namespace std; int main(void) { showmenu(); int choice; cin >> choice; while (choice != 5) { switch (choice) { case 1: cout << "an"; break; case 2: report(); break; case 3: cout << "boss was in all day.n"; break; case 4: comfort(); break; default: cout << "That's not a choicen"; break; }
1)choice定义为int类型,那么你输入12345,其实是先把字符12345转化成int类型存放到choice里面
然后choice再和12345对比,如果你此时输入的是整型,那没有什么问题,但是如果输入的是字符,那么程序就会出问题
2)但是如果定义为char型,那么无论输入的是数字还是字母,都不会有问题
如下:
char choice;
cin >> choice;
while (choice != '5')//修改为字符5
{
switch (choice)
{
case '1':
cout << "an";
break;
case '2':
report();
break;
case '3':
cout << "boss was in all day.n";
break;
case '4':
comfort();
break;
default:
cout << "That's not a choicen";
break;
}
如果是这样的,输入字符也不会有任何问题
9:看如下代码:
请重写该代码,不要使用break和continue语句
int line = 0;
char ch;
while(cin.get(ch) && ch != 'Q')
{
if(ch == 'n')
line++;
}
2:编程练习1:编写一个小程序,读取键盘输入,直到遇到@符号为止,并回显(数字除外),同时将大写字符转换为小写。将小写字符转换为大写(cctype函数)
#include#include using namespace std; int main(void) { char ch; cout << "Please enter a character: "; cin >> ch; if (ch == '@') { cout << ch << endl; } else if (isdigit(ch)) cin >> ch; else if(islower(ch)) { ch = toupper(ch); } else { ch = tolower(ch); } cout << ch; cin >> ch; return 0; }
*
1)cctype头文件
2)isdigit()判断数组,islower()判断小写,issupper()判断大写
3)tolower()大转小,toupper()小转大
2:编写一个程序,最多将10个donation值读入到一个double数组中,程序遇到非数字输入时将结束输入,并报告这些数字的平均值及数组中有多少个数大于平均值。
#include#include using namespace std; const int SIZE =10; int main(void) { array donation; double input; int count = 0; double sum = 0.0; double average; int bigger; cout << "Please enter the double numerial: "; while ((cin >> input)) donation[count++] = input; if(count == 10) break; cout << "Please enter the double numerial: "; } for (int i = 0; i < count; i++) { sum += donation[i]; } average = sum / count; for (int i = 0; i < count; i++) { if (donation[i] > average) { bigger++; } } cout << "Average = " << average << "," << bigger << " numbers are bigger than averager. " << endl; return 0; }
结果:
Please enter the double numerial: 12.5
Please enter the double numerial: 12.1
Please enter the double numerial: a
Average = 12.3,1 numbers are bigger than averager.
*
注意判断是不是字母那块,不用isdigit判断,其实光写cin >> input就够了,因为如果你输入的东西放不到double里面去,说明它不是数字
3:编写一个菜单驱动程序的雏形。该程序显示一个提供4个选项的菜单——每个选项用一个字母标记。然后用户使用有效选项之外的字母进行响应,程序将提示用户输入一个有效的字母,直到用户这样做为止。
然后该程序使用一条switch语句,根据用户的选择执行一个简单的操作。该程序运行如下:
#includeusing namespace std; void showmenu(void); int main(void) { char ch; showmenu(); cin >> ch;//也可cin.get() while (ch != 'c' && ch!= 'p' && ch != 't' && ch!='g') { cin.get();//消耗上面的回车字符 cout << "Please enter a character: c,p,t,g: " ; cin >> ch; } switch (ch) { case 'c': break; case 'p': break; case 't': break; case 'g': cout << "A map is a tree." << endl; default: break; } return 0; } void showmenu(void)//菜单函数 { cout << "Please enter one of the following choices: " << endl; cout << "c) carnivorett p)pianist" << endl; cout << "t) treettt g) game" << endl; }
结果如下:
Please enter one of the following choices:
c) carnivore p)pianist
t) tree g) game
a
Please enter a character: c,p,t,g: b
Please enter a character: c,p,t,g: g
A map is a tree.
*
1)一个选择提示,调用menu函数
2)switch语句,选择操作
3)捕获输入
4:加入Benevolent Order of Programmer后,在BOP大会上,人们便可以通过加入者的真实姓名、头衔或秘密BOP姓名来了解它。
请编写一个程序,可以使用真实姓名,头衔,秘密姓名或成员偏好来列出成员。请使用以下结构:
该程序创建一个由上述结构组成的小型数组,并将其初始化为适当的值,另外,使用一个循环,让用户在下面的选项中进行选择:
注意:"display by the preference"并不意味着显示成员偏好,而是意味着根据成员偏好来列出成员。
例如:如果偏好为1,则选择d将显示程序员的头衔。该程序运行情况如下:
程序如下:
#includeusing namespace std; const int strsize = 20; const int usersize = 4; void showmenu(void); void print_by_fullname(void); void print_by_title(void); void print_by_bopname(void); void print_by_preference(void); struct bop { char fullname[strsize]; char title[strsize]; char bopname[strsize]; int preference; }; bop user[usersize] = {{"Rick","Level_A","RR",0},{"Jack","Lever_B","JJ",1},{"Micheal","Lever_C","MM",2},{"Rose","Lever_D","RR",3}}; int main(void) { showmenu(); char input; cin >> input; while (input!= 'q') { switch (input) { case 'a': print_by_fullname(); break; case 'b': print_by_title(); break; case 'c': print_by_bopname(); break; case 'd': print_by_preference(); break; default: cout << "Please enter character a,b,c,d,q:" << endl; //把判断条件放到default也是不错的 } cin.get(); cout << "Next input: "; cin >> input; } cout << "Bye!" << endl; return 0; } void showmenu(void) //菜单函数 { cout << "Benevolent Order of Programmers Report " << endl; cout << "a) display by namett b)display by title" << endl; cout << "c) display by bopnamettt g) display by preference" << endl; cout << "q) quit " << endl; } void print_by_fullname(void) { for (int i = 0; i < usersize; i++) { cout << user[i].fullname << endl; } } void print_by_title(void) { for (int i = 0; i < usersize; i++) { cout << user[i].title << endl; } } void print_by_bopname(void) { for (int i = 0; i < usersize; i++) { cout << user[i].bopname << endl; } } void print_by_preference(void) { for(int i = 0; i < usersize; i++) { switch (user[i].preference) { case 0: cout << user[i].fullname << endl; break; case 1: cout << user[i].title << endl; break; case 2: cout << user[i].bopname << endl; break; default: break; } } }
结果:
Benevolent Order of Programmers Report
a) display by name b)display by title
c) display by bopname g) display by preference
q) quit
a
Rick
Jack
Micheal
Rose
Next input: b
Level_A
Lever_B
Lever_C
Lever_D
Next input: c
RR
JJ
MM
RR
Next input: d
0
1
2
3
Next input: q
Bye!
*
1)在switch的时候把判断条件放到default也是不错的,这样就不用在while中写太多
2)注意main定义的数组在main外部无法访问的,一定要记住
3)创建结构,创建结构数组,创建while-switch循环,创建外部函数,访问完了要消耗
5:在Neutronia王国,货币的单位是tvarp,收入所得税计算方式如下:
5000 trarps:不收税
5001~15000 tvarps: 10%
15001~35000 tvarps: 15%
35000 tvarps+: 20%
请编写一个语句,使用循环来要求用户输入收入,并报告所得税,输入负数或者非数字结束循环。
例如输入38000,所得税5000×0.00+10000×0.10+20000×0.15+3000×0.20,即4600.
程序:



