机试练习总结
文章目录
pat
1、pat测评方式位单点测试,一次处理一组数据即可。
2、其他在线测评系统如codeup,为多点测试,一次处理多组数据。
关于编译器
codeblocks
1、调试闪退
解决:千万不要把项目放在中文路径!!!
code
输入输出(几位小数,printf,scanf)
scanf
库:stdio.h
scanf("格式控制",变量地址);
scanf("%d",&n);
&为取地址运算符,为了得到变量地址,需要在前面加一个&,也就是“&变量名。”
浮点数类型一般用double,有效精度15~16位
char str[100];
int i;
printf( "Enter a value :");
scanf("%s %d", str, &i);
printf
printf("格式控制",变量名称);
printf( "\nYou entered: %s %d ", str, i);
字符控制:
https://blog.csdn.net/u011012049/article/details/47860215
常用:
数据类型 | scanf | printf |
---|---|---|
int | %d | %d |
long long | %lld | %lld |
float | %f | %f |
double | %lf | %f |
char | %c | %c |
字符串(char数组) | %s | %s |
scanf和printf的格式符只有一个不同:double:scanf中是%lf,printf中是%f
三种常用输出格式
1、%md
使不足m位的int型变量以m位进行右对齐输出,其中高位用空格不起;若本身超过m位,则保持原样。
int a = 123, b =123456;
printf("%5d\n",a);
printf("%5d\n",b);
输出:
123
123456
2、%0md
只是在%md中间多加了0。不同在于,前面补0而不是空格。
int a = 123, b =123456;
printf("%05d\n",a);
printf("%05d\n",b);
输出:
00123
123456
3、%.mf
让浮点数保留m位小数输出,这个“保留”使用“四舍六入五成双”规则。用即可。
若要求四舍五入,则使用round函数。
double d1 = 12.345;
printf("%.2f\n",d1);
printf("%.5f\n",d1);
输出:
12.35
12.34500
getchar()和putchar()
getchar()输入单个字符,putchar()输出单个字符。
typedef
给复杂的数据类型起别名,如
typedef long long LL;
防止程序出现大量long long 降低编码效率。
转义字符
常用换行 (\n),tab(\t)
空字符,空格字符
\0表示空字符NULL,其ASCLL码为0,而不是空格!!!空格的ASCLL码为32。
16进制0x20, 十进制32:空格字符 指键盘上长长的那个键产生的字符
16进制0x00, 十进制0 :空字符 指 字符串结尾系统自动加上的‘\0’,
以让系统识别出一个字符串的结尾。如字符串“china”实际上在系统内是以“china\0”储存的。
若要输出%,或:
printf("%%");
输出%
printf("\\");
输出\
字符串常量
可以作为初值赋给字符数组,并使用%s的格式输出。
char str1[25] = "The more hard-working";
char str2[25] = "the more luky";
printf("%s,%s.",str1,str2);
字符串常量长度包含空格
string str = str1;
int a = str.length();
printf("%d\n",a);
输出:
21
布尔型
整型变量赋值给布尔型变量时自动转换为true(非零),false(零)。在存储时分别为1和0,可用 %d 输出为1或0;
宏定义(符号常量,宏替换)和常量
#define 标识符 常量;
define也可以定义任何语句或片段,但是能加的地方都加上括号,防止陷阱
const 数据类型 变量名 = 常量;
运算
自增运算: i++和++i:
i++是先使用i再将i加1,++i是先将i加1,再使用i。
条件运算符:
(?:)是c语言中唯一的三目运算符,格式:
A ? B : C;
含义是:如果A为真,那么执行并返回B的结果;如果A为假,那么执行返回C的结果。
常用math函数
头文件:math.h(C语言)
fab(int x)和fabs(double x);
对int变量和double变量取绝对值。
floor(double x)和ceil(double x)
向下取整和向上取整,返回类型为double型。
pow(double r, double p)
要求r和p为double,返回rp\。
sqrt(double x)
double类型的算术平方根。
log(double x)
返回double类型的以自然对数e为底的对数
对任意自然数为底的对数需要使用换底公。
sin(double x),cos(double x),tan(double x)
参数要求弧度制(用弧长与半径之比度量对应圆心角角度的方式)
sin(pi * 45 /180);
asin(double x), acos(double x), atan(double x)
round(double)
将double变量四舍五入,返回值为double,需进行取整才能输出。
double d2 = round(12.345);
printf("%d\n",(int)d2);
输出:
12
不取整的话会输出0.
选择结构
if
- 注意:
1、if和else中的内容是互斥的。
2、if(n)的意思是if( n != 0 )
3、f( n == 0)可以写成 if( !n )
switch
在分支条件比较多时会比较精炼。
switch(表达式)
{
case 常量表达式1:
{
语句块1;
break;
}
……
case 常量表达式n:
{
语句块n;
break;
}
default:
{
语句块n+1;
}
}
循环结构
whiile
for
for(A ; B; C){.......}
注意A,B,C的执行顺序,①执行A, ②判断B是否成立, ③循环体, ④C ⑤回到 “②” 并循环。
break和continue
- break:
1、强制退出switch
2、退出循环 - continue
在需要的地方结束临时结束循环的当前轮回,然后进入下一轮回。
数组
一维数组
数组大小必须是整型常量,而不是变量。
int a[10] = {1, 2, 3, 4, 5};
未被赋值(初始化)的元素初值不一定。
如果想要给整个数组赋值为0,可以用:
//方法一
int a[10] = {0};
//方法二
int a[10] = {};
冒泡排序
C++自带swap函数用于交换,不需要自定义!!!否则无效!!!
//冒泡排序
int a[5] = {3, 1, 4, 5, 2};
//从最后一个元素开始,小元素上冒
//5个元素,4轮比较,每次确定最小元素位置
for(int i=1; i<=5; i++){
//待排序列,5个元素需要比较4次
for(int j=4; j>=i; j--){
if(a[j]<a[j-1]){
//C++自带swap函数用于交换,不需要重写!!!
swap(a[j],a[j-1]);
// int temp = a[j];
// a[j] = a[j-1];
// a[j-1] = temp;
}
}
}
for(int i=0; i<5; i++){
printf("%d\n",a[i]) ;
}
二维数组
int a[5][6] = {{3, 1, 2}, {8, 4}, { }, {1, 2, 3, 4,5} };
默认赋值为0.
memset—对数组中的每一个元素赋相同的值
头文件:string.h
memset(数组名, 值, sizeof(数组名));
按字节赋值,即对每个字节赋同样的值.建议对其赋0或-1,二进制补码为全0或全1,不易出错.
赋其他值建议使用STL中的fill()函数.
int a[5] = {3, 1, 4, 5, 2};
memset(a, -1, sizeof(a));
for(int i=0; i<5; i++){
printf("%d\n",a[i]) ;
}
输出:
1
1
1
1
1
若对其赋值为1:
字符数组
char str[15] = {'G','o','o','d','','s','t','t','r','y'};
输出:
Good story!
不能赋空值,可以为空格.
初始化时可以直接赋字符串或字符数组,仅限初始化
!!!
char str[15] = "Good story!";
输入输出
- 输入
除了scanf外,还可以用getchar或gets - 输出
出来printf外还可以用putchar或puts
char用单引号,string用双引号
字符数组存放方式
空字符与空格字符区别在前面转义字符处
string.h头文件
包含很多用于字符串的数组
strlen()
得到字符数组中第一个\0前的字符个数.
str(字符数组)
strcmp()
返回两个字符串大小的比较结果,比较原则是按字典序.
strcmp(字符数组1, 字符数组2);
返回结果:
- 1 < 2,返回负整数
- 1 == 2,返回0
- 1 > 2,返回正整数
strcpy()
把2复制给1,其中包括\0.
strcpy(字符数组1, 字符数组2);
strcat()
把一个字符串接到另一个字符串后面.
strcat(字符数组1, 字符数组2);
把2接到1后面.
sscanf和sprintf
头文件:stdio.h
是处理字符串问题的利器!
//将str中的内容以%d的格式写到n中
sscanf(str, "%d", &n);
//将n以%d的格式写到str中
sprintf(str, "%d", n);
类似于scanf和printf,在scanf和printf中str是scree(屏幕)
函数
- 全局变量
- 局部变量
但是以数组作为参数传入,在函数中对数组元素的修改就等同于对原数组地修改
指针
什么是指针
- 在计算机中,每个变量都会存放在内存中分配的一个空间,每个空间都有地址,计算机就是通过地址找到每个变量的,一般是它所占用的字节中第一个字节的地址。
- 在C语言中使用指针来表示内存地址(或者称指针指向了内存地址),如果这个地址恰好是某个变量的地址,那么又称该指针指向该变量。
- 前面讲到,用取地址运算符&,只要在变量前面加上&,就表示变量的地址。
指针是一个unsigned类型的整数。
指针变量
- 指针变量用来存放指针(或者可以理解为地址),这个关系就跟int型变量存放int型常量是一样的。
- 指针变量在某种数据类型后加*号来表示这是一个指针变量。
·注意:·
指针作为函数参数传入
- 对*p修改可改变原变量值,但是如果改变指针本身(地址是unsigned常量),则改变的是地址副本,不会对main函数内的变量改变。
- 声明指针时要初始化(赋值)!
引用&
与取地址运算符不同!!!
- 引用不产生副本,而是给原变量起了一个别名。对引用变量的修改就是对原变量的修改。
- 使用方法:只需要在函数的参数类型后面加&(或在写在变量名前)。
- 引用是产生变量欸定别名,常量不可以使用!!!
结构体
struct Name{
//一些基本的数据结构或自定义的数据类型
}
当需要将一些相关的变量一起存储时,只要依次写出他们的数据类型和变量名称。
访问
" . “操作或” -> "操作,后者用于指针,两者都可以用于指针。与“ * ” 访问指针等价。