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("請輸入書籍信息:\n");
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("書籍信息如下:\n");
for(j=0;j<L->length;j++)
{
printf("%d,%s,%.1f\n",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("您要查詢第幾本書?\n");
scanf("%d",&i);
printf("第%d本書的書名為%s.\n",i,L->BOO_Class[i-1].name);
}
void LocateBook(ptr_BOO_List L)
{
printf("請輸入要查詢書名:\n");
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.\n",bookname,L->BOO_Class[n].price);
return;
}
}
printf("書籍%s不存在.\n",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("書籍信息如下:\n");
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\n",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",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\n",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文件內容復制過來,在此基礎上進行更改,結果將