C语言

1.初识C语言

什么是C语言

C语言是一门计算机语言

1,编写 2,编译 3,连接,4,.exe

什么是程序–编译调试

1.程序的作用是什么?

程序的作用是完成某种计算

2.新建代码及编译运行

#include <stdio.h>  //头文件

int main() { //入口函数
printf("Hello, World!\n"); //输出函数
return 0; //函数的返回值
}

每个C语句以分号结束

3.程序的编译过程及项目位置

程序的编译

4.断点及调试窗口设置

小虫子调试

调试

观察值的值是否符合预期

1数据类型

基本类型:整型int , 浮点型float,字符型char,

构造类型:数组[],结构体struct

指针类型*

空类型void

关键字

不做要求

2常量

在程序运行过程中,其值不发生变化。

可分为整型浮点型字符型(用单引号引起来,有且只有一个字符),字符串型

3变量

可以改变的值,在程序执行过程中。

标识符只能由字母,数字和下划线组成,并且第一个字符必须为字母或者下划线。

先定义后使用,变量名不能与关键字同名。

4整型数据

4.1符号常量

定义一个整型变量时要使用关键字int

变量i是4个字节

#include <stdio.h>
//符号常量
#define PI 3+2

int main() {
int i=PI*2;
printf("i=%d\n",i);
return 0;
}

最终输出结果是7,原因是符号常量PI是直接替换的效果,3+2*2=7.

5浮点型数据

5.1浮点型常量

image-20250117195127564

5.2浮点型变量

#include <stdio.h>
int main(){
float f=3e-3;
printf("f=%f\n",f);
return 0;
}

6字符型数据

6.1字符型常量

image-20250117195457886

ASCII码表

7字符串型常量

用双引号引起来的。

多一个字节\0

混合运算

1强制类型转换

//强制类型转换
int main(){
int i=5;
float f=i/2;//这里做的是整型运算
float k=(float)i/2;
printf("%f\n",f);
printf("%f\n",k);
return 0;
}

2printf函数介绍

输出各种类型的数据,标准输出函数。

printf几个%f对应几个数

image-20250119183237908

%c,%d,%f,%s

%d,赋值是整数就行

%3d,占三个字符

%5.2f,小数点后表示两位

%-3d,左对齐,默认右对齐不加负号

整型进制转换

整型常量的不同进制表示

二进制,十进制,八进制,十六进制转换

1个字节byte,是8位,bit

int main(){
int i=123;
printf("%d\n",i);//十进制
printf("%o\n",i);//八进制
printf("%x\n",i);//十六进制
return 0;
}

scanf读取标准输入

常用的数据输入/输出函数

image-20250119191606670

scanf函数原理

C语言通过scanf函数读取键盘输入

 #include <stdio.h>
//scanf用来读取标准输入,scanf把标准输入内的内容,需要放到某个变量空间里面,因此变量必须取地址

int main() {
int i;
char c;
float f;
scanf("%d",&i);
printf("i=%d\n",i);//把标准缓冲区中的整型数读走了
fflush(stdin);//清空标准输入缓冲区
scanf("%c",&c);
printf("c=%c\n",c);
scanf("%f",&f);
printf("f=%f\n",f);
return 0;
}

scanf在读整型数,浮点数,字符串会忽略\n回车符,空格符等字符(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞。)

为什么会阻塞,缓冲区是空的,等你输入数

scanf一次读多种数据类型

%c前面加一个空格就行,

#include <stdio.h>
//scanf一次读多种数据类型
int main() {
int i,ret;
float f;
char c;
ret=scanf("%d %c%f",&i,&c,&f);//ret是指scanf匹配成功的个数
printf("i=%d,c=%c,f=%5.2f\n",i,c,f);
return 0;
}

OJ网站如何让使用

online judge的缩写,在线判题的意思

image-20250120182204123

#include <stdio.h>

int main() {
int a,b;
scanf("%d %d",&a,&b);
int sum=a+b;
printf("%d\n",sum);
return 0;
}

image-20250120182223917

#include <stdio.h>

int main() {
int i;
scanf("%d",&i);
char ch=i;//转换成字符串
printf("%c\n",ch);


return 0;
}
#include <stdio.h>

int main() {
int i;
scanf("%d",&i);
if(i>=65 && i<=122){
char ch=i;//转换成字符串
printf("%c\n",ch);

}


return 0;
}

算术运算符和关系运算符

13种类型运算符

初级

算术运算符组成的式子叫算术表达式

先算乘除,后算加减

取余%,除/,

加号左边叫左操作数,右边叫右操作数

#include <stdio.h>
int main(){
int result=4+5*2-6/3+11%4;
printf("result=%d",result);
return 0;
}

关系运算符与关系表达式

关系表达式的值只有真假之分,真1,假0.关系运算符的优先级低于算术运算符。

#include <stdio.h>
//关系运算符,优先级小于算术运算符
int main() {
int a;
while(scanf("%d",a))
{
if(3<a && a<10){//a大于3同时a小于10
printf("a is between 3 and 10\n");
}else{
printf("a is not between 3 and 10\n");
}
}
printf("Hello, World!\n");
return 0;
}

image-20250121134353721

image-20250121134444296

逻辑运算符与赋值运算符,求字节运算符

1逻辑运算符与逻辑表达式

image-20250124123627895

逻辑表达式也只有真和假1和0.

一定要记住优先级

#include <stdio.h>
//记住优先级目的,不能够加多余的括号
int main() {
int year,i,j=1;
while(scanf("%d",&year))
{
if(year%4==0&&year%100!=0 || year%400==0){
printf("%d is leap year\n",year);
}else{
printf("%d is not leap year\n",year);
}

}
i=!!j;
printf("i value=%d\n",i);
return 0;
}

image-20250124175054965

短路运算

i为假时,不会执行逻辑与后面的表达式

i为真时,不会执行逻辑或后面的表达式

#include <studio.h>
//短路运算,逻辑与和逻辑或短路运算
int main(){
int i=0;
//i为假时,不会执行逻辑与后面的表达式,称为短路运算
i&&printf("you cant' see me\n");//真输出,假隐藏
i=1;//逻辑或前真不执行后面的
i||printf("you cant' see me\n");
return 0;
}

2赋值运算符

左值是出现在赋值符号左边的东西,右值是指出现在赋值符号右边的东西。

等号左边放变量,不能放表达式,否则会编译错误。

左值是变量

当左操作数和右操作数的变量一样,可以省略,写成 a+=6;

#include <stdio.h>

int main() {
int a=1,b=2;
a=a+3;//当左操作数和右操作数的变量一样,可以省略,写成下面的,提高运算速度
a+=3;
printf("%d\n",a);
return 0;
}

3求字节运算符sizeof

sizeof是一个运算符,不是函数

第二优先级,比较高的

#include <stdio.h>
//sizeof运算符
int main() {
int i=0;
printf("i sizeof is=%d\n",sizeof(i));

return 0;
}

OJ作业

读取一行,写一个scanf即可

读取多行,用for循环

#include <studio.h>
int main(){
int year;
scanf("%d",&year);
if(year%4==0 && year%100!=0 || year%400==0){
printf("yes\n");
}else{
printf("no\n");
}
return 0;
}

image-20250124183217355

#include <stdio.h>
int main() {
int i;
char j;
float k;
scanf("%d %c%f",&i,&j,&k);
printf("%5.2f\n",i+j+k);
return 0;
}

选择 if-else

1关系表达式与逻辑表达式

算术运算符的优先级高于关系运算符,关系运算符的优先级高于逻辑与和逻辑或运算符。(重要)这些是双目运算符

双目运算符是有两个操作数 左操作数+右操作数

要考虑短路运算

image-20250125134554993

2 if-else语句

#include <stdio.h>
//练习if与else
int main() {
int i;
while(scanf("%d",&i)){
if(i>0){//if下面加一个大括号
printf("i is bigger than 0\n");
}else{
printf("i is smaller than 0\n");
}
}

return 0;
}

if else也可以多个使用,多分支语句,if-else也可以嵌套使用。大括号一定不要忘记

循环while,for,continue,break

1while循环

先判断表达式,后执行语句。当表达式的值非0时,就会执行语句,从而实现语句多次执行的效果。

while后面没有分号

#include <stdio.h>
//计算从1到100的和
int main(){
int i,total=0;
while(i<=100){
total=total+i;//把i加到total上
i++;//i++等价于i+=1;
}
printf("%d\n",total);
return 0;
}

2 for循环

C语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以替代while循环语句。其一般形式为

for(表达式1;表达式2;表达式3)语句;

for循环语句执行过程如下

(1)先求解表达式1.

(2)求解表达式2,若值为真(非0),则先执行for语句中指定的内嵌语句,后执行第(3)步。若其值为假(值为0),则结束循环,转到第(5)步。

(3)求解表达式3.

(4)转回第(2)步继续执行。

(5)循环结束,执行for语句下面的语句。

#include <studio.h>
//for循环
int main(){
int i,total=0;
for(i=1;i<=100;i++){
total+=i;

}
printf("total=%d\n",total);
return 0;
}

3 continue语句

求1到100 奇数的和

#include <studio.h>
//使用continue
int main(){
int i,total=0;
for(i=1;i<=100;i++){

if(i%2==0){
continue;//continue下面的代码均不会得到执行
}
total+=i;
}
printf("total=%d\n",total);
return 0;
}
#include <stdio.h>

int main(){
int i=1,total=0;
while(i<=100){

if(i%2==0){
i++;
continue;
}
total+=i;//把i加到total上
i++;//i++等价于i+=1;

}
printf("%d\n",total);
return 0;
}

while循环里面要慎重使用continue,他不像for循环的continue一样,跳出直接到i++,需要在while的if语句里面加上i++,才能执行。

4 break语句

break语句是结束整个循环过程的,从大括号跳出来。不再判断循环条件是否成立。

break语句也可以用在while循环和do while循环中,起结束对应循环的作用。

#include <studio.h>
//break
int main(){
int i,total=0;
for(i=1;i<=100;i++){

if(total>2000){
break;//当和大于2000,循环不再执行
}
total+=i;
}
printf("total=%d,i=%d\n",total,i);
return 0;
}

5循环嵌套

对于考研最常见的是,for循环,嵌套for循环,即两层for循环,

#include <studio.h>
int main(){
int i,j;
for(i=0;i<5;i++){

printf("i=%d\n",i);//打印,就知道是第几次进行外层循环
for(j=0;j<5;j++){
printf("%d\n",j);
}
printf("\n");//输出换行
}

return 0;
}
#include <studio.h>
int main(){
int i,j;
for(i=1;i<=5;i++){
for(j=0;j<i;j++){
printf("*");
}
printf("\n");
}
return 0;
}

image-20250125162426282

OJ作业

#include <studio.h>
int main(){
int a,b=0,back_a;;
scanf("%d",&a);

back_a=a;
while(a){
b=b*10+a%10;
a=a/10;
// printf("%d\n",b);

}

if(b==back_a){

printf("yes\n");
}else{
printf("no\n");
}
return 0;
}

image-20250125221652160

#include <studio.h>
int main(){
int n;
scanf("%d",&n);
int i,result=1;
for(i=1;i<=n;i++){
result*=i;

}
printf("%d\n",result);
return 0;
}

image-20250125221741932

考察for循环

#include <studio.h>
int main(){
int x,y,z,o,count=0;
for(x=1;x<=9;x++){
for(y=1;y<=17;y++){
for(z=1;z<=37;z++){
for(o=1;o<=37;o++){
if(x+y+z+o==40 && 10*x+5*y+2*z+o==100){
// printf("%d%d%d%d\n",x,y,z,o);
count++;

}

}
}
}
}

printf("%d\n",count);
return 0;
}

一维数组

1数组的定义

特点:(1)具有相同的数据类型;

​ (2)使用过程中需要保留原始数据;

构造类型——数组。所谓数组,是指一组具有相同数据类型的数据的有序集合。

一维数组的定义格式为 类型说明符 数组名 [常量表达式];

int a[10];//定义一个整型数组,数组名为a,它有10个元素。

image-20250126164544665

定义数组的个数,即数组的长度。

不能用变量命名 int[n],这样是不行的(新的C标准)可以。

2一维数组在内存中的存储

存储从0开始,下标,例如存10个数,存储地址就是0-9

靠后是高地址,靠前是低地址

下面是只初始化一部分值,其余元素全初始化为0

image-20250126165710326

1数组访问越界

面试的时候可能会问

变量i的值发生了改变,没有注意数组空间的大小,可能会影响其他变量的大小,其值在内存视图中被覆盖了

#include <stdio.h>

int main() {
int a[5]={1,2,3,4,5};
int j=20;
int i=10;
a[5]=6;
a[6]=7;//访问越界
printf("i=%d\n",i);
//i我们并没有赋值,但其值发生了改变

return 0;

}

image-20250126171430622

2数组的传递

初试和机试都重要

数组长度传递不过来,必须用额外的参数

数组传递到子函数,子函数的形参接收到的是数组的起始地址,因此不能把数组的长度传递给子函数

调试按钮,步入看自己写的子函数

#include <studio.h>
//void不需要返回,不用写return
void print(int a[],int length){
int i;
for(i=0;i<length;i++){
printf("%3d",a[i]);
}
a[3]=20;
printf("\n");
}
//main主函数
int main(){
int a[5]={1,2,3,4,5};
print(a,5);
printf("a[3]=%d\n",a[3]);
return 0;
}


字符数组与scanf读取字符串

1字符数组初始化及传递

char c[10];

#include <studio.h>
//模拟printf("%s",c)操作
void print(char d[]){
int i=0;
while(d[i]){//当走到结束符时,循环结束
printf("%c",d[i]);
i++;
}
printf("\n");
}


//输出字符串乱码时,要去查看字符串数组中是否存储了结束符
int main(){
// char c[5]={'h','e','l','l','o'};//使用这种方式初始化数组
char c[6]="hello";
char d[5]="how";
printf("%s\n",c);
print(d);
return 0;

}

image-20250204194139075

2scanf读取字符串