0%

小课堂02-基础篇2

输入输出格式控制

cin和 cout

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iomanip> // 控制输出格式的头文件在此,别忘!
using namespace std;
int main(){

cout<<setprecision(5) // 前面没有fixed,设置除小数点外有五位有效数字
<<123.456789<<endl; // 输出123.46,会四舍五入!

cout<<setw(10) // 设置显示域宽十位
<<setfill('*') // 不足用*补齐,注意setfill的参数是char类型,如果要用0补齐,因写作setfill('0')
<<123.456789<<endl; //输出****123.46


cout<<fixed // 以固定小数位显示,不要加括号!
<<setprecision(3) // 前面有fixed,设置显示三位小数
<<999.123456<<endl; // 输出999.123


return 0;
}

注意点
上述的格式控制方法务必牢记,setprecision()、setw()、setfill()是函数,fixed不是调用函数,不要记错。虽然考试一般不怎么会用到,但一旦题目要求控制格式,格式就不能有任何偏差。

printf 和 scanf

示例:

1
2
3
4
5
6
7
8
9
10
#include <cstdio>           // 相当于stdio.h,但是C++中应该使用cstdio
int main(){
double x=123.456789;
int y=233;
printf("%8.4lf",x); // 有效位数为8(位数不足不用补齐),小数点后4位,123.4567
printf("%05d",y); // 输出的数字要5位,不足以0补齐,00233
printf("%-5d",y); // 若位数不足则左对齐,“123 ”,若无负号为“ 123”

return 0;
}

一言蔽之:小数点前指有效数字(一共输出了几个数字),小数点后指小数位数,0指空位补0,负号指靠左对齐

补充知识:
cin、cout和printf、scanf中还有将变量以八进制、十六进制格式输出的选项,但极少用到,由于上述内容多需记忆,不在此详述,感兴趣可查看此篇文章

指针与数组

将指针当作数组使用:

1
2
3
4
5
6
int* p;
p=new int[10]; // 开辟长度为10的数组,并全部初始化为0,注意是中括号!

// new后面也能跟小括号,不过和此处所述用法没有太大关系
int* p2;
p2=new int(5); // 开辟一个int的空间,并初始化为5

数组名和首元素指针的区别
首先补充一个关键词 sizeof ,用法例如 sizeof(int) ,返回了 int 所占用的内存空间(当然括号内也可以是某个变量),不过我们不用关心具体的返回值。
绝大多数情况下,数组名和首元素指针是没有区别的,但有以下特殊情况:

1
2
3
int nums={1,2,3};
sizeof(&nums[0]); // 结果等于sizeof(int)
sizeof(nums); // 结果等于sizeof(int)*3!即整个数组所占的空间

C风格字符串

C风格字符串即为char数组,但其最后一个元素一定是’\0’
一般用string代替C风格字符串,因为C风格字符串的雷区很多。

常用函数(可略过):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstring>  // cstring是string.h头文件中的C++版本,而string.h是C语言提供的标准库

int main(){
strlen(s); // 返回s的长度,不包括字符串结束符'\0',其原理是从头开始遍历字符串,直到遇到'\0'
strcmp(s1, s2);
strcat(s1, s2); // 将字符串s2连接到s1后,并返回s1
strcpy(s1, s2); // 将s2复制给s1,并返回s1
strncat(s1, s2, n); // 将s2的前n个字符连接到s1后面,并返回s1
strncpy(s1, s2, n); // 将s2的前n个字符复制给s1,并返回s1

const char *cp1 = "A string example";
const char *cp2 = "A different string";
if(cp1 < cp2) // 比较两个指针的地址,而非比较字符串内容
;

int i=strcmp(cp1, cp2); // i为正数
i=strcmp(cp2, cp1); // i为负数
i=strcmp(cp1, cp1); // i为0

return 0;
}

switch 语句

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;

int main ()
{
// 局部变量声明
char grade = 'D';

switch(grade){ // 要判断的变量,不能忘记大括号
case 'A' : // case和’A’之间要有空格,后面要有冒号
cout << "很棒!" << endl;
break; //可选,一般都有
case 'B' :
case 'C' :
cout << "做得好" << endl;
break;
case 'D' :
cout << "您通过了" << endl;
break;
case 'F' :
cout << "最好再试一下" << endl;
break;
default : // 可选,所有未出现过的值
cout << "无效的成绩" << endl;
}

return 0;
}

struct

定义方法:

1
2
3
4
5
6
7
8
9
struct Books               // 定义结构图
{
char title[50];
char author[50];
char subject[100];
int book_id;
} ; // 这里有个分号!

Books book1; // 申明实体,C语言中规定前面要加 struct,即 struct Books book1 ,但C++中可不加

typedef

用法:

1
typedef long long ll;    // 输入long long太麻烦,定义ll即为long long

const

用法:

1
2
3
4
5
const int num=10;          // num变量的值不能改变,并且要在其申明时赋初值

// 下面的有点绕,但最好分清
int* const p1=&num; // p1只能指向num
const int* p2=&num; // 不能通过p2来修改num的值

题目

  • 程序改错,思考num2和num3输出结果的原因,将程序的输出结果改为三个0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    using namespace std;

    int nums1[4];

    int main(){
    int nums2[4];
    int *num3=new(4);
    cout<<nums1[2]<<nums2[2]<<nums3[2];
    }
  • 设计一个程序,输入两个整数,输出它们的商,要求保留小数点后两位,并且宽度为6,不足用0补齐

  • 设计一个程序,输入一个整数作为操作命令,输出其相对应的响应,(1:向左,2:向右,其他:错误)

  • https://www.luogu.com.cn/problem/P1179