开始时间:2022.8.22
略有小成:????
C语言基础
1.1基础数据类型:整型、字符型、(实型)浮点型........
1.2 #define 预处理语句 宏定义命令 #define price 30 即全局中price为30 后面不需要赋值了
1.3 整型数据中 八进制常整数以0为开头前缀 十六进制的整常数前缀以0x or 0X
1.4浮点型中 指数形式 常常以e or E作为阶码,阶数只能是整数!!
一般形式 a E n 即a的n次方
1.5 关于小数在内存中的存放形式:有两条结论
符号 |
小数部分 |
指数部分 |
+ |
.314159 |
1 |
小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。
指数部分占的位数愈多,则能表示的数值范围愈大。
2.1 各个类型需要存储字节的形式不一致,在不同类型的数据进行计算时,会统一扩大到大的那个类型里,强制转换过程中,可能会造成类似于小数的确实或者是增添0.000000这种部分。
2.2 自增、自减部分 i++ ++i 这种是先运行后自增1 or 先自增后运行的 区别 还有i-- --i 这种
2.3 字符常量由单引号括起来,字符串常量由双引号括起来,均与ASCII码有关,后者占内存字节数等于字符串中字母增加1个字节中存放字符“\0”(表示字符串结束标志)。
3.1 scanf函数的些使用小规则: 记得赋值的时候要加入&的符号!!“&a” 表示变量a的地址
scanf("%d %d %d",&a,&b,%c); 需要输入的格式为 啥啥 空格 啥啥 空格 啥啥
scanf("%d,%d,%d",&a,&b,%c); 需要输入的格式为 啥啥 逗号 啥啥 逗号 啥啥
3.2 printf(“%5.4d”,a) 表示的是总长度为5,取4位小数点的精度。 %e %d 等等等等
4.1 scanf("%d",&a) 与 scanf("%d",a) 两者是不同的!!
前者是取变量名a的地址位置,后者是取变量名a那个地址内所赋的值
--2022.9.7
5.1 if-else-if 如果有嵌套的情况下,else跟着最近的if语句;
5.2 switch(){case1:执行语句;break;case2:执行语句;break;.......default........}
记得要加上break这个关键词,否则switch讲按顺序执行其余后面的操作,无法进行功能性选择。
--2022.9.8
6.1 do-while while 两种语句的差别在:前者需要至少执行一次,而后者可以直接跳出。
6.2 contiune break 的差别在 : 前者仅仅是跳出该次循环,而后者则是直接退出循环。
6.3 分支语句这块,常常使用的还是 if 以及 while 语句;
--2022.9.12
7.1 数组的概念:首先要定义数组的名称、长度等等,不能随意更改;
数组同样可以进行动态赋值的操作:
八进制八进制整常数: 八进制整常数以0开头,即以0作为八进制数的前1.4缀。整常数: 八进制整常数必须以0开头,即以0作为八7进制数的前缀。
7.2 最经典的冒泡算法详解:
外层循环表示需要某一个数组需要进行的循环次数;内层的则表示需 要两两进行多少次比较:
#include<stdio.h>
void main()
{
int i,j,k,a[8];
printf("please input 8 numbers\n");
for(i=0;i<8;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<8;i++)
{
printf("%d ",a[i]);//原来的数组顺序如何
}
printf("\n ");
for(i=0;i<8;i++)
{
for(j=0;j<8-i;j++)
{
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
}
}
for(i=0;i<8;i++)
{
printf("%d ",a[i]);//冒泡后的数组顺序如何
}
}
--2022.9.14
8.1 关于自定义函数的相关初始步骤:如果是库文件,记得先#include载入,然后就是声明以及调用的顺序。要么先声明后调用,要么将自定义函数写在主函数前面。
8.2关于递归算法以及迭代算法,递归算法需要有退出条件,否则将无止境的进行下去!!
--2022.9.15
9.1 区分清楚局部变量以及全局变量的区别,一般来说 自编的函数里面常常使用的局部变量,相当于一个单一功能进行使用,拿来就用,如果使用过多的全部变量,会造成混乱的情况。
9.2 关于静态变量 static xx 它会带有上一次运行前的值。
#include<stdio.h>
int fac(int n)
{
static int f =1;
f=f*n;
return f;
}
void main()
{
int i=4;
for(i=1;i<=5;i++)
{
printf("%d!=%d \n",i,fac(i));
}
}
8.3 关于变量的声明与定义关系: int a 需要建立存储空间 extern a 不需要建立
前者是“定义性声明”,后者是“引用性声明”。
C语言中最重要的指针部分:
9.1 直接访问 间接访问
指针(地址,通过地址,能直接取到值)and 指针变量 (用于存放指针的)
9.2 *point &point 前者为取值符号 后者为取地址符号 两者是不太一样的 !
指针跟数据的运用:
10.1 输出数组的三种方法 下标法、数组地址、指针法
指针方法需要注意的点:增加"p=a"的初始化操作
10.2 不用函数,单纯利用指针,将数组进行反向操作;
10.3关于二维数组的重点:最关键的是定义那块 要弄清楚!! 形如 int (*p)[n]
10.4 字符串中字符的存取方法:
#include<stdio.h>
void main()
{
char a[]="happy birthday!",b[40];
int i;
for(i=0;*(a+i)!='\0';i++)
{
*(b+i)=*(a+i);
}
*(b+i)='\0';
printf("string a is %s\n",a);
printf("string b is %s\n",b);
}
//下标赋值
//利用指针方法进行存取
#include<stdio.h>
void main()
{
char a[]="happy birthday!",b[40];
int i,*p1,*p2;
p1=a;
p2=b;
for(;*p1!='\0';p1++,p2++)
{
*p2=*p1;
}
*p2='\0';
printf("string a is %s\n",a);
printf("string b is ");
for(i=0;b[i]!='\0';i++)
{
printf("%c",b[i]);
}
}
10.5 指针所指向的区域内的值有时候是不能被改变的,它指向的是一个固定的常量,常量是不允许修改的。形如此例子
10.6 指针指向函数 定义部分要注意!! int (*p)()
10.7 #if(0) #endif 函数的调用中会用到。
10.8 关于指针数据的小总结
11.1 宏定义:分为 无参宏定义 和 带参宏定义
无参宏定义中 其实就是相当于简单的字符串替换等操作 常常使用的是大写字母 例如:
#define PI 3.1415 or #defind D “%d\n” 如果需要终止作用域 则可使用#undef PI
带参宏定义中:
形式:#define 宏名(形参表) 字符串
#include<stdio.h>
#include<stdlib.h>
//比较两个数大小
#define MAX(a,b) (a>b)?a:b
void main()
{
int x,y,max;
printf("输入两个数");
scanf("%d %d",&x,&y);
max=MAX(x,y);
printf("最大的数字是:%d",max);
}
#include<stdio.h>
#include<stdlib.h>
#define SQ(y) y*y
#define SSQ(y) (y)*(y)
//有括号和没括号的区别!!!
void main()
{
int a ,sq1,sq2;
printf("please input two number");
scanf("%d",&a);
//输入a等于2
sq1=SQ(a+1);//2+1*2+1 =5
sq2=SSQ(a+1);//(2+1)*(2+1)=9
printf("sq1=%d\n sq2=%d\n",sq1,sq2);
}
注意加减乘除 自左向右的规则 所以有时候要记得把括号的范围 看看好
11.1.1 有时候宏定义和调用是不一样的 比如说Y++ 在宏定义里 #define mn(y) y*y 则是会用两次y 假如说y开始是1 则mn(y)则代表着1*(1+1)=2 跟直接函数调用 1*1 是不一样的
11.1.2 条件编译 ROUND 1运行第一个部分 ROUND 0 运行第二个部分
12.1结构体 结构体指针 结构体数组 静态链表
#include<stdio.h>
#include<stdlib.h>
struct student
{
long num;
float score;
struct student *next;
};
void main()
{
struct student a,b,c,*head;
a.num=10101;
a.score=95;
b.num=10108;
b.score=96575;
c.num=10167;
c.score=567;
head=&a;
a.next=&b;
b.next=&c;
do
{
printf("%ld %5.1f\n",head->num,head->score);
head=head->next;
}while(head!=NULL);
}
12.1 建立动态链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define LEN sizeof(struct student) //student结构体大小
struct student *creat();//创建链表
void print(struct student *head);//打印链表
struct student
{
int num;
float score;
struct student *next;
};
int n;//全局变量,此处用于记录学生的数量
struct student *creat()
{
struct student *head;
struct student *p1,*p2;
p1=p2=(struct student *)malloc(LEN);
printf("please input your num:");
scanf("%d",&p1->num);
printf("please input your score:");
scanf("%f",&p1->score);
head=NULL;
n=0;
while(p1->num !=0)
{
n++;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct student *)malloc(LEN);
printf("please enter your num:");
scanf("%d",&p1->num);
printf("please enter your score:");
scanf("%f",&p1->score);
}
p2->next=NULL;
return head;
};
void print(struct student *head)
{
struct student *p;
printf("There are %d record students",n);
p=head;
if(head!=NULL)
{
do
{
printf("num is %d,score is %f\n\n",p->num,p->score);
p=p->next;
}while(p);
}
}
void main()
{
struct student *stu;
stu=creat();
print(stu);
printf("\n\n");
}
13.1 注意 define 与 typedef 之间的区别。前者预编译时候处理,后者于编译时候处理。