1. 程式人生 > >C語言第九次博客作業---指針

C語言第九次博客作業---指針

單獨 四種 strstr 單獨使用 rcp 本周 定義類 跳出循環 運算符

一、PTA實驗作業

題目1.統計大於等於平均分人數

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

技術分享圖片

3.代碼截圖

技術分享圖片

4.本題調試過程碰到問題及PTA提交列表情況說明

①第一次代碼驗證對後貼到pta上顯示答案錯誤。
技術分享圖片
技術分享圖片

②加兩個0分的成績,發現人數變多,平均分不變。
技術分享圖片

③嘗試改條件,發現答案更加離譜。
技術分享圖片技術分享圖片技術分享圖片

④在同學的幫助下循環條件修改,最後正確。
技術分享圖片

題目2.判斷回文字符串

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

定義i,j為循環變量,n存放字符串長度,flag為是否回文的標誌
for i=0 to s[i]=‘\0‘
    字符串長度n++; 
end for 
for i=0,j=n-1 to i>j
    if 是回文字符串 
        flag=1;
    else 
        flag=0;跳出循環;
end for
if flag為1 
    是回文字符串
else 
    不是回文字符串

3.代碼截圖

技術分享圖片

4.本題調試過程碰到問題及PTA提交列表情況說明

①初步代碼,答案錯誤。
技術分享圖片

技術分享圖片

②驗證發現問題。只要有一組字符相等,就有flag=1,因此判斷到中間如果發現不是回文字符串應該令flag=0。
技術分享圖片技術分享圖片

技術分享圖片

題目3.使用函數實現字符串部分復制

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

定義循環變量i;
for i=1 to m
    開始的位置t++;
end for
while(*t)
    字符復制到字符串s中;
    t遞增;
結束符*s=‘\0‘;

3.代碼截圖

技術分享圖片

4.本題調試過程碰到問題及PTA提交列表情況說明

①尋找開始復制的位置時,循環裏的條件使用錯誤,導致輸出答案錯誤。


技術分享圖片技術分享圖片
①把i=0改為i=1後正確。

二、截圖本周題目集的PTA最後排名。

PTA排名

技術分享圖片

PTA提交列表

技術分享圖片
技術分享圖片
技術分享圖片

三、閱讀代碼

  • 1.刪除字符串中的子串
    分析:這段代碼中采用了四種字符串操作函數:strcpy, strcat,strstr,strlen;利用strstr在字符串a中查找字符串b首次出現的地址,利用strcpy得到刪除b字符串後得到的後面的字符串賦值到數組c中,再利用strcat把字符串c連接到a使a成為包含c和a的結果串。循環以上步驟。
    優點:巧妙地運用了字符串操作函數,使原本復雜的代碼變得較簡單。
    技術分享圖片

  • 2.字符串的冒泡排序
    分析:通過strcmp函數比較前後兩個字符串,利用了strcpy函數的復制功能做到了字符串冒泡的效果,輸出掃描完第K遍後的中間結果序列。
    優點:運用字符串操作函數來表現字符串冒泡的效果,比較巧妙。
    技術分享圖片

四、本周學習總結

1.自己總結本周學習內容。

1.什麽是結構?結構與數組有什麽差別?

  • 結構是C語言中一種新的構造數據類型,它能夠把有內在聯系的不同類型的數據統一成一個整體,使它們相互關聯;又是一個變量的集合,可以按照對基本數據類型的操作方法 單獨使用其成員變量。
  • 結構與數組的比較:①都是構造類型,是多個變量的集合;②數組成員類型相同,結構成員類型不同。

2.結構類型的定義形式

2.1結構類型定義的一般形式

struct 結構名{
    類型名 結構成員名 1 ;
    類型名 結構成員名 2 ;
    …
    類型名 結構成員名 n ;
};

註:
①struct是定義結構類型的關鍵字
②結構名是一個合法的C標識符
③關鍵字和結構名組成結構類型名。
④大括號內的內容是結構所包括的結構成員,也叫結構分量。
⑤結構的定義以分號結束。

2.2結構的嵌套定義

struct address{   //定義地址結構
    char city[10];
    char street[20];
    int code;
    int zip;
};
struct nest_student{
    int num;
    char name[10];
    struct address addr;   //定義通信地址成員
    int computer,english,math;
    double average;
};

註:定義嵌套的結構類型時,必須定義成員的結構類型定義主結構類型

2.3.用typedef定義類型

  • 方法一:先定義結構體類型,再使用typedef為之取一個別名。

    struct student{
    int num;
    char name[10];
    struct address addr;   
    int computer,english,math;
    double average;
    };
    typedef struct student STU;
  • 方法二:定義結構體類型的同時使用typedef為之取一個別名,並且不省略結構體標識名。

    typedef struct student{
    int num;
    char name[10];
    struct address addr;   
    int computer,english,math;
    double average;
    }STU;
  • 方法三:定義結構體類型的同時使用typedef為之取一個別名,並且省略結構體標識名。

    typedef struct {
    int num;
    char name[10];
    struct address addr;   
    int computer,english,math;
    double average;
    }STU;

3.結構變量的定義

  • 1.單獨定義:先定義一個結構類型,再定義這種結構類型的變量。

    struct 結構名{
    類型名 結構成員名 1 ;
    類型名 結構成員名 2 ;
    …
    類型名 結構成員名 n ;
    };
  • 2.混合定義:在定義結構類型的同時定義結構變量。

    struct 結構名{
    類型名 結構成員名 1 ;
    類型名 結構成員名 2 ;
    …
    類型名 結構成員名 n ;
    }結構變量名表;
  • 3.無類型名定義:在定義結構變量時省略結構名。

    struct {
    類型名 結構成員名 1 ;
    類型名 結構成員名 2 ;
    …
    類型名 結構成員名 n ;
    }結構變量名表;

4.結構變量的使用

4.1.結構變量的成員的引用

  • 格式:結構變量名.結構成員名
    例:
    strcpy(s1.name,"zhang");
    ②嵌套結構:nest_s1.add.zip=310015;//表示學生的通信地址的郵編
    註:
    ①嵌套定義的結構變量中,每個成員按從左到右,從外到內的方式引用。
    ②結構成員成員運算符的優先級屬最高級別,所以一般情況下都是優先執行,即和一般運算符混合運算時,結構成員運算符優先。

4.2.結構變量的整體賦值

註:只有相同結構類型的變量之間才可以直接賦值。
例:s2=s1;等效於

s2.num=s1.sum;
strcpy(s2.name,s1.name);//數組
s2.math=s1.math;
s2.english=s1.english;
s2.computer=s1.computer;
s2.average=s1.average;

4.3.結構變量作為函數的參數特點

  • 特點:可以傳遞多個數據且參數形式較簡單。但是,對於成員較多的大型結構,參數傳遞時所進行的結構數據復制使得效率較低。、

5.結構數組操作

  • 結構數組的每個數組元素都是一個結構類型的數據。
  • 定義:struct student students[50];
  • 初始化:struct student students[50]={{101,"zhang",76,85,78},{102,"wang",83,92,86} };
  • 引用:結構數組名 [下標].結構成員名
    例:字符型數組:strcpy(students[i].name,"zhang");

6.結構指針概念

  • 結構指針就是指向結構類型變量的指針。
  • 結構指針的值實際上時結構變量的首地址,即第一個成員的地址。

    struct student s1={101;"zhang",78,87,85},*p;
    p=&s1;
  • 訪問結構成員
    (1)用*p訪問結構成員
    (*p).num=101;
    註:括號不能少。因為“.”優先級高於“*”,若沒有括號,*p.num等價於*(p.num),含義發生變化,會產生錯誤。
    (2)用指向運算符->訪問指針指向的結構成員
    p->num=101;
    註:在使用結構指針訪問結構成員時,通常使用指向運算符->。

2.羅列本周一些錯題。

  • 應該在sum+=*s後加上‘0’才能將字符串中的數字字符轉換成對應數值
    技術分享圖片

  • 圖中圈出來的一處表示的應該是n所指向的內容遞增,而不是地址自增,應該是(*n)++

技術分享圖片

C語言第九次博客作業---指針