一.if语句常见错误
互相矛盾的多个条件,如果确实只希望执行其中的一个分支,应该用if和多个else if,而不要写多个if
二.switch语句
switch(表达式){//表达式的值 必须是整数类型(int,char.........)
case 常量表达式1://常量表达式必须是整数类型的常量(int,char....)
语句组1
break;
case 常量表达式2:
语句组2
break;
...............
case 常量表达式n:
语句组n
break;
default:
语句组n+1
1."表达式“的值等于哪个”常量表达式“,就执行相应的语句组。都不相等,则执行default的语句组。也可以没有default分支”常量表达式“里面不能包含变量
2.switch语句在进入某个case分支,会一直执行到第一个碰到的”break;”,即使这个“break;”是在后面的case分支里面。如果没有碰到“break;”则会向下一一直执行到switch语句末尾的“}”,包括default:部分的语句组也会被执行
三,for循环语句
例:写一个程序,输入一个正整数n,从小到大输出它的所有因子
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i)
if(n%i==0)
cout<<i<<endl;
return 0;
}
四,break语句
例:如果两个不同的正整数,他们的和是他们的积的因子,就称这两个数为兄弟数,小的称为弟数,大的称为兄数。先后输入正整数n和m(n<m),请在n至m-n+1个数中,找出一对兄弟数。如果找不到,就输出“No Solution."如果能找到,就找出最小的那一对;如果有多对兄弟数和相同都是最小,就找出弟数最小的那一对 //穷举
#include<iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int a=m+1,b=m+1;
for(int i=n;i<m;++i)//取弟数
if(i>(a+b)/2+1)
break;
for(int j=i+1;j<=m;++j){
if(i+j>a+b)break;
if(i*j%(i+j)==0){
if(i+j<a+b){
a=i;b=j;}
else if(i+j==a+b&&i<a)
a=i;b=j;
}
}
}
}
}
五,scanf表达式的值
1.scanf(....)表达式的值为int,表示成功读入变量的个数
int n,m;
printf("%d",scanf("%d%d",&n,&m));//输出的是scanf的返回值
输入:12 56
输出:2
输入:40 a
输出:1
输入:a 40
输出:0
2.scanf(...)值为EOF(即-1)则说明输入的数据已经结束
int n,m;
while(scanf("%d%D",&n,&m)!=EOF)或while(scanf("%d%d",&n,&m)==2)
{ //EOF是直接能拿来用的符号常量
printf("%d",n+m);
}
不停的输入两个整数再敲回车,则不停输出它们的和,直到在单独一行输入Ctrl+Z然后回车,程序就会结束(单独一行的Ctrl+Z表示输入结束)注意:Mac OS或Linux系统下是ctrl+D或ctrl+W
六,cin表达式的值
cin>>m>>n...表达式的值,在成功读入所有变量时为true,否则为false
int n,m;
while(cin>>n>>m){
printf("%d",n+m);
}
例;处理无结束标记的题目
输入若干个正整数,输出其中的最大值
#include<iostream>
using namespace std;
int main(){
int n,mx=0;
while(scanf("%d",&n)!=EOF)或while(scanf("%d",&n)==1)或while(cin>>n)
{ if(n>mx)
mx=n;}
printf("%d",mx);
return 0;}
七,用freopen重定向输入
1.调试程序时,每次运行程序都要输入测试数据,太麻烦
2.可以将测试数据存入文件,然后用freopen将输入由键盘重定向为文件,则运行程序时不再需要输入数据了
#include<iostream>
using namespace std;
int main(){
freopen("c:\\tmp\\test.txt","r",stdin);注意提交题目要注释掉
//所有输入文件都来自文件c:\tmp\test.txt
int n,mx=0;
while(cin>>n){
if(n>mx)
if(n>mx)
mx=n;}
printf("%d",mx);
printf("%d",mx);
return 0;}
八,数组越界
1.用变量作为数组下标时,不小心会导致数组越界(变量下标值变为负数,或者太大)
2.可能引起意外修改其他变量的值,导致程序运行结果不正确
3.可能试图访问不该访问的内存区域,导致程序崩溃
4.数组越界的程序,用某些编译器编译后可能可以正确运行,换一个编译器编译后可能就运行错误
九,字符串
字符串的三种有三种形式
1.1用双引号括起来的字符串常量,如“CHINA”,“C++program”。
1.2存放字符数组中,以‘\0’字符(ASCII码为0)结尾
1.3.string对象。string是C++标准模板库里的一个类,专门用于处理字符串
2.字符串常量占据内存的字节数等于字符串中字符数目加1多出来的是结尾字符‘\0'
3.字符串的长度不包含’\0'
4.""也是合法的字符串常量,称为”空串“,空串仍然会占据一个字节的存储空间,存放‘\0'
5.用一维char数组存放字符串
5.1.包含’\0'字符的一维char数组,就是一个字符串,其中存放的字符串即为‘\0'前面的字符组成
5.2用char数组存放字符串,数组元素个数应该至少为字符串长度+1
5.3char数组内容,可以在初始化时设定,也可以用c++库函数进行修改,还可以用对数组元素赋值的办法任意改变其中的某个字符
5.4字符数组同样可以用cout,printf输出,用cin,scanf读入。用cin,scanf将字符串读入字符数组时,会自动在字符数组中字符串的末尾加上’\0'
例:char prisonName[100]
cin>>prisonName
title[3]=0;//等效于title[3]='\0';
5.5用scanf读入字符串,用scanf可以将字符串读入字符数组,scanf会自动添加结尾的‘\0’,scanf读入到空格为止
例:char line【100】
scanf (”%s“,line);//注意不是&line
printf(”%s“,line);
输入:FOX RIVER
输出:FOX
5.6读入一行到字符数组
cin.getline(char buf[],int bufSize);
读入一行(行长度不超过bufSize-1)
如:char line【10】
cin.getline(line,sizeof(line));//或cin.getline(line,10);读入最多9个字符到line
cout<<line;
get(char buf[]);
d读入一行,自动添加'\0'
char s[10];
while(gets(s)){
printf("%s",s);
}
5.7字符串库函数
.使用字符串库函数需要#include<cstring>
.字符串函数都根据‘\0'来判断字符串结尾
.形参为char[]类型,则实参可以是char数组或字符串常量
strlen常见糟糕用法
char s[100]="test";
for(int i=0;i<strlen(s);++i)//strlen函数的执行是需要时间的,且时间和字符串的长度成正比
//每次循环,都调用strlen函数,这是效率上的很大的浪费
可以改为:char s[100]="test";
int len =strlen(s);
for(int i=0;i<len;++i)或
char s[100]="test";
for(int i=0;s[i];++i);