/* 语句块 用花括号括起来的语句 */
#include <iostream>
int main()
{
using namespace std;
int x = 20;
{
int y = 100;
cout << x << endl; //ok
cout << y << endl; //ok
} //以上就是一个语句块,y变量定义在语句块里面,所以y只能在改语句块中使用,在语句块之外是不能使用的
cout << x << endl; //ok
//cout << y << endl; //invalid
return 0;
}
/*新变量就会隐藏旧变量,另外注意cout和endl新的声明方法*/
#include <iostream>
int main()
{
using std::cout; //cout新的声明方法
using std::cin; //endl新的声明方法
using std::endl; //endl新的声明方法
char zero;
int x = 20;
{
cout << x << endl; //打印20
int x = 100;
cout << x << endl; //打印100
}
cout << x << endl; //打印20
cin >> zero;
return 0;
}
/*将字符串的内容反转*/
#include <iostream>
#include <string>
void main()
{
using namespace std;
cout << "输入一个单词: ";
string word; //定义一个字符串变量word
cin >> word;
cout <<"输入单词的个数为:"<< word.size() << endl; //打印输入的单词的个数
for (int i = 0, j = word.size() - 1; i < j; i++, j--) //减1是因为数组的索引是从0开始的
{
char temp;
temp = word[j]; //将输入的单词最后一个字母赋给temp
word[j] = word[i]; //将输入的单词的第一个单词赋到单词最后一个位置上
word[i] = temp; //将输入的单词最后一个字母赋到单词第一个位置上
}
cout <<"反转后的单词形式为:"<< word << endl;
cout << "Done" << endl;
cin >> word; //防止DOS闪退
}
/*逗号运算符*/
/*
01)常用于将两个或者更多的表达式放到一个for循环表达式中
02)逗号运算符确保先计算第一个表达式,然后计算第二个表达式(换句话说,逗号运算符就是一个顺序点)
如:i=20,j=2*i; 是安全的 先计算i=20再去计算j的值
03)逗号运算符的优先级是最低的
cata = 17,240; //cata=17 即"="的优先级比","的优先级高
cata = (17,240); //cata=240
*/
/* c风格类字符串的比较 */
/*
01)char word = "mate"; //数组名word只是数组的地址
word == "mate"; //用引号括起来的也是地址,所以两个地址判断是否相等,结果是肯定不相等的
02)使用c风格字符串库中的strcmp()函数来比较,改函数接受两份字符串地址为参数,这意味着参数可以是指针、字符数组名或字符串常量
如果str1和str2相同,那么表达式strcmp(str1,str2)==0为true
如果str1和str2不相同,那么表达式strcmp(str1,str2)!=0和strcmp(str1,str2)均为true
如果两个字符串不相同,则该函数返回1
如果str1在str2的前面,那么strcmp(str1,str2)<0 返回1
如果str1在str2的后面,那么strcmp(str1,str2)>0 返回1
*/
#include <iostream>
#include <cstring> //for strcmp()
int main()
{
using namespace std;
char zero;
char word[] = "?ate"; //定义数组,刚刚忘了在word之后加中括号导致报错
for (char ch = 'a'; strcmp(word,"mate"); ch++) //如果word不和mate相等,那么strcmp函数返回1,循环继续进行
{
cout << word << endl;
word[0] = ch; //将word数组中的第一个数用ch替换下来
}
cout << "最终匹配的字符串数组word是:" << word << endl;
cin >> zero; //防止DOS闪退
return 0;
}
/* string类字符串的比较 */
由于string类函数重载(重定义)了这些运算符,因此string类字符串可以使用
关系运算符进行比较
string类重载了运算符!=的方式让我们能够使用它
#include <iostream>
#include <string> //for string class
int main()
{
using namespace std;
string word = "?ate"; //定义string类字符串
for (char ch = 'a'; word != "mate"; ch++) //直接用关系运算符!=进行比较
{
cout << word << endl;
word[0] = ch;
}
cout <<"最终匹配的字符串word是:"<< word << endl;
cin >> word;
return 0;
}
/* 类型别名typedef和#define */
/*
01)使用预处理器#define
如:#define BYTE char //使BYTE成为char的别名,注意后面没有分号
02)使用关键字typedef
如:typedef char byte; //使byte成为char的别名,注意后面有分号
typedef char* byte_pointer; //让byte_pointer成为char指针的别名
03)在定义很多变量时,使用预处理器的方法不适用
如:#define FLOAT_POINTER float* //让FLOAT_POINTER成为char指针的别名
FLOAT_POINTER pa,pb; //有问题 相当于float* pa,pb;但是typedef不会出现这样的问题
04)和#define相比,typedef是一种更好的选择
05)typedef不会创建新类型,而只是在已有的类型创建一个新的名字
*/
/* do while 循环*/
/*
01)句法:
do
body
while(test-expression); //注意这里是有一个分号的
02)先执行循环体body,再去判断test-expression是否成立,若成立,则再次执行循环体body;否则跳出循环
03)
*/
#include <iostream>
int main()
{
using namespace std;
char zero;
int i; //不能定义在循环体内,否则在while的条件判断中i是不可用的
do
{
cout << "请输入一个数字:" << endl;
cin >> i;
}
while (i != 7); //如果输入的数字是7那么退出循环,注意这里是有一个分号的
cout << "my favorate number is:" << i << endl;
cin >> zero; //防止DOS闪退
return 0;
}
/* c++11:基于范围的for循环 */
#include <iostream>
void main()
{
char zero;
double prices[] = {4.99,10.99,6.87,7.99,8.79}; //创建一个double型数组,但是这样创建的数组怎么样去算数组中数据的个数不太简单
//sizeof()和strlen()用于字符串字符串
//可使用vector和array等容器,使用size()函数得到元素的个数
std::cout << "数组占的字节数数为:" << sizeof(prices) << std::endl;
for (double x : prices)
std::cout <<"原始数据为:"<< x << std::endl; //打印prices数组中的元素
for (double &x : prices)
x = x * 0.8; //改变数组中的值 每个值都乘以0.8
for (int i = 0; i < 5; i++)
std::cout << "乘上0.8后的数组数据为:" << prices[i] << std::endl;
std::cin >> zero; //防止DOS闪退
}
/* 循环和文本输入 */
//01原始的cin输入
#include <iostream>
void main()
{
using namespace std;
int count = 0; //初始化初始计数值
cout << "请输入字符,以#号结束,并按回车发送给cin:";
char ch,zero;
cin >> ch; //可以这样输入seek run# wwdd然后按下回车,此时会将s赋给ch剩余的字符将会保存在输入流中,等待着下次的cin
while (ch != '#')
{
cout << "输入的字符为:" <<ch; //这里不加换行符,那么就可以完整的打印出#号前的单词,且无空格
count++; //计算输入的字符数 ++count也可以
cin >> ch; //cin在读取所有类型的数据时,会自动忽略回车和空格****** 所以上面打印的时候不会显示空格
}
cout << count << "chracters read" << endl;
cin >> zero; //防止DOS闪退
}
/* 循环和文本输入 */
02cin.get(char)函数输入(这样输入不会忽略空格)
/*
注意:由于c++支持被称为函数重载的OOP特性,所以cin.get()、cin.get(char)和cin.get(name,Arsize)是不一样的函数
OOP特性(函数重载)允许创建多个同名函数,条件是他们的参数列表是不一样的
如:使用cin.get(name,Arsize)函数,那么编译器就会找到使用char*和int作为参数的cin.get()函数版本
使用cin.get(char)函数,那么编译器就会找到使用char作为参数的cin.get()函数版本
使用cin.get()函数,那么编译器就会找到不使用参数的cin.get()函数版本
*/
#include <iostream>
void main()
{
using namespace std;
char ch,zero;
int count = 0;
cout << "请输入字符,以#号结束,并按回车发送给cin:";
cin.get(ch);
while (ch != '#')
{
cout <<ch; //这里不加换行符,那么就可以完整的打印出#号前的单词,且由于是cin.get()方法输入,所以有空格
cin.get(ch);
count++;
}
cout <<endl<< count << "chracters read" << endl; //这里也会把空格算上
cin >> zero; //防止闪退
}
/* 二维数组 */
//int maxtemps[4][5]=
//{
// {96,100,87,85,65},
// {100,85,96,87,98},
// {97,101,91,95,94},
// {87,89,98,56,98}
//}; //定义并初始化一个4行5列的二维数组,注意最后的分号勿忘
#include <iostream>
const int Cities = 5;
const int Years = 4; //定义两个不可修改的变量
int main()
{
using namespace std;
const char* cities[Cities] = //定义指针数组,存储5个字符串的地址,使用指针数组的方法和使用普通数组方法是一样的
{ //如果不用指针数组,那么需要这样定义:const char cities[25]={"..."} 这样的意思是将每个字符串的最大长度限制为24个字符
"Gribble City", //每个都需要占用25个字符的位置,5个就是125个字符的空间,因此指针数组更节省空间一些
"Gribbletown", //当然使用 const string cities[Cities]={"..."}也是比较节省空间的
"New Gribble",
"San Gribble",
"Gribble Vitle"
}; //使用const的意思是数组内容不可修改
int maxtemps[Years][Cities]=
{
{96,100,87,85,65},
{100,85,96,87,98},
{97,101,91,95,94},
{87,89,98,56,98}
}; //定义并初始化一个4行5列的二维数组,注意最后的分号勿忘、
cout << "Maximum tempratures for 2008-2010
";
for(int city=0; city<Cities; city++)
{
cout << cities[city] << " "; //指针数组的使用方法和普通数组的使用方法是一样的*****
for (int year = 0; year < Years; year++)
{
cout << maxtemps[year][city] << " "; // 表示水平制表 使数据比较整齐
}
cout << endl;
}
cin.get(); //防止DOS闪退
}
效果如下: