C語言博客做業--結構體

1、PTA實驗做業

題目1:6-3查找指定人員

1. 本題PTA提交列表

2. 設計思路(僞代碼或流程圖)

while(std++)
        若是 std->num==num
        返回 *std

3.代碼截圖

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

(1)只會輸出第一我的的信息


由於大意,在if語句後多了分號sql

題目2:7-1計算職工工資

1. 本題PTA提交列表

2. 設計思路(僞代碼或流程圖)

struct worker   //結構體               
{
char name[10];//姓名 
float basic;//基本工資 
float floating;//浮動工資
float expend;//支出
float sum;//求和 
};該結構體表示職員的姓名,職員的基本工資,職員的浮動工資,職員的支出,職員的最後工資
定義整型變量N表示職員數量,定義循環變量i
輸入 N
定義結構體類型work[N]儲存職員信息
for i=0 to i=N
    輸入 name,basic,floating,expend 
  sum 等於 basic 加 floating 減 支出
end
for i=0 to i=N
     輸出 name ,sum;
end

3.代碼截圖

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

錯誤一:work[i]不是指針,我用work[i]->name的方式表示;

題目2:7-2 時間換算

1. 本題PTA提交列表

2. 設計思路

struct time{
    int hour;
    int minute;
    int second;
};該結構體表示時間中的小時,分鐘,秒

定義結構類型 time1
整型 second2表示增長的秒數
輸入時間
輸入增長的秒數
將增長的秒數加到原來的秒time1->second上
若是 second 大於等於 60
second 減 60
minute 加 1
end
若是 minute 大於等於 60
minute 減 60
hour 加 1
end
若是 hour 大於等於 24
hour 減 24
end

按 輸出兩位十進制整數,不足往左邊補零的格式 輸出

3.代碼截圖

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

錯誤一:運用指針的方法使用結構體致使程序崩潰

錯誤二:沒有定義結構體變量,直接用結構體類型進行

錯誤三:關於輸出格式,%02d,輸出兩位十進制整數,左邊補零

2、截圖本週題目集的PTA最後排名。

3、閱讀代碼

軍霖同窗關於刪除子串的代碼

#include<stdio.h>
#include<string.h>
void del(char s[],char sub[]){
    char *p;
    if(  ( p=strstr(s,sub) )!=NULL  ){
            
        char *mark=p+strlen(sub);
            
        while(  (*p++=*mark++)  );
            
        del(s,sub);
    }       
}

int main(){
    char s[81],sub[81];
    gets(s);
    gets(sub);
    
    del(s,sub);
    
    puts(s);
    return 0;
}

(1)他的功能:輸入2個字符串S1和S2,要求刪除字符串S1中出現的全部子串S2,即結果字符串中不能包含S2。

(2)他的優點:

1.使用函數del達到刪除子串的功能

相對於上個博客,軍霖同窗的辦法,使用函數使整個程序看起來更加清晰簡潔編程

void del(char s[],char sub[]){
    char *p;
    if(  ( p=strstr(s,sub) )!=NULL  ){//p是子串出現的地址
            
        char *mark=p+strlen(sub);//子串結束的地址
            
        while(  (*p++=*mark++)  );//跳過一個子串將主串的其餘部分給p
            
        del(s,sub);
    }       
}

2.函數的嵌套使用

在函數裏又再一次調用了函數,每一次調用都會生成新的主串,即又去掉一個子串的主串,直到主串中沒有子串
數組

if(  ( p=strstr(s,sub) )!=NULL  )中p=strstr(s,sub) )==NULL

進入不了循環數據結構

3.新主串的儲存

while(  (*p++=*mark++)  );
即
*p=*mark
p++;
mark++;
直到mark爲'\0'

跳過一個子串將主串的其餘部分給p函數

此時原來的主串在第一個子串後的字符發生了改變學習

4.關於strstr函數

返回子串第一次出現的地址設計

(2)由於在作階級賽的時候作不出,因此和軍霖同窗拿了這道tokenizor

#include<stdio.h>
#include<string.h>
int main(){
    char s[44];
    gets(s);
    for(int i=0;s[i];i++){
        if(s[i]=='-'||s[i]=='+') {
            if(!i) printf("%c",s[0]);
            else {
                if(s[i-1]>='0'&&s[i-1]<='9') printf("\n%c\n",s[i]);
                else if(s[i-1]=='(') printf("%c",s[i]);
                else printf("%c\n",s[i]);
            }
        }

        
        else if(s[i]>='0'&&s[i]<='9'||s[i]=='.') printf("%c",s[i]);
        
        else{
            if(s[i-1]>='0'&&s[i-1]<='9') printf("\n%c\n",s[i]);
            else printf("%c\n",s[i]);
        }
        
    }
    
    
    
    return 0;
    
    
    
    
}

(1)他的功能:tokenizor

(2)他的優點:吳同窗經過對字符的判斷對輸出格式中回車鍵的有無及位置的進行改變達到題目的要求,減小了判斷量。

4、本週學習總結

12.18,週一

一,課堂派

(1)預習做業--結構體

  • 1,關於取名
    能夠經過下劃線來表示相關變量
    例如
struct book{
int book_number;
};

中用下劃線表示number與book的關係,但注意變量名的長度3d

  • 2.關於結構體賦值

不能夠直接賦值,錯誤賦值代碼:指針

*(p+2)={102030,「數據結構」,40}
  • 正確賦值方法一:
(*(p+2))=(struct book){102030,「數據結構」,40};
  • 正確的賦值方法二:(一個個賦值)
p=p+2;
p->book_number=102030;
strcpy(p->book_name,"數據類型");
  • 正確的賦值方法三:
p=&book_num[2]
而後一一賦值

注意:調試

二。課堂筆記

1.總結本週學習內容。

(1)驗證各種指針分配空間大小的方式

sizeof(int*);

(2)常見的數值轉換函數

#include<stdlib.h>
  • 1.字符串s轉換爲雙精度浮點型
double atof(char *s)
  • 2.字符串s轉換爲整型數
int atoi(char *s)
  • 3.字符串s轉換爲長整型數
long atol(char*s)
  • 4.以seed爲種子(初始值)計算產生一個無符號的隨機整數
srand(unsigned int seed)

(3)給固定數或者結構變量取名

  • 1.給固定數名稱
#define MAXN 20
  • 2.給結構體名稱
typedef struct sqlist
 {
   int data[N];
   int last;
   }LIST;

及後來結構體類型變量的定義

int main()
 {
    LIST list;
}

(4)共用體

  • 聲明共用體及定義共用體變量的通常形式
union data{
int        i;
char   ch;
double d; 
};
data a,b,c;
  • 與結構體的區別:

1.共同體的定義相似結構體,不過共同體的全部成員都在同一段內存中存放,起始地址同樣,而且同一時刻只能使用其中的一個成員變量。

2.結構體變量所佔長度是各成員佔的內存長度之和。每一個成員分別佔有本身的內存單元。共用體變量所佔的內存長度等於最長的成員的長度。

3.共用體變量中的值是最後一次存放的成員的值
如:

a.i = 1;
a.ch = 'a';
a.f = 1.5;

完成以上三個賦值語句後共用體邊量的值是 1.5而 a.i=1 和 a.ch='a'已無心義

4.共用體變量不能初始化例

union data
{
int i;
char ch;
float f;
}a={1,'a', 1.5}  錯誤!!!

5.優勢
共用體經常使用來節省內存,特別是一些嵌入式編程,內存是很是寶貴的!

(5)枚舉類型

  • 背景:

在實際應用中,有的變量只有幾種可能取值。
如:
人的性別只有兩種可能取值,
星期只有七種可能取值。

在 C 語言中對這樣取值比較特殊的變量能夠定義爲枚舉類型。

  • 定義:

    所謂枚舉是指將變量的值一一列舉出來,變量只限於列舉出來的值的範圍內取值。

  • 定義的形式:

1.定義一個變量是枚舉類型,能夠先定義一個枚舉類型名,而後再說明這個變量是該枚舉類型。
如:

enum weekday{sun,mon,tue,wed,thu,fri,sat};

定義了一個枚舉類型名 enum weekday,而後定義變量爲該枚舉類型。
如:

enum weekday day;

2.直接定義枚舉類型變量

enum weekday{sun,mon,tue,wed,thu,fri,sat} day;

其中,sum,mon,…,sat 等稱爲枚舉元素或枚舉常量,它們是用戶定義的標識符

  • 枚舉元素

① 枚舉元素不是變量,而是常數,所以枚舉元素又稱爲枚舉常量。由於是常量,因此不能對枚舉元素進行賦值。

② 枚舉元素做爲常量,它們是有值的,C 語言在編譯時按定義的順序使它們的值爲,1,2,…。

在上面的說明中,sun 的值爲 0,mon 的值爲 1,…sat 的值爲 6,若是有賦值語句

day=mon;

則 day 變量的值爲 1。固然,這個變量值是能夠輸出的。
例如:

printf ("%d",day);

將輸出整數 1。

若是在定義枚舉類型時指定元素的值,也能夠改變枚舉元素的值。
例如:

enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;

這時,sun 爲 7,mon 爲 1,之後元素順次加 1,因此 sat 就是 6 了。

③ 枚舉值能夠用來做判斷。
例如:

if (day==mon) {…} 
if (day>mon) {…}

枚舉值的比較規則是:按其在說明時的順序號比較,若是說明時沒有人爲指定,則第一個枚舉元素的值認做 0。
例如:

mon>sun,sat>fri。

④ 一個整數不能直接賦給一個枚舉變量,必須強制進行類型轉換才能賦值。
例如:

day=(enum weekday)2;

這個賦值的意思是,將順序號爲 2 的枚舉元素賦給 day,至關於workday=tue;

2.羅列本週一些錯題。

(1)C語言複習做業--結構體

  • 4,輸入要有&號

  • 5.改錯

(1)結構體的定義

(2)字符數據的讀取

(3),(4)字符的讀取及輸入格式


(5)注意輸出格式%7.2f;

  • 7,讀結構體

(2)PTA

結構體,7-6 通信錄的錄入與顯示

  • 錯誤一:輸入數組的時候是不用&,直接使用數組名的
  • 錯誤二:忽略了輸入的空格
scanf("%s %s %c %s %s\n",infor[i].name,infor[i].birth,&infor[i].sex,infor[i].fnum,infor[i].tnum);
  • 錯誤三:沒有擴大數組:題目說不超過15個數字,就只定義15個空間,致使K輸入不了
struct book{
    char name[11];
    char birth[11];
    char sex;
    char fnum[17];
    char tnum[17];//加號1數字15結束符1, 17
};
  • 錯誤四:關於num與K1的關係,編號是從0開始的,因此若是K1等於num也是找不到的
相關文章
相關標籤/搜索