C语言学习 零基础 学习记录笔记

发布于:2022-12-24 ⋅ 阅读:(705) ⋅ 点赞:(0)

开始时间: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 之间的区别。前者预编译时候处理,后者于编译时候处理。


网站公告

今日签到

点亮在社区的每一天
去签到