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 键当成了八个空格,在系统提示后很快更改了
原文地址:https://www.cnblogs.com/tzy20191327/p/15331510.html