C语言期末笔记(一)

C语言复习过几遍,所以这里记录一些有点难记的东西。

数据类型

大小

  1. 整数类型:
    short 2字节
    int 4字节
    long 8字节

  2. 浮点类型:
    double 8字节
    float 4字节
    定义float类型时需写成:float num = 0.5f;(小数默认是double)

  3. 字符类型:
    char 1字节
    可以表示ASCLL码中所有的字符,不能表示中文等

占位(p73)

%占位:
printf格式化输出函数,%占位时有以下参数:%[占位长度][.精确位数(四舍五入)]占位格式

  • %d 为整数占位
  • %hd 为short整数占位
  • %ld 为long整数占位
  • %u 为unsigned整数占位
    %lu,%hu..
    对unsigned赋值负数,补码的首位依然被认为是1,但输出时这个1是会带入二进制计算的
  • %e 指数
    例:printf("%e",123.456); 输出:1.234560e+002
    例:printf("%13.2e",123.456); 输出:(四个空格)1.23e+002
  • %E %e的大写
  • %i 等同于%d
  • %o 八进制输出
  • %x 十六进制输出,小写
  • %X 十六进制输出,大写
  • %g 自动选择%f或者%e输出,小写
  • %G 自动选择%f或者%E输出,大写
  • %s 字符串

科学计数法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
printf("%lf\n", 123000000.0); // 123000000.000000
printf("%.2e\n", 123000000.0); // 1.23e+008
printf("%.2e\n", -123000000.0); //-1.23e+008
printf("%lf\n", 0.0000000123); // 0.000000
printf("%e\n", 0.0000000123); // 1.230000e-008
printf("%g\n", 0.0000000123); // 1.23e-008
printf("%.2e\n", 0.0000000123); // 1.23e-008
printf("%.2e\n", -0.0000000123); //-1.23e-008
printf("%lf, %e\n", .1e-2, .1e-2); // 0.001000, 1.000000e-003
return 0;
}

舍入舍出

浮点型格式化输出,四舍五入:

1
2
float a;
printf("%f\t%.2f\n", a, a);

浮点型强制转化,直接丢小数点后的

1
printf("%f\t%d\n", a, (int)a);

转义字符

转义字符 字符值
\'
\"
\? ?
\\ \
\a 警告
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\o、\oo、\ooo,o代表一个八进制数字 与该八进制码对应的ASCLL字符
\xh[h..],h代表一个十六进制数字 与该十六进制码对应的ASCLL字符

ASCII码

常见ASCII码:
‘ ‘: 32
‘0’: 48
‘A’: 65
‘a’: 97

运算符

优先级 运算符 含义 运算对象个数 结合方向
1 ( ) →👉
[ ]
->
.
2 ! 1 ←👈
~
++
--
-
(类型)
*
&
sizeof
3 * 2 →👉
/
%
4 + 2 →👉
-
5 << 2 →👉
>>
6 < <= > >= 2 →👉
7 == 2 →👉
!=
8 & 2 →👉
9 ^ 2 →👉
10 | 2 →👉
11 && 2 →👉
12 || 2 →👉
13 ? : 3 ←👈
14 = += -= *= /= %= >>= <<= &= ^= |= 2 →👉
15 , →👉

文件操作

1. 文件类型指针

(p333)

用纸质笔记记录了。准备在C语言期末笔记(二)里面写

文件操作例子

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
29
30
31
#include <stdio.h>
int main()
{
FILE *fp;
int e;
long len;
char c;
int status;
fp = fopen("pi.tmp", "w");
fputs("3.1415926", fp); // len=8,SEEK_SET=>0,SEEK_END=>9
fclose(fp);
fp = fopen("pi.tmp", "r");
fscanf(fp, "%d%c", &e, &c);
printf("e=%d,c=%c\n", e, c); // e=3,c=.

//=============== fseek & ftell test start ===============
len = ftell(fp);
printf("before fseek:%ld\n", len); // 2,指向'1'之前
status = fseek(fp, -1L, SEEK_END);
printf("fseek -1 end:%ld (%d)\n", ftell(fp), status); // 8
rewind(fp); // void函数,没有返回值
printf("rewind:%ld\n", ftell(fp)); // 0
status = fseek(fp, -1L, SEEK_SET);
printf("fseek -1 set:%ld (%d)\n", ftell(fp), status); // 0,fseek失败
status = fseek(fp, 111L, SEEK_SET);
printf("fseek 111 set:%ld (%d)\n", ftell(fp), status); // 111,虽然比文件长了很多,但是fseek成功
status = fseek(fp, -121L, SEEK_CUR);
printf("fseek -121 cur:%ld (%d)\n", ftell(fp), status); // 111,fseek失败
status = fseek(fp, -111L, SEEK_CUR);
printf("fseek -111 cur:%ld (%d)\n", ftell(fp), status); // 0
}

例题

魔法阵

思路

第一排:if is middle: init 1;
else: {row = a - 1;//
col++;//→}
右上角:row++;//↓
row--;//↓
col++;//→
row--;//↓
col++;//→
最右列:
row--;//↑
col = 0;//|←
row--;//↓
col++;//→
row--;//↓
col++;//→
1
2
3
if 已占数字:
row = (row + 2) % a;//→→2,超出则|←
col = (col + a - 1) % a;//←1,超出则→|
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdio.h>
#include <string.h>
int main()
{
int n = 3, num, row, col, a, a2;
int arr[101][101];
for (a = 1; a <= n; a+=2)
{
memset(arr, 0, sizeof arr);
row = 0;
col = a / 2;
a2 = a * a;
for (num = 1; num <= a2; num ++)
{
// printf("row: %d col: %d num: %d\n",row,col,num);
arr[row][col] = num;
if (row == 0 && col == a - 1)
{
row++;
}
else if (row == 0)
{
row = a - 1;
col++;
}
else if (col == n - 1)
{
row--;
col = 0;
}
else
{
row--;
col++;
}
if (arr[row][col] != 0)
{
row = (row + 2) % a;
col = (col + a - 1) % a;
}
}
for (row = 0; row < a; row++)
{
for (col = 0; col < a; col++)
{
printf("%2d ", arr[row][col]);
}
putchar('\n');
}
putchar('\n');
}
return 0;
}

易错点

  • 默认输出六位

    1
    printf("%f",f);
  • 反常识define

    1
    2
    #define true 0
    #define false 1
  • switchbreak就继续走

  • fseek(fp, 0L, 2);中,最后那个才是指示从哪儿开始的,即SEEK_END=2