一、引入
1.系统软件:
操作系统、高级语言编译程序、数据库系统、网络管理系统
2. 算法描述方式:
自然语言|流程图|伪代码
3.常见转义字符:
换行 | \n |
回车 | \r |
格式控制(进制) | %d、%o、%x |
字符串 | %s |
字符 | %c |
单精度浮点数、右对齐 | %f |
双精度浮点数 | %lf |
4.数据类型:
原子类型:整型(int)、实型(浮点型,double,float)字符型(char)
结构类型:数组、结构体、枚举型、共用体
空类型
指针类型
补充:
FLT_MAX
:表示单精度浮点型(float)的最大正数值,定义在 <float.h>
头文件中。
DBL_MAX
:表示双精度浮点型(double)的最大正数值,定义在 <float.h>
头文件中。
CHAR_MAX
:表示字符型(char)的最大值,通常是 127 或 255,定义在 <limits.h>
头文件中。
INT_MAX:表示整型(INT)的最大值,
它定义在 <limits.h>
头文件中。
5.字节
一字母占一字节 一字节(B,btye)占8位(bit),如大写字母J(01001010)
二、处理和交互式输入
1.“=”赋值
variable = operand(字符、数字、表达式)
2.自增运算符
i++后置,++i前置
3.强制转换
(int)(a+b) a+b一起转换类型
(int)a+b a被转换,再加上b
4.<math.h>里的常用函数
sin(x)
:计算x的正弦值。
cos(x)
:计算x的余弦值。
tan(x)
:计算x的正切值。
exp(x)
:计算e的x次方。
log(x)
:计算x的自然对数。
log10(x)
:计算x的常用对数(以10为底)。
sqrt(x)
:计算x的平方根。结果小数点后六位
fabs(x)
:计算x的绝对值。
ceil(x)
:返回不小于x的最小整数值(向上取整)。
floor(x)
:返回不大于x的最大整数值(向下取整)。
pow(x, y)
:计算x的y次幂。结果小数点后六位
5.scanf函数
scanf
函数是C语言中用于从标准输入(通常是键盘)读取输入值的函数。它可以根据指定的格式字符串读取不同类型的输入,并将其存储到对应的变量中。例如,scanf("%d", &num);
可以读取一个整数并将其存储到num
变量中。
char letter; scanf("%c", &letter);
int age; scanf("%d", &age);
char url[30]; scanf("%s", url); //可以加&也可以不加&
float price; scanf("%f", &price);
三、条件分支结构
1. 关系运算符的使用
关系运算符用于比较两个值之间的关系,返回一个布尔值(即逻辑值,后文会详细介绍)。常见的关系运算符包括:
==
:等于
!=
:不等于
>
:大于
<
:小于
>=
:大于等于
<=
:小于等于
这些运算符通常用于条件语句和循环控制中,以确定程序执行的路径。
2. 逻辑值与逻辑表达式
逻辑值指的是布尔值,即true
或false
。逻辑表达式是由关系运算符、逻辑运算符和操作数组成的表达式,其结果是一个逻辑值。常见的逻辑运算符有:
&&
:逻辑与(AND)
||
:逻辑或(OR)
!
:逻辑非(NOT)
逻辑表达式可以用于条件判断、循环控制以及逻辑运算等场景中。
3. 分支条件语句的使用方法
分支条件语句根据条件的真假选择不同的执行路径。常见的分支条件语句有:
3.1 if语句
if (condition) {
// 当条件为真时执行这里的代码
} else {
// 当条件为假时执行这里的代码
}
3.2 switch语句
switch (expression) {
case value1: /
/ 当表达式等于value1时执行这里的代码
break;
case value2:
// 当表达式等于value2时执行这里的代码
break;
default:
// 当表达式不等于任何case时执行这里的代码
break;
}
4. 三目运算符的使用
三目运算符是一种特殊的条件表达式,也称为条件运算符。它由三个操作数组成,格式如下:
condition ? expression1 : expression2
如果条件为真,则返回expression1
的值;如果条件为假,则返回expression2
的值。三目运算符常用于简洁地表达条件赋值或条件选择。
四、循环结构
1.概念解释
1、单行文本的长度不应超过80个字符
一个字符=8个字节=一个letter
两个字符=一个汉字
英文标点占一个字节,中文标点占两个字节。
2.前测试循环和后测试循环
1、前测试循环(pre-test loop):在进入循环体之前,先判断条件是否成立,如果条件为真,则执行循环体内的代码;如果条件为假,则跳过循环,直接执行循环后的代码。
while
和 for
循环就属于前测试循环,因为它们在执行循环体之前就对条件进行判断。
2、后测试循环(post-test loop):先执行循环体内的代码,然后再判断条件是否成立,如果条件为真,则继续执行下一次循环;如果条件为假,则跳出循环,执行循环后的代码。
do-while
循环属于后测试循环,因为它先执行循环体内的代码,然后再对条件进行判断。
ps:循环体内一定要有改变的循环语句,不然会陷入死循环
3.循环控制
1、计数控制循环:重复设定的次数
2、条件控制循环:重复到某件事,或是条件发生
4.一些关键词
continue:用于跳过当前循环中剩余的代码,直接进入下一次循环的迭代。通常与条件语句一起使用,用于在满足特定条件时跳过本次循环的剩余部分。在 switch 语句中,用于跳过当前 case 条件后面的语句执行。
break:当满足某个条件时,可以使用 break
来结束循环,即使循环条件没有达到结束条件。
NaN:用于表示不是一个有效数字的特殊值,通常在浮点运算中出现错误时返回。IEEE 浮点数标准中定义,用于表示不确定的或未定义的数学运算结果。
0.0/0.0 求负数的平方根 对负数求对数 Inf/Inf
Inf:用于表示不是一个有效数字的特殊值,通常在浮点运算中出现错误时返回。在 IEEE 浮点数标准中定义,用于表示不确定的或未定义的数学运算结果。
1.0/0.0 -1.0/0.0 0.0+Inf log(0)
5.数据验证
单个数据
#define TRUE 1
int qualify(int month){
while(TRUE){
if(month>=11||month<=12){break;}
else scanf("%d",&month);//
}
}
多个数据
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(不符合要求)
{i--;}//相当于重新输入
}
6.经典程序
1.在进行嵌套循环时,内循环结束后,考虑某些数据要不要“清零”
//找出数组中重复数次最高的数
for(int i=0;i<n i++){
count=0;//第一个数字遍历后,清零,下一个
for(int j=0;j<n;j++){
if(a[i]==a[j]{count++;}
if(max<count){//max为一个介质
max=count;
num=a[i];//记录
}
}
}
2.水仙花数
#include<stdio.h>
#include<math.h>
int count(int);
int judge(int , int);
int main(){
int m,n;
scanf("%d %d",&m,&n);
judge(m,n);
return 0;
}
int count(int m){
int i;
for(i=0;m!=0;i++)
m = 10;
return i;
}
int judge(int m, int n){
int a,b,sum;
for(;m<=n;m++){
a=m;
sum=0;
while(a!=0){
b=a%10;
a/=10;\sum+=pow(b,count(m));
}
if(m==sum)
printf("%d",m);
}
}
3.百马百担
#include <stdio.h>
int main() {
int horses[100]; // 用数组表示100匹马
int i, j, temp;
// 初始化马的速度
for (i = 0; i < 100; i++) {
horses[i] = i + 1;
}
// 冒泡排序,将最快的马放在数组的最前面
for (i = 0; i < 100; i++) {
for (j = 0; j < 99 - i; j++) {
if (horses[j] < horses[j + 1]) {
temp = horses[j];
horses[j] = horses[j + 1];
horses[j + 1] = temp;
}
}
}
// 输出最快的前三匹马的编号
printf("最快的前三匹马的编号是:%d, %d, %d\n", horses[0], horses[1], horses[2]);
return 0;
}