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("請輸入書籍信息:\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 鍵當成了八個空格,在系統提示后很快更改了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM