zoukankan      html  css  js  c++  java
  • c博客作业06-结构体&文件

    1.本章学习总结

    1.1 学习内容总结

    1.结构体如何定义、成员如何赋值

    1.结构体的定义

    • 一般形式:
    struct 结构名{
        类型名 结构名成员1;
        类型名 结构名成员2'
        ···
        类型名 结构名成员n;
    };
    
    • 结构的定义以分号结束,因为C语言中把结构定义看做一条语句
    • 关键字struct和结构名必须联合使用,因为它们合起来表示一个数据类型名。
    • 结构的嵌套定义:
    /*设置结构体保存学生的学号,姓名,通行地址,以及计算机,英语,数学和平均成绩,其中通行地址包括,居住的城市,街道,门牌号,邮编*/
    struct address {
       char city[10];
       char street[20];
       int code;
       int zip;
    };
    struct nest_student{
       int num;
       char name[10];
       struct address addr;
       int computer,english,math;
       double auerage;
    };
    

    注意:在注意嵌套的结构类型时,必须先定义成员的结构类型,在定义主结构类型。

    • 运用typedef语句
      • typedef用于给基本数据类型和导出数据类型定义一个新的名字。一般形式为typedef 老的变量类型 新的变量类型,这样做的好处是后面定义结构体变量时不需要写关键词strcut,使用起来比较方便。

    2.结构体成员的赋值

    • 在c语言中,使用结构成员操作符"."来引用结构成员,格式为结构变量名.结构成员名
    /*对学生的信息进行赋值*/
    struct student{
       int num;
       char name[10];
       int computer,english,math;
       double average;
    };
    struct student s1,s2;
    
    /*分别对s1的每个结构体成员赋值;*/
    scanf("%d %s %d %d %d",&s1.num,s1.name,&s1.computer,&s1.english,&s1.math);
    s1.average=(s1.computer+s1.math+s1.english)/3.0;
    
    /*将s1中各个结构体成员的值赋给s2*/
    s2.num=s1.num;
    strcpy(s2.name,s1.name); //这里注意,对字符串的赋值,不可以直接写“s2.name=s1.name”,这样的写法是错误的,要用库函数strcpy()!
    s2.math=s1.math;
    s2.computer=s1.computer;
    s2.english=s1.english;
    s2.average=s1.average;
    /*对于将两个相同类型的结构变量,把一个结构变量赋给另外一个结构变量,可以直接整体赋值,这样和分别对结构体成员的赋值的操作等效*/
    s2=s1;
    
    

    运行结果:

    • 定义结构指针变量,使用指向运算符->访问指针指向的结构成员,以此来给每个结构成员赋值;
    struct student *p;
    /*使结构指针变量p指向s1,从键盘上读取数据赋给p指向的s1*/
    p=&s1;
    scanf("%d %s %d %d %d",&p->num,p->name,&p->computer,&p->english,&p->math);
    p->average=(p->computer+p->english+p->math)/3.0;
    
    /*使结构指针变量p指向s2,再把s1中各个结构体成员的值赋给s2*/
    p=&s2;
    p->num=s1.num;
    strcpy(p->name,s1.name);
    p->math=s1.math;
    p->computer=s1.computer;
    p->english=s1.english;
    p->average=s1.average;
    
    

    运行结果:

    2.结构体数组排序做法

    1.选择排序

    /*从大到小排序*/
    struct student students[n];
    struct student temp;
    for i=0 to n-1//外循环
       for j=0 to n//内循环
          if(students[j]>student[i])//如果后面的数据比前面大,交换数据;
             temp=students[i];
             student[i]=student[j];
             student[j]=temp;
          end if
       end for
    end for
    

    运行结果:

    2.冒泡排序法

    struct student students[n];
    struct student temp;
    for i=1 to n
       for j=0 to n-i
          if(students[j+1]>student[j])
             temp=students[j];
             student[j]=student[j+1];
             student[j+1]=temp;
          end if
       end for
    end for
    

    运行结果:

    3.结构体指针

    1.概念

    • 就是指向结构类型变量的指针。
    • 一般形式struct 结构名 * 指针变量名

    2.用结构指针访问结构成员

    struct student *p;
    p=&s1;
    
    • 用*p访问结构成员:

    • 用指向运算符->访问指针指向的结构成员:

    3.结构指针作为函数参数
    将学生的信息按平均分排名

    虽然结构变量也可以做为函数参数,但是当结构成员数据很多时,在参数传递时过程就需要消耗很多空间,而使用结构指针作为函数参数只要传递一个地址值,可以提高传参效率。

    4.共用体、枚举类型做法

    1.共用体

    • 一般声明形式:
    union 联合名
    {
       成员声明
       成员声明
       ···
    }变量列表
    
    • 联合中的所有成员共享同一块内存,内存长度为最长成员的长度。因为在后续的程序设计中,代码量越来越多,内存是非常宝贵的。

    2.枚举

    • 一般声明形式:
    enum 枚举名 {枚举值1,枚举值2,···}变量列表;
    
    
    • 每个枚举值应该是一个合法的标识符,或者是一个标识符后面跟上一个等号,再加上一个常量表达式。
    • 编译程序将从0开始逐个给枚举值赋值,如果某个枚举值标识符后面跟有等号和常量表达式,那么编译程序就将该常量表达式的值作为该枚举值的值,该枚举值后面的枚举值从这个枚举值开始逐个加1,重新编号。

    5.文件和缓冲系统

    • 1.文本文件和二进制文件
      • 数据文件可分为文本文件和二进制文件。
      • 文本文件是以字符ASCII码值进行存储与编码的文件,文件内容就是字符,可通过“记事本”等编辑工具来对文件内容进行查看,修改等。
      • 二进制文件就是存储二进制数据的文件,它包含的是计算机才能识别的机器代码,如果用编辑器工具打开,就会看到一堆乱码,因为无法用编译器工具打开,所以二进制文件比文本文件更安全。
    • 2.缓冲文件系统
      • 程序与文件的数据交换药通过内存缓冲区来进行,根据这种文件缓冲的特性,把文件系统分为缓冲文件系统与非缓冲文件系统。
      • 对缓冲文件系统,在进行文件操作时,系统自动为每一个文件分配一块文件内存缓冲区(内存单元),C程序对文件的所有操作就通过对文件缓冲区的操作来完成。缓冲区文件系统的大小是由具体的C语言版本决定。
      • 对非缓冲文件系统,文件缓冲区不是由系统自动分配的,而需要程序员在程序中用c语言实现分配。

    6.文件结构与文件类型指针

    • 1.文件结构
      • FILE是一个结构类型,用typedef语句来进行命名的,typedef语句在头文件stdio.h中定义,因此使用文件的程序都要#include <stdio.h>
    • 2.文件类型指针
      • 一般形式:FILE * fp
      • FILE是文件类型定义符,fp是文件类型的指针变量。
      • 这里的文件指针fp做自增的话,比如++fp,表示的是fp指向下一个FILE结构(如果存在),而不是指向文件中的下一个数据

    7.打开文件和关闭文件

    1.打开文件

    • 一般调用形式为fopen("文件名","文件打开方式");,这里的文件名要指出对哪个具体文件进行操作,一般要指定文件的路径,如果不写出路径在,则默认与应用程序的当前路径相同。文件路径若包含绝对完整路径,则定位于目录用的斜杆“”需要用“”,因为''在c语言中表示转义符,""表示实际的""。
    • fopen函数有返回值。如果执行成功,函数将返回包含文件缓冲区等信息的FILE结构地址,赋给文件指针fp,否则返回一个NULL(空值)的FILE指针。
    • 在调用fopen函数时最好做一个判断,以确保文件正常打开后再进行读写。
    if ((fp=fopen("abc.txt","r"))==NULL)
    {
       printf("File open error!");
       exit(0);//exit(0)是系统标准函数,作用是关闭所有打开的文件,并终止程序的执行。
    }
    
    • 文件打开方式:
      • 文本文件(ASCII)
    打开方式 含义
    "r" 打开文本文件进行只读,该文件必须存在
    "w" 建立新文本文件进行只写
    "a" 打开文本文件进行追加,如果该文件不存在就新建一个文件
    "r+" 打开文件进行读/写,对文件进行写时会把文件中的内容覆盖,该文件必须存在。
    "w+" 建立新文件进行读/写,如果该文件存在就会把原来的文件删除,再建一个新的文件
    "a+" 打开文本文件进行读/写/追加,如果该文件不存在,就新建一个文件
    • 二进制文件打开的操作和文本文件一样,只不过打开方式多了一个字符“b”。

    2.关闭文件

    • 一般形式:fclose(文件指针);
    • 若该数为0表示正常关闭文件,否则表示无法正常关闭文件,所以关闭文件也应该使用条件判断:
    if(fclose(fp))
    {
       printf("Can not close the file!
    ");
       exit(0);
    }
    

    8.文件读写,文件中数据如何读进结构体数组

    • C语言标库stdio.h中提供了一系列文件的读写操作函数:
    函数 调用格式 功能
    fgetc() fgetc(FILE*fp) 从fp指向的文件中得到一个字符
    fputc() fputc(char ch ,FILE*fp) 把字符ch输入到fp指向的文件中去,成功的话返回ch,失败则返回EOF(在头文件stdio.h中有说明其值为-1)
    fgets() fgets(charp,n,FILEfp) 从fp指向的文件中获取n-1个字符赋给指针p所指向的字符串,昂函数读取的字符达到指定的个数,或者接收到换行符,或接收到文件结束标志EOF时,在读取的字符后面自动添加一个''字符,如果读取成功则返回字符串,否则返回空指针,此时字符串的内容不确定
    fputs() fputs(charp,FILEfp) 把p指向的字符串输到fp指向的文件中去
    fscanf() fscanf(文件指针,格式字符串,输入表) 从文件中按照给定的控制格式读取数据
    fprintf() fprintf(文件指针,格式字符串,输出表) 从文件中按照给定的控制格式读取数据保存到变量
    fread() fread(buffer,size,count,fp) 从二进制文件中连续读入count个数据块(size个字节)到buffer所指向的变量中
    fwrite() fwrite(buffer,size,count,fp) 向二进制文件中连续输出入count次buffer所指向的变量中数据块(size个字节)
    • 调用函数feof()可以检测文件指针fp所指文件的位置是否到了文件末尾。该函数在打开文件是文件指针是指向文件首部的,每次调用一个读取文件中的数据的读取函数成功后,文件指针fp会自动向后移动到还未被读取的数据去,如果文件指针指向文件末尾时,则会返回一个无效的字符EOF,因为EOF不是常规的ASCII码,而是一个值为-1的常量,这样可以区分于文件中的字符内容。

    9.其他相关函数

    和文件有关的其他函数 调用格式 功能
    rewind() rewind(FILE*fp) 使文件指针fp指向文件的首地址
    fseek() fseek(FILE*fp,long offset,from) offset表示从当前位置开始向前或者向后偏移的长度,from表示从哪个位置开始计算偏移量,from可取三个值“SEEK_SET,SEEK_CUR,SEEK_END”,分别表示文件首部,当前位置和文件尾部,实际表示的值为0,1,2.
    ftell() ftell(FILE*fp) 获取当前位置距文件开头的位移量(字节数),成功则返回位移量,失败时返回-1L
    clearer() clearer(FILE*fp) 用来清除出错标志和文件结束标志,使它们为0值

    1.2本章学习总结

    • 学习体会:c语言学到最后,学习的东西越来越多,虽然这学期我们就要结束c语言的课程,可一写题目才发现自己还有许多东西都还没有学习,很多东西也还一知半解,到了后面综合性越来越强,如果前面有落下的知识应该要及时去补上,否则这部分的内容理解起来就会有些困难。(没错就是我555)

    • 代码量:1890

    2.综合作业--“我爱成语”

    2.1.文件介绍

    头文件介绍

    头文件1.idiom.h

    • 结构体及功能
    结构体 功能
    IDIOM 从idiom.h文件中读取成语及其意思
    RANK 从ranking.h文件中读取排名成绩和时间
    • 函数声明
    函数 功能
    void Theme() 主题
    void Login(char*user) 登入界面
    int IsUser(char* name_str, char* password_str) 判断是否为用户
    void GetChoice(FILE* fp1, FILE* fp2, char* user) 得到用户的选择并进入该功能
    int Game(FILE* fp1, FILE fp2 ,char user) 成语游戏
    int GetIdiom(FILE* fp, IDIOM* idioms) 获得文件idiom.txt中的所有成语
    void RightSentence() 夸奖的句子
    void WorrySentence() 提示回答错误的句子
    int Problems(int num,IDIOM *idioms) 随机得到一个成语,并判断是否正确
    void PrintProblem(char* idiom) 随机挖空,输出题目
    void ArrageRank(FILE* fp, char* user, int right) 在文件ranking.txt中更新排名
    void GetTime(RANK*rank_ptr) 获取当前时间和日期的函数
    void GetScore(int right, int count) 计算正确率并告知答题结束
    int NowTime() 记录当前时间
    void GetRank(FILE*fp) 获取排名
    int FindIdiom(FILE*fp) 查找成语
    int WriteNewIdiom(FILE*fp) 添加新成语
    int CheckIdiom(FILE* fp, char* idiom) 查看文件中是否有相同的成语
    int IsAgain() 判断是否要继续的函数
    • 代码截图

    2.函数实现文件介绍。

    1.idiomMain.cpp

    • 功能:只放一个主函数main,在主函数中打开文件,得到用户名字,这三个变量的使用率比较高,放入主函数中,比较容易传参。
    • 代码截图:

    2.List.cpp

    • void Theme()

      • 功能:放在开头的一个小界面,保存有清屏和再输出小界面的功能。
      • 代码截图:
    • void PrintLine()

      • 功能:输入分割线,用于分割题目。
      • 代码截图:
    • void Login(char user)*

      • 功能:登入界面,读取用户输入的用户名和密码,并将登陆成功的用户名传回主函数,这样便于主函数传给下一个函数。
    while(1)
       输入用户的名字和密码,分别赋给name,password;
       if(IsUser(name,password)==0)
           说明输入的名字和密码错误,不跳出循环;
       else
           说明输入的名字和密码正确,break跳出循环;
       end if
    end while
    把用户的名字name保存到变量user,传给其他函数使用;
    
    • 代码截图:

    • int IsUser(char name, char password)**

      • 功能:判断是否为用户,如果输入不正确将一直无法继续下一个步骤,直到输入正确的用户名和密码。这里打开文件user.txt,将从Login函数中得到的用户名和密码与文件中的用户和账号作比较,因为没有其他功能会用到这个文件,所以用完文件后就可以直接关闭文件,及时释放不用的文件缓冲区单元。
    定义字符数组name_str[M],password_str[M]分别保存从文件中读到的用户名字和密码;
    打开文件user.txt;
    while(!feof(fp))//遍历文件;
        if(strcmp(name,name_str)==0&&strcmp(password,password_str)==0)//说明用户名和密码都匹配;
            return 1;
        end if
    end while
    关闭文件;
    return 0;//说明不匹配,用户输入的名字和密码不匹配;
    
    • 代码截图:

    • void ChoiceMenu()

      • 功能:选择菜单,给用户提示,供用户选择。
      • 代码截图:
    • void GetChoice(FILE * fp1,FILE * fp2,char * user)

      • 功能:获取用户的选择,并进入相应的分支,对输入错误的选项将会使用户重复输入。这里在选择进入哪个分支的部分加入了循环结构,并把执行每个功能的函数类型都设置为int型,可返回一个数值,这样可以供用户选择是否要继续执行该选择。
    while(1)
       while(1)
           输入选项赋给choice;
           if(choice<1||choice>5)//用户输入了一个错误的选项;
               继续让用户输入;
           else  //用户输入了正确的选项;
               退出该循环;
           end if
        end while
        switch(choice)
        {
          case 1:while(flag = Game(fp1,fp2,user)); break;//游戏;
          case 2:while(flag = FindIdiom(fp1)); break;//查找成语;
          case 3:while(flag = WriteNewIdiom(fp1)); break;//添加新成语;
          case 4:GetRank(fp2); break;//得到排名;
          case 5:return;//退出该循环直接回到主函数;
         }
    end while
    
    • 代码截图:

    3.idiom.cpp

    • int IsAgain()

      • 功能:判断用户是否要继续执行该选择,如果得到0的话就退回到函数GetChoice()函数中去;
      • 代码截图:
    • int Game(FILE * fp1,FILE * fp2, char user)*

      • 功能:用户进入该功能进行猜成语游戏,包含提示游戏开始,记录正确率,答题时间,可中途退出的功能。
    定义结构数组IDIOM idioms[300];//保存从文件idioms.txt中读取的所有成语及成语的意思;
    定义变量right保存用户做对的题目数量,并初始化为0;
    定义变量problem保存用户想要做的题目数量,并初始化为0;
    定义变量worry保存用户做错的题目数量;
    定义变量num保存从文件中得到的成语总个数;
    定义begin保存用户开始做题的时间;
    定义end保存用户做完题的时间;
    
    scanf("%d",&problem);//读取用户想要做的题目数量;
    for i=1 to problems
       if(Problems(num,idioms))//进入出题函数Problems中进行出题,如果答对会返回非0的值;
           right++;
       end if
       if(IsAgain())//说明用户输入0退出该游戏;
           进入函数GetScore(right,i)计算当前成绩;
           进入函数ArrageRank(fp2,user,right)进行排名重新排序;
       end if
    end for
    /*说明用户做完了题目*/
    进入函数GetScore(right,i)计算当前成绩;
    进入函数ArrageRank(fp2,user,right)进行排名重新排序;
    if(IsAgain())//判断是否要重开一盘游戏,然后把值返回到GetChoice函数中,可以实现是否要继续重开一盘游戏的功能;
    使所有文件指针重新指向文件开头,以便其他函数使用;
        return 1;
    else
       return 0;
    
    • 代码截图:

    • int FindIdiom(FILE * fp)

      • 功能:查找成语功能。
    定义字符数组idiom[M]保存用户输入的成语;
    
    scanf("%s",idiom);//保存用户输入的成语;
    if(!CheckIdiom(fp,idiom))//进入函数CheckIdiom判断是否找到该成语;
       说明没有找到该成语;
    判断是否要继续查找成语(IsAgain())
    
    • 代码截图:

    • int CheckIdiom(FILE * fp,char idiom)*

      • 功能:检查是否有相同的成语,这个是查找成语功能的一部分,我把它封装出来,这样可以供下面的添加函数功能使用。
    定义字符数组idiomStr[N]保存从文件中读到成语及其意思;
    定义变量len保存成语长度;
    定义字符指针loc定位冒号的位置;
    
    使文件指针指向文件开头,使得文件指针可以从文件头开始遍历;
    while(!feof(fp))
       fgets(idiomStr,N,fp);
       loc=strchr(idiomStr,':');//定位出冒号的位置;
       len=loc-idiomStr;//得到成语的长度;
       idiomStr[len]='';//将冒号替换成'',因为函数strcmp在进行字符串比较时,读到''就停止比较;
       if(strcmp(idiom,idiomStr)==0)//说明找到用户想要的成语;
          idiomStr[len]=':';//重新把冒号黏贴回去;
          输出该成语及其意思;
          return 1;
       end if
    end while
    return 0;//说明没有找到成语;
    
    • 代码截图:

    • void GetRank(FILE * fp)

      • 功能:得到排名,并输出排名。
      • 代码截图:
    • int WriteNewIdiom(FILE fp)*

      • 功能:添加新的成语
    定义字符数组newIdiom[M]保存用户输入的成语;
    定义字符数组newMean[N]保存用户输入的成语意思;
    
    gets_s(newIdiom);//输入成语;
    /*进入函数CheckIdiom中判断文件中是否已经存在该成语*/
    if(CheckIdiom(fp,newIdiom)
       已经存在该成语;
    else 
       gets_s(newMean);//输入该成语的意思;
       fseek(fp,0,2);//定位到文件结尾去补充;
       fprintf(fp,"%s:%s",newIdiom,newMean);//写入文件;
    end if
    
    判断是否要继续写入新成语(IsAgain());
    
    • 代码截图:

    3.Game.cpp

    • int GetIdiom(FILE fp, IDIOM idioms)**
      • 功能:获取文件idiom.txt的所有成语,保存到结构体数组IDIOM idioms[]中,并返回成语的总数量;
    定义字符数组idiomStr[N]保存从文件中读取的成语和成语意思;
    定义结构体指针IDIOM*ptr来指向结构体数组IDIOM *idioms;
    定义变量num来记录成语的个数,并初始化为0;
    定义变量len来保存成语的长度;
    
    fseek(fp,0,0);//使文件指针指向文件开头,使得文件指针从文件头开始遍历;
    while(!feof(fp)
       fgets(idiomStr,N,fp);
       loc=strchr(idiomStr,':');//找到冒号位置;
       len=loc-idiomStr;//保存成语的长度;
       idiomStr[len]='';//把冒号换成'',因为strcpy函数只复制''前的字符;
       strcpy(ptr->idiom,idiomStr);//把成语保存到结构体数组中的idiom中;
       strcpy(ptr->mean,idiomStr+len+1);//把成语意思保存到结构体数组中的mean中;
       ptr++;
       num++;
    end while
    return num;//返回成语的个数;
    
    
    • 代码截图:

    • void RightSentence()

      • 功能:输出夸奖的语句。
        -代码截图:
    • void WorrySentence()

      • 功能:输出提示错误的语句。
      • 代码截图:
    • int Problems(int num,IDIOM * idioms)

      • 功能:随机得到一个成语并输出题目,得到用户答案判断是否正确。
    定义字符数组problem[M];//保存随机得到的成语;
    定义answer[M];//保存用户输入的答案;
    定义变量flag用来判断用户是否需要提示;
    定义变量count来保存用户回答的次数;
    定义变量n来保存随机数;
    定义变量begin来保存用户开始答题的时间;
    定义变量end来保存用结束答题的时间;
    
    srand(time(0)); n=rand()%num;//得到随机数n;
    strcpy(problem,idioms[n].idiom);//将随机得到的成语赋给problem;
    进入函数PrintProblem随机空两个字,并输出题目;
    while(count<=3)//设置一道题目只能回答3次;
       scanf("%s",answer);//用户输入答案;
       if(strcmp(answer,problem)==0)//说明答案正确;
            end=NowTime();
            return 1;
       else//说明回答错误;
            if(flag!=1)//说明还没使用提示;
               scanf("%d",&flag);
               if(flag==1)
                  输出提示;
               end if  
             end if
        end  if
        count++;
    end while
    
    • 代码截图:

    • void PrintProblem(char problem)*

      • 功能:随机去掉两个字,输出题目;
      • 代码截图:
    • int NowTime()

      • 功能:保存当前时间。
      • 代码截图:
    • void ArrageRank(FILE fp, char user, int right)**

      • 功能:将文件ranking.txt文件中的数据重新排序,更新排名。
    定义结构体数组ranks[U];//保存文件中的排名;
    定义结构体指针temp;
    定义变量userRank保存当前用户的上次排名;
    
    while(!feof(fp))
       for i=0 to U
         fscanf(fp, "%s%d%d/%d/%d%d:%d", ranks[i].name, &ranks[i].score, &ranks[i].year, &ranks[i].month, &ranks[i].day, &ranks[i].hour, &ranks[i].minute);//从文件中读取排名;
         if(strcmp(user,ranks[i].name)==0)//找到当前用户的排名;
           userRank=i;
           rank[i].score+=right*5;//计算成绩;
           GetTime(ranks+i);//得到当前的日期和时间;
         end if
       end for
       break;
    end while
    for i=userRank-1 to 0//从用户当前的排名开始遍历,往上比较;
        if(rank[i].score<ranks[userRank].score)//说明成绩可以超过上面那名选手;
           temp=ranks[i];
           rank[i]=ranks[userRank];
           userRank--;//当前用户的排名上升了一名;
        else
           break;//直接退出;
        end if
    end for
    使文件指针指向文件开头,开始向文件重新输入排序后的排名;
    
    • 代码截图:

    • *void GetTime(RANK rank_ptr) **

      • 功能:得到答题结束的时间,运用了函数localtime()可以得到当前的本地时间,但是有个小问题,得到的月份比实际要小1,时间也需要加上1900。
      • 代码截图:
    • void GetScore(int right, int count)

      • 功能:得到正确率并输出。
      • 代码截图:

    2.2.运行结果









    2.3大作业总结

    Q1:首先是多个函数都使用了文件指针,如果某个函数的文件指针已经指到文件尾部了,下一个函数调用的时候就会出问题,
    A1:所以在所有调用文件指针时,都使用fseek(fp,0,0)使得指针指向文件头/尾。
    Q2:刚开始对题目的输出处理,总是无法输出正常的汉字。
    A2:单个汉字占两个字节,如果想要输出一个汉字只使用一个%c或者两个%c是不可以实现的,应该要把单个汉字作为字符串处理,于是我利用了printf("%.*s",problem+2);来控制输出的汉字个数;
    Q3:对文件中排名的处理,不知道如何获取当前的日期和时间,本以为c语言的内容已经学习了很多了,没想到除了上课学习的还有许多需要我们去拓展的。~~革命还尚未成功啊啊~~
    A3:我上网去查找了,知道了函数localtime()将从time()函数中获得的从1970年1月1日到现在返回的秒数转换为当前的年,月,份,时,分,秒形式;但是实际年份还要加上1900,月份要加上1;
    Q4:多个文件函数之间的传参比单个文件函数的传参的难度要大太多了,写到后面发现需要前面的参数,然后去修修改改真的真的好难TAT
    A4:要写一个框架,标出每个功能需要的参数,整理好了再敲代码!!
    
  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/xianerbian/p/12038868.html
Copyright © 2011-2022 走看看