C语言编程的一些要点
(不完整)
一.Visual Studio 2017 community 使用过程中的一些问题
1.vs 2017 在使用scanf过程中总是出现警告
解决方法:
- 可以使用scanf_s函数;
- 可以在程序开头使用
#pragma warning (disable:4996)
2.vs 2017 编译运行(ctrl+F5)时窗口一闪而过
- C++程序末尾添加
cin.get();
- 在程序末尾添加
system("pause");
3.修改项目配置,如下图所示:
二.C语言的一些基础知识
1.一些不常用的函数或函数使用方法
一.
#include <math.h>
其中反三角函数的写法
acos, asin, atan
二.
#include <time.h>
其中包含的函数
clock()
返回值是程序目前为止运行的时间
clock() / CLOCKS_PER_SEC
可得到以“秒”为单位的程序运行时间
PS:
-
由于CLOCKS_PER_SEC与操作系统相关,故需采用后者计算程序运行时间。
-
该方法得到的时间值包括输入时间,为避免输入数据影响测试结果,可采用“管道的方法”:
Windows在命令行下执行echo 20 | abc,则操作系统会自动将20输入,abc是程序名。
Linux下输入“echo | ./abc”。 -
命令行:
快捷键 win+R → 输入 cmd → 快捷键 Enter → 输入路径Ⅰ. 相对路径
命令 —— 试图显示当前文件夹下的abc.txt文件type abc.txt
Ⅱ . 当前目录“.”和父目录“…”
Ⅲ . “cd<目录名>”改变当前路径。如“cd…”进入父目录,“cd aaa”会进入当前目录的aaa子目录
Ⅳ . Linux系统下 路径分隔符 是“/”而非“\”
三.
运算符:
按位与(&)、或(|)、非( !)、取反(~)、移位(<< >>)。
2.一些小知识点
- 各种类型储存的数据范围(待补全)(与各机器的类型有关)
数据类型 | 数据表示范围 |
---|---|
char | -128 ~ 127 或 0 ~ 255(取决于编译器将char视为unsigned char还是signed char) |
unsigned char | 0 ~ 255 |
signed char | -128 ~ 127 |
~ | |
~ | |
short [int] | -32768~32768 |
unsigned short [int] | 0~65535 |
unsigned [int] | 0~4294967295 |
[signed] int | -2147483648~2147483647 |
unsigned long [int] | 0~4294967295 |
long [int] | -2147483648~2147483647 |
long long | |
unsigned long long |
- 大数相乘考虑的思路:
int → long → long long → double → 数组等复杂类型
- 函数floor()向下取整、ceil()向上取整
两者返回值均为double类型,函数计算过程中需要注意误差带来的影响:两者返回值均为double类型,函数计算过程中需要注意误差带来的影响:
一 . 若计算过程中由于误差的影响,1变为0.9999999999,floor函数结果为0而非1。为此可采用floor(x+0.5)的操作,进行四舍五入。但如此小数部分为0.5的数也会受浮点误差的影响。 - windows下输入完毕后先按Enter键,再按Ctrl+Z键,最后按Enter键,即可结束输入。
Linux下按Ctrl+D键即可结束输入。 - fprintf()换行需要"\r\n"。
- 运算符号的优先级:(图片来自学堂在线——C++语言程序设计基础课程)
3.一些需注意的与编译器有关的要点(了解即可)
- C11新特性一般不影响算法竞赛,但要注意
get();
在C11中被移除了。
- C99中double(双精度浮点类型数)输入需使用"lf",输出需使用"f"。
- long long在Linux系统下输入输出格式符为%lld,Windows平台中有时为%I64d。
- 比赛中的输入输出要求:可能是标准I/0(直接读键盘,写屏幕,也称标准输入输出);可能是文件输入输出。若为文件输入输出,可能禁止用重定向的方式访问文件。
- 题目规定程序名需按程序名来。如规定程序名为test,输入文件名为test.in,输出文件名为test.out。不能使用绝对路径或相对路径。
- 提交到 比赛自动删除重定向语句的方法:(以数据统计程序为例,提交前只需把
#define LOCAL
删除)
#define LOCAL
#include <stdio.h>
#define INF 1000000000
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
int x, n = 0, min = INF, max = -INF, s = 0;
while (scanf("%d", &x) == 1)
{
s += x;
if (x < min)
{
min = x;
}
if (x > max)
{
max = x;
}
n++;
}
printf("%d %d %.3f\n", min, max, (double)s / n);
return 0;
}
也可在编译选项中定义LOCAL,此时无需在开端定义LOCAL。