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
键当成了八个空格,在系统提示后很快更改了
- 是老师上课说过的问题,想图方便便直接将Ubuntu上的makefile文件内容复制过来,在此基础上进行更改,结果将