• Linux C语言编程基础(必做)


    Linux C语言编程基础(必做)

    1. 选择教材第二章的一节进行编程基础练习
    选择2.10与链相关的内容进行编码练习

    • 题目要求
      1.构造一个图书的结构体BOOK,包含编号,书名,价格(价格有小数)。
      2.构造一个由BOOK组成的顺序表,能存放不超过100本书的数据。
      3.用下列数据初始化书籍顺序表,编号为0代表输入结束。
      1  chinese  25.8
      2  mathematics  18.3
      3  chemistry  21.5
      0 # 0
      输出要求详见Output Description。
      Input
      输入数据如下:
      1  chinese  25.8
      2  mathematics  18.3
      3  chemistry  21.5
      0 a 0
      Output
      下面是符合要求的输出形式:
      书籍信息如下:
      1,chinese,25.8
      2,mathematics,18.3
      3,chemistry,21.5
      实践部分
      从题目分析来看,可以使用动态存储进行实现,具体代码如下:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define LIST_INIT_SIZE 100
    typedef struct  BOOK
    {
        int BOO_ID;
        char name[30];
        float price;
    }BOOK;
    
     typedef struct  BOO_List  *ptr_BOO_List;
    struct  BOO_List
    {
        BOOK *BOO_Class;
        int length;
        int listsize;
    };
    
    ptr_BOO_List Create_EmptyList(   )
    {
        ptr_BOO_List   tempL;
        tempL=(ptr_BOO_List) malloc (  sizeof(struct  BOO_List)  );
        tempL->BOO_Class =(BOOK *)malloc(LIST_INIT_SIZE*sizeof(BOOK)  );
        tempL->length = 0;
        tempL->listsize = LIST_INIT_SIZE;
        return tempL;
    }
    
    void Init_List(ptr_BOO_List L)
    {
        int  i;
        printf("请输入书籍信息:
    ");
     for (i = 0; i <L->listsize; i++)
     {
         scanf("%d", &L->BOO_Class[i].BOO_ID);
            scanf("%s", L->BOO_Class[i].name);
            scanf("%f", &L->BOO_Class[i].price);
            if(L->BOO_Class[i].BOO_ID== 0) break;
        }
        L->length= i;
    }
    
    void Print_List(ptr_BOO_List L)
    {
     int j;
     printf("书籍信息如下:
    ");
     for(j=0;j<L->length;j++)
     {
      printf("%d,%s,%.1f
    ",L->BOO_Class[j].BOO_ID,L->BOO_Class[j].name,L->BOO_Class[j].price);
     }
    }
    
    void GetBook(ptr_BOO_List L)
    {
     int i;
     printf("您要查询第几本书?
    ");
     scanf("%d",&i);
     printf("第%d本书的书名为%s.
    ",i,L->BOO_Class[i-1].name);
    }
    
    void LocateBook(ptr_BOO_List L)
    {
     printf("请输入要查询书名:
    ");
     char bookname[30];
     scanf("%s",bookname);
     int n;
     for(n=0;n<L->length;n++)
     {
      if(strcmp(bookname,L->BOO_Class[n].name)==0)
      {
       printf("%s的价格是%.1f.
    ",bookname,L->BOO_Class[n].price);
       return;
      }
     }
     printf("书籍%s不存在.
    ",bookname);
    }
    int main(  )
    {
        ptr_BOO_List testL=NULL;
        testL=Create_EmptyList(   );
        if (testL!=NULL)
      Init_List(testL);
        Print_List(testL);
        GetBook(testL);
        LocateBook(testL);
        return 0;
    }
    

    练习截图

    2. 建立自己的项目目录,包含自己学号信息(如20190100linkedlist),构建项目结构(src, include,bin, lib, docs, test...),然后把相应代码和文档放置到正确位置,用tree命令查看项目结构

    • 实践部分
    • 创建目录 mkdir + xx

    src存放不是主函数的.c文件
    include存放头文件
    bin存放最后输出的文件
    lib存放所有的.o文件
    test存放主函数的.c文件

    • 实践截图


    • 出现问题

    • 在标明头文件路径时,因为并不十分清楚应当如何输入导致多次出错


    3. gcc相关练习(ESc, iso, -I等)

    • 实验过程命令如下
    gcc -E main.c -o main.i
    gcc -S main.i -o main.s
    gcc -c main.s -o main.o
    gcc main.o -o main
    
    • 具体代码如下:
    #include<stdio.h>
     typedef struct BOOK
         {
                int book_ID;
                char book_name[50];
                float book_price;
            }BOOK;
        
        typedef struct 
     {
            BOOK a[100];
            int length;  
        } Sqlist;
        
    int main()   
        {
         int i;
            float sum=0.0;
            Sqlist L;
            printf("书籍信息如下:
    ");
            for (i = 0; i < 100; i++)
      {
                scanf("%d", &L.a[i].book_ID);
                scanf("%s", &L.a[i].book_name);
                scanf("%f", &L.a[i].book_price);
                if(L.a[i].book_ID== 0) break;
            }
            L.length= i;
            for(i = 0; i < L.length; i++)
            {
                printf("%d,%s,%.1f
    ",L.a[i].book_ID,L.a[i].book_name,L.a[i].book_price);
                sum=sum+L.a[i].book_price;
            }
            printf("书籍总价为:%.1f",sum);
            return 0;
     }
    
    • 实践截图

    4. 进行静态库,动态库制作和调用练习
    在选作作业myod中已经实现
    博客链接:https://www.cnblogs.com/tzy20191327/p/15321261.html

    5. 进行gdb相关练习,至少包含四种断点的设置
    先将测试代码附上

    #include<stdio.h>
    
    int add(int n){
    	int i,sum=0;
    	for(i=1;i<=n;i++){
    	sum=sum+i;
    	}		
    	return sum;
    }
    
    int main(){
    	int n,s;
    	printf("请输入N的值:");
    	scanf("%d",&n);
    	s=add(n);
    	printf("1+2+3+4+5+.....+%d=%d
    ",n,s);
    
    }
    
    • 第一步是生成可以进行gdb调试的文件
    • 第二步是进行行断点的尝试
      • 可以发现在进行断点后可以多次查看断点信息
    • 再进行临时断点的尝试
      • 可以发现临时断点一开始存在,但是在运行一次程序后断点消失了。无法在查询到断点信息
    • 再进行函数断点的尝试

      • 可以看到断点已经进行了一次,对照最上面的函数main函数确实是在第13行开始;
      • 并且可以发现虽然临时断点已经消失但是断点编号还是保存了下来,函数断点的断电编号为3。
    • 最后尝试条件断点
      • 最后尝试发现测试代码好像可以进行条件断点但是没办法执行,因为可以进行的条件判断的值n是直接输入的,s是直接等于add函数和的,不会进入循环,尝试使用i进行条件设置但是gdb表示寻找不到。
      • 所以更换了测试代码,代码如下
    #include <stdio.h>
    
    int main (int argc, char *argv[])
    {
    	int i = 0;
    	int sum = 0;
    	for (i = 1;i <= 429; ++i)
    	{
    		sum += i;
    	}
    	printf("%d
    ",sum);
    	return 0;
    }
    


    - 再使用原测试代码进行验算,结果一致

    • 进行忽略断点的实践
      忽略断点使用 ignore + x + cut
      意思是接下来的cnt次编号x的断点触发都不会让程序暂停,只有第cnt+1次断点触发才会让程序暂停

    6.编写makefile
    已经在Ubuntu进行了一次,直接在openEuler上在进行一边操作,具体步骤参考选作,链接:https://www.cnblogs.com/tzy20191327/p/15321261.html

    • 实践截图
    • 出现问题
      • 是老师上课说过的问题,想图方便便直接将Ubuntu上的makefile文件内容复制过来,在此基础上进行更改,结果将 Tab 键当成了八个空格,在系统提示后很快更改了
  • 相关阅读:
    算算百度云的总成本
    iCloud 包括文稿与数据、日历、提醒事项、 通讯录、备忘录、Safari书签
    娄师德的低调
    我必须创业,否则那5个月的工资谁来发给我
    完整的struts.xml文件骨架
    从程序员的角度谈创业三年
    Delphi 获取Internet缓存文件 -- FindFirstUrlCacheEntry FindNextUrlCacheEntry
    没有别人聪明不可怕,可怕的是别人比你聪明也比你勤奋(活着总要为自己负责,而且首先是对自己的时间负责)
    光思想对是没有用的
    Mac与Linux的一个巨大不同
  • 原文地址:https://www.cnblogs.com/tzy20191327/p/15331510.html
Copyright © 2020-2023  润新知