您的位置:首页 > 理论基础

2016级计算机C++助教工作(2)基本语法与资料查找方法

2016-10-14 22:32 288 查看

注意以下样例只是一个样例,还可以有很多别的实现方法

基本语法:

输入输出:

正常篇-输入问题:

作为一个freshman,更多的你们可能第一次接触编程。那么输入输出作为交互的一种方式,自然是非常重要的。
         那么我们学习的第一中输入输出的方法就是cin,cout这两个函数啦。
        首先我们有第一种姿势:
int a;
cin>>a;
先定义个变量,然后输入。这个变量可以使double,float,int,char,bool等等类型。
在我们上机题中,如果输入告诉你要输入多少组case,每个case有多少输入了,那采用这个方法是自然没有问题的,因为我们可以用一个循环解决。
如第一次练习的C(题号,2076 The Drunk Jailer),

Sample Input
2
5
100

Sample Output
2
10

我们可以用以下代码解决输入问题。

int n,u;
cin>>n;
for(int i = 0;i < n; i++){
cin>>u;
}


但是换一种情况,告诉输入某个数的时候输入结束,例如中文练习题C(4144 Simple String Transformation)

输入样例

3
abc
4
AAbc
0

输出样例

def
aaef

我们可以采用如下代码解决

int n;
while(cin>>n){
if(n == 0)
break;
... //other code
}


这样不停输入数字,直到输入为0结束,跳出循环即可。

不过以上都是通过输入判断是否结束了,如果遇到输入为EOF(end of file)就是文件结束才结束输入怎么办呢?

例如 第一次练习A (2015 Keep on Truckin')

Sample Input:
180 160 170

Sample Output:
CRASH 160

那我们的解决方法如下:

int a,b,c;
while(cin>>a>>b>>c){
... //other code
}


以上解决的问题都是一个变量对应于一个输入的,对于一行是一个句子(字符数组)还有空格时该如何是好呢?
例如第一次练习 D(1153 Word Reversal)

方法1:我们利用string数组来保存输入

string a;
int n;
cin>>n;
getchar(); //由于第一个整数输入后接了一个换行符'\n',这个字符我们要读入才能正常读取下一行
while(n--)
{
getline(cin,a);
... //other code
}


有了这个就可以了吗?其实我们还有很多别的方法。

我们可以用char 数组(似乎还没学到,但是很快就学了,提前告诉你们)

方法2:

char a[100];
int n;
cin>>n;
getchar(); //理由同上   你需要使用到 cstdio 这个头文件   #include<cstdio>
while(n--){
gets(a);
... //other code
}


如果想获取数组a的长度,代码如下

int length = strlen(a)


so,到这里感觉自己会数组了,也是不错的,但是这样真的就完了么?

如何体现更高水平呢,秀一秀黑科技呢(哈哈,也就只能跟大一的说是黑科技了)

方法3:采用getchar()读入字符

char a[100];
int n;
cin>>n;
getchar(); //理由同上
while(n--){
int length = 0;
while(true){
a[length] = getchar();  //getchar()函数就是获取一个字符输入
if(a[length] == '\n')  // '\n' 表示换行符
break;
length++;
}
a[length] = '\0'; // '\0'表示字符数组的终止字符
//cout<<a<<endl;
... //other code
}
所以到这里,感觉到一点点的梯度上升吗?

在方法三种,额外的知识是,你要知道一些编码知识,这里特指ASCII,'\0'对应空字符,也是表示字符数组结尾的标志,'\n'是换行字符

参考资料:http://baike.baidu.com/link?url=tSj0V1ALtbxUCo27_IozDqqT2MNrUk7zqxAbIlTrr3yt_m-eEzp24QskmKQFvHQoKsWEWOBC2ElPGLZfXOdN4q 

如果明白了这个,那么任何的输入都不会难倒你的。

接下来是输出的问题:

正常篇-输出问题:

输出的格式有很多,我们用acm.hdu.edu.cn上几道简单题来作为例子,有兴趣的可以去做做

1. 1089 A+B for Input-Output Practice (I) 

Sample Input

1 5
10 20

 

Sample Output

6
30

这事最简单的,一行输入,一行输出

2.1096A+B for Input-Output Practice (VIII)

Sample Input

3
4 1 2 3 4
5 1 2 3 4 5
3 1 2 3

 

Sample Output

10

15

6

这个输出要求每两个输出之间有一个换行,那我们该怎么做呢? ------------------  在这里 告诉你们一个非常装B的话   (talk is cheap , show me the code)  
int n;
cin>>n;
int flag = 0; // 这是一个非常常用的标记方法
while(n--){
if(flag == 1)
cout<<endl;
flag = 1;
... //other code
}


这里我们可以看到新定义了一个flag标记的变量,如果flag==1,那么输出换行,因为此时,我们知道之前一定有一行输出的,进入这次循环的时候,一定会产生一次新的输出,那么我们有理由确定,这个时候需要输出一个空白行。

PS:1089-1096都是简单的a+b问题,就是输入输出控制的联系,非常建议大家去做一做。

3.5918 sequence I  这题别做啦,就是为了告诉你们还有别的要求的

Sample Input

2
6 3 1
1 2 3 1 2 3
1 2 3
6 3 2
1 3 2 2 3 1
1 2 3

 

Sample Output

Case #1: 2
Case #2: 1

通常还有一种格式就是输出 Case # 数据组号: 答案
或者换个姿势:

Sample Input

2
3 2
1 2 3
1 3
2 3

3 2
3 3 3
1 1
2 2

 

Sample Output

Case #1:
3
1
Case #2:
2
3

无论哪种格式,实际按要求来即可,只是步骤麻烦了些罢。
输入输出到此结束。

循环:

对于D(1153 Word Reversal),我们可以用循环的姿势有以下几种

Sample Input
2
5
100

Sample Output
2
10

第一种:
int n;
cin>>n;
for(int i = 0;i < n; i++){
... //other code
}

第二种:
int n;
cin>>n;
while(n--){
... //other code
}

第三种:
int n;
cin>>n;
do{

}while(n--);


特别的:

例如中文练习题C(4144 Simple String Transformation)

输入样例

3
abc
4
AAbc
0

输出样例

def
aaef

我们还可以有第四种姿势写循环

int n;
while(cin>>n,n!=0){
... //other code
}
是不是很神奇,判断条件写到while的括号中即可。
所以以上四种方式你们都可以尝试一下哈。

有了以上知识,做练习是没啥问题了吧,剩下的就是思考了。
但是这样够吗?

no~no~no~
我们知道大学的学习已经和高中不一样了,我们需要掌握的一个基本技能就是如何自学,如何查找资料,如何在学习的道路上渐行渐远~
如果你想成为一个ACM大神,如何超越高高在上的学长学姐,如何超越竞争的同年级同学,一年铜、两年银、三年金的步伐你能实现吗,或者你满足吗?
如果你想成为一个黑客,计算机网络,组成原理,密码学,体系结构,数据库,操作系统,linux指令........堆积如山的书。
如果你想成为一名科研人员,机器学习,数据挖掘,图形图像,神经网络.....(此处原谅我知之甚少)
.............
嗯好,以上内容都是吓吓你们的。我们这里要讲的是查资料。

百度搜索:

首先百度是大家都会的,那么我们要多多利用百度了搜索。有句话是这么说的:当你知道的越来越多,那你就会觉得自己越来越无知。你做的题目多了,你就会发现自己懂的太少了,于是你要从网上找题解(此处我强烈不建议从网上找练习题的答案,这么简单的题目,你们一定要独立思考),但是你会发现TOJ上的题,题解还是不那么好找的。
所以我建议大家想刷题就用杭州电子科技大学的HDU(acm.hdu.edu.cn),北京大学的POJ(poj.org),CF(http://codeforces.com/gyms/)

如果英语是个大问题(热爱ACM,你迟早得面对),那么退而求其次,看中文题目吧,福州大学FZU(http://acm.fzu.edu.cn/)sjtu(http://acm.sjtu.edu.cn/OnlineJudge/problems)
其实你有很多平台可以去的,但是注意一点,选择一个平台不停的刷就行,不要经常换平台,因为简单题很多,但是它们确不能让你进步,你要尝试挑战自己。
HDU,POJ,CF网上有很多解题报告,当你不会的时候就看看别人怎么做的。
可以放一些例子(不好意思,又给自己打广告了)。多看几个不同的博客,你们就能懂更多了。



或者查询strlen函数的用法。



第二个:C++手册查询

http://www.cplusplus.com/reference/ (这个网站还是挺慢的)

那这里我们看看 手册上可以查到什么
听说你对于string类不是很了解
在搜索框中输入string进行搜索



于是我们会得到string这个头文件的一些信息,往下拉,我们可以看到更多的介绍



有很多方法和操作,但是实际我们需要用到的很少。我们选择 length 进入查看



我们可以查看更多的说明,可以看到更多的例子。

最后以strlen函数的查询收尾



第二篇到此结束~~~~~~~

当然最好的成长的方式是找比你们厉害的人学习,你们的学长学姐就是非常不错的选择。

孤独是一个人的狂欢,狂欢是一群人的寂寞。祝你们在学习的不归路上,越走越深。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++助教