基础知识点

  1. 程序结构是三种: 顺序结构 、选择结构(分支结构)、循环结构

  2. 读程序都要从 main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个 main 函数

  3. 计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址

  4. bit 是位是指为 0 或者 1。 byte 是指字节,一个字节 = 八个位

  5. 编译预处理不是 C 语言的一部分,不占运行时间,不要加分号。C 语言编译的程序称为源程序,它以 ASCII 数值存放在文本文件中

  6. #define PI 3.1415926; 这个写法是错误的,一定不能出现分号

  7. 每个 C 语言程序中main 函数是有且只有一个

  8. 在函数中不可以再定义函数

  9. 算法:可以没有输入,但是一定要有输出

  10. break 可用于循环结构和 switch 语句

  11. 逗号运算符的级别最低,赋值的级别倒数第二

  12. 标识符分为关键字、预定义标识符、用户标识符,关键字不可以作为用户标识符号

  13. 标识符必须由字母,数字或下划线组成,且必须以字母或下划线开头

  14. 字符小写转大写

1
2
3
4
5
6
7
void main ( )
{
char c1, c2; /*定义字符类型*/
c1='a'; c2='b';
c1=c1-32; c2=c2-32; /*整型数值运算*/
printf("%c %c", c1, c2);
}
  1. 算术表示达式由变量、常量及算术运算符构成。在 C 语言中算术运算符有: +、 - 、 *、 /、 % 、-- 、++,+,其中 * 和/优先于+和-,--为自减 1,++为自增 1 (++在前先加后用,++在后先用后加)

  2. 空语句不可以随意执行,会导致逻辑错误

  3. ‘1’ 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)

  4. 使用 printf 和 scanf 函数时,要在最前面加上#include“stdio.h”

  1. 数据输入:scanf(“%d,%d”,&x,&y);

  2. 实现两个变量 x ,y 中数值的互换,要使用中间变量 t=x;x=y;y=t

  3. C 语言中是用非 0 表示逻辑真的,用 0 表示逻辑假

  4. C 语言有构造类型,没有逻辑类型

  5. 表达式的数值只能为 1(表示为真),或 0(表示假)

  6. 等号和赋值的区别!“=”就是赋值,“= =”才是等号

  7. for 循环当中必须是两个分号,循环一定要有结束的条件,否则成了死循环

  8. break 和 continue 的差别:

break:是打破的意思,(破了整个循环)所以看见 break退出整个一层循环

continue: 是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环

  1. 函数:是具有一定功能的一个程序块,是 C 语言的基本组成单位

  2. 函数不可以嵌套定义,但是可以嵌套调用

  3. 指针变量的本质是用来放地址,而一般的变量是放数值的

素数

素数是指除了1和自身之外,无法被其他正整数整除的正整数。换句话说,素数只有1和它本身两个因子。例如,2、3、5、7、11、13等都是素数,而4、6、8、9、10等则不是素数。一个大于1的正整数,如果它不是素数,则被称为合数

判断一个数是不是素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
int i, n;
printf("请输入一个数:");
scanf("%d", &n);
for (i = 2; i < n; i++)
{
if (n % i == 0) break; //整除则退出循环(或者i加到n则退出循环)
}
if (i < n) //证明i没有加到n就有整除了,所以该数不是素数
printf("该数不是素数");
else //i加到n都没有整除,证明该数是素数
printf("该数是素数");
return 0;
}

求100以内全部素数的和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
int i, n, sum = 0;
for (n = 2; n <= 100; n++)
{
for (i = 2; i < n; i++)
{
if (n % i == 0)break; //整除则退出循环(或者i加到n则退出循环)
}
if (i >= n) //i加到n都没有整除,证明该数是素数
{
sum += n; //1到100的素数相加
}
}
printf("sun=%d\n", sum);
return 0;
}

求给定区间内素数的个数与总和

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
#include<stdio.h>
int main()
{
int m, n, i, j, count = 0, sum = 0;
printf("请输入要求素数的区间m和n\n");
scanf("%d %d", &m, &n);
if (m <= 1)
{
m = 2;
}
for (i = m; i < n; i++) //区间为m~n
{
int flag = 1; //标志位要设置在for循环里面,不然每次循环之后标志位都随之改变
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0; //i不是素数,标志位赋为0
break; //跳出循环
}
}
if (flag == 1) //如果标志位为1则i为素数
{
count++; //个数++
sum += i; //素数的和
}
}
printf("count=%d,sum=%d", count, sum);
return 0;
}

年份问题

判断某年是否是闰年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
int year;
printf("请输入一个年份:\n");
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //能被4整除但不能被100整除 或者 能被400整除的年份为闰年
{
printf("%d年是闰年", year);
}
else
printf("%d年不是闰年", year);
return 0;
}

输入年月日,判断这一天为该年的第几天

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
54
55
56
57
#include <stdio.h>
int main()
{
int year, month, day, sum, flag;
printf("请输入年月日,格式为:年,月,日\n");
scanf("%d,%d,%d", &year, &month, &day);
switch (month) //计算某月之前月份的总天数
{
case 1:
sum = 0;
break;
case 2:
sum = 31;
break; //1月份31天
case 3:
sum = 59;
break; //2月份28天
case 4:
sum = 90;
break; //3月份31天
case 5:
sum = 120;
break; //4月份30天
case 6:
sum = 151;
break; //5月份31天
case 7:
sum = 181;
break; //6月份30天
case 8:
sum = 212;
break; //7月份31天
case 9:
sum = 243;
break; //8月份31天
case 10:
sum = 273;
break; //9月份30天
case 11:
sum = 304;
break; //10月份31天
case 12:
sum = 334;
break; //11月份30天
}
sum += day; //再加上这个月的天数
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //判断是否为闰年
flag = 1;
else
flag = 0;
if (flag == 1 && month > 2) //是闰年且月份大于2,总天数再加1
{
sum++;
}
printf("这一天是%d年的第%d天\n", year, sum);
return 0;
}

公倍数与公约数问题

求两个整数的最小公倍数与最大公约数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int main()
{
int m, n, i, j, t;
printf("请输入两个正整数:\n");
scanf("%d %d", &m, &n);
if (m > n) //如果m大于n则两个数交换
{
t = m;
m = n;
n = t;
}
for (i = m; i > 0; i--) //选两个数中比较小的数作为i的起始值,一直-1直到找出最小公倍数为止
{
if (m % i == 0 && n % i == 0) //如果两个数同时除以i都整除的话证明i为他们的最小公倍数
{
printf("最小公倍数为%d\n", i);
j = (m * n / i); //最大公约数为两个整数相乘除以他们的最小公倍数
printf("最大公约数2为%d\n", j);
break; //如果找到最小公倍数则跳出循环
}
}
return 0;
}

使用函数方法求最小公倍数与最大公约数

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
#include <stdio.h>
int main()
{
int math(int x, int y); //函数声明
int m, n, a, b;
printf("请输入两个正整数:\n");
scanf("%d %d", &m, &n);
a = math(m, n); //函数调用(函数有一个返回值,所以先定义一个变量a把返回值赋给a)
printf("最小公倍数为:%d\n", a);
b = (m * n / a); //最大公约数为两个整数相乘除以他们的最小公倍数
printf("最大公约数为:%d\n", b);
return 0;
}
int math(int x, int y)
{
int i, j, t;
if (x > y) //如果x大于y则两个数交换
{
t = x;
x = y;
y = t;
}
for (i = x; i > 0; i--) //选两个数中比较小的数作为i的起始值,一直-1直到找出最小公倍数为止
{
if (x % i == 0 && y % i == 0) //如果两个数同时除以i都整除的话证明i为他们的最小公倍数
{
j = i;
break; //如果找到最小公倍数则跳出循环
}
}
return j; //将最小公倍数返回出去
}

排序问题

三个整数从小到大排序

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
#include<stdio.h>
int main()
{
int x, y, z, t;
printf("请输入三个整数:\n");
scanf("%d %d %d", &x, &y, &z);
if (x > y) //如果x大于y,则两个数交换位置
{
t = x;
x = y;
y = t;
}
if (x > z) //如果x大于z,则两个数交换位置
{
t = x;
x = z;
z = t;
}
if (y > z) //如果y大于z,则两个数交换位置
{
t = y;
y = z;
z = t;
}
printf("三个整数从小到大的排列顺序为:%d %d %d", x, y, z);
return 0;
}

倒序输出数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
int num, r;
printf("请输入一个数字:\n");
scanf("%d", &num);
printf("倒排输出的结果为:\n");
while (num != 0) //数字不等于0则进入循环
{
r = num % 10; //取出最低位赋给r
printf("%d", r);
num /= 10; //去掉最低位
}
return 0;
}

使用冒泡排序法进行排序

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
#include<stdio.h>
int main()
{
void sort(int arr[], int n); //函数声明
int a[10], i;
printf("请输入10个数字:\n");
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
sort(a, 10); //函数调用
printf("从小到大的排序为:");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}

void sort(int arr[], int n) //定义函数
{
int i, j, t;
for (j = 0; j < n - 1; j++) //n个数进行n-1次比较
{
for (i = 0; i < n - 1 - j; i++) //每一次比较n - 1 - j个数
{
if (arr[i] > arr[i + 1]) //如果前面的数大于后面的数,则进行交换
{
t = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = t;
}
}
}
}