1. 程式人生 > >C語言第十次博客作業--結構體

C語言第十次博客作業--結構體

cores include san 直接 數組操作 getch stdlib.h 功能 img

一、PTA實驗作業

題目1:按等級統計學生成績

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

 定義循環變量i,count統計不及格人數
 for i=0 to n
 如果 (p+i)>score大於等於85
 (p+i)->grade 等於A
 
 如果 (p+i)>score大於等於70
 (p+i)->grade 等於B
 
 如果  (p+i)>score大於等於60
 (p+i)->grade 等於C
 
  否則
 (p+i)->grade 等於D
    count++
    返回count

3.代碼截圖

技術分享圖片

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

不會用(p+i)->score和(p+i)->grade,導致編譯錯誤,分等級的時候就是單純的set_grade=A這樣,後來參考了別人的代碼才改正過來

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

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

 struct worker{
    char name[10];
    double jbgz;
    double fdgz;
    double zc;
    double sfgz;
};該結構體表示職工的名字,基本工資,浮動工資,支出和實發工資
定義循環變量i,N為職工人數
輸入N
定義結構數組worker workers[N]
for  i=0 to N
輸入workers[i].name,&workers[i].jbgz,&workers[i].fdgz,&workers[i].zc 
for i=0 to N
計算實發工資workers[i].sfg
 輸出職工名字workers[i].name和實發工資workers[i].sfg

3.代碼截圖

技術分享圖片

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

多種錯誤是因為我沒有定義結構數組struct worker workers[N],也沒有計算實發工資,而是直接在輸出裏面計算實發工資,編譯結果是0.00

題目3:7-2 時間換算

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

 定義變量 h為小時,m為分鐘,s為秒,n為第二行增加的秒數
 輸入h,m,s 
 輸入n
 換算s 換算m 換算h
 s對60取余 m對60 取余 h對24取余
 輸出h,m,s

3.代碼截圖

技術分享圖片

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

技術分享圖片

如上圖所示,輸出的分鐘格式沒有正確,後把%d改為%2d也沒有正確,最後改為%02d就正確了

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

技術分享圖片

三、閱讀代碼

1.查找書籍

給定n本書的名稱和定價,查找並輸出其中定價最高和最低的書的名稱和定價

#include<stdio.h>
#include<stdlib.h>
typedef struct {
    char bName[30];
    double price;
}bInfo;

int main() 
{
    int i, n;
    int max, min;
    bInfo *data;
    scanf("%d", &n);
    getchar();
    data = (bInfo*)malloc(sizeof(bInfo) * n);
    for (i = 0; i < n; i++) {
        gets(data[i].bName);
        scanf("%lf", &data[i].price);
        getchar();
    }
    max = min = 0;
    for (i = 0; i < n; i++) {
        if (data[max].price < data[i].price) {
            max = i;
        }
        if (data[min].price > data[i].price) {
            min = i;
        }
    }
    printf("\n%.2f, %s\n", data[max].price, data[max].bName);
    printf("%.2f, %s\n", data[min].price, data[min].bName);
    system("pause");
    return 0;
}

技術分享圖片

2.通訊錄的錄入與顯示

技術分享圖片

四、本周學習總結

1.總結本周學習內容

指針字符串 
字符串的復制,連接,比較及計算字符串長度的函數,在系統頭文件string.h中定義

 字符串復制函數 char *strcpy(char *s1,char *s2) 

字符串連接函數 strcat(s1,s2) 

字符串比較函數 strcmp(s1,s2)

 字符串長度函數 strlen(s1) 
 結構 
結構的定義:
 struct 結構名{ 
          類型名 結構成員名
 };
 或 
struct 結構名{
        類型名 結構成員名
 }結構變量名表;

 結構變量成員的引用:結構變量名.結構成員名 例如 s1.num

 對嵌套成員的引用:struct nest_student nest_s1; nest_s1.addr.zip;

 結構變量的整體賦值:以下語句等效(只有相同結構類型的變量之間才可以直接賦值)

 s1=s2;s2.num=s1.num;strcpy(s2.name,s1.name); 
結構數組操作
 結構數組的定義:struct student students[50]; 

在定義結構素組時可以同時對其進行初始化,格式與二維數組的初始化類似:

 struct student students[50]={101,‘zhang‘,76,86,78},{102,‘wang‘,83,92,84}}; 

對於結構數組students,既可以引用數組的元素,如:students[i],也可以引用結構數組元素的成員,如:students[i].num 
 結構指針 即:指向結構類型變量的指針 例如,編寫以下語句: struct students s1={101,‘zhang‘,78.87.97},*p; p=&s1;

 用*p訪問結構成員:(*p).num=101;

 用指向運算符->訪問指針指向的結構成員:p->num=101;

 當p指向結構變量s1 時,s1.num=101;(*p).num=101;p->num=101;效果一樣
 遞歸 

遞歸函數原理:遞歸就是子程序(或函數)直接調用自己或通過一系列調用語句間接調用自己,是一種描述問題和解決問題的基本方法

遞歸是把一個不能或不好解決的大問題轉化為一個或幾個小問題,再把這些小問題進一步分解成更小的問題,直至每個小問題都可以直接解決

遞歸方法的兩個要點:

 遞歸出口,即遞歸的結束條件,到何時不再遞歸調用下去

 遞歸式子,遞歸的表達式,如fact(n)=n*fact(n-1)
 結構體:結構體是構造型數據類型,可以處理不同類型的數據,每一位成員都用來表示一種具體事務的屬性,結構體總空間大小,等於各成員總長度 

共用體:共用體是一種多變量共享存儲空間的構造類型,共用體成員可以表示多種屬性,共用體空間等於最大成員占據的空間,共用體不能賦初值

 枚舉:枚舉類型是一種基本類型,是指變量的值可以全部列出,定義一個枚舉變量後,變量的值確定在定義之中,枚舉元素是常量,只能在定義階段賦值

2.羅列本周一些錯題

5、簡答題

分值15.0

得分: 5.0 

    程序改錯題:

    輸入一個正整數n(3<=n<=10),再輸入n個雇員的信息(如下表所示),輸出每人的姓名和實發工資(基本工資+浮動工資-支出)。

格式:

    改正代碼//錯誤代碼

#include<stdio.h>

int main()

{  
    struct emp
    {  
         char name[10];
         float jbg;
         float fdg;
         float zc;

     };
    int i,n;
    printf(“n=”);
    scanf(“%d”,&n);
    for(i=0;i<n;i++)
         scanf(“%s%d%d%d”,emp[i].name,emp[i].&jbg,emp[i].&fdg,emp[i],&zc);
    for(i=0;i<n;i++)
         printf(“%5s實發工資:%d\n”, emp[i].name,emp[i].zc);
    return 0;

}

參考答案


#include<stdio.h>
int main()
{  
    struct 
    {  
         char name[10];

         float jbg;

         float fdg;

         float zc;

     }emp[10];  //1
    int i,n;
    printf("n=");
    scanf("%d",&n);
    getchar();  //2
    for(i=0;i<n;i++)
        {
          scanf("%s%f%f%f",emp[i].name,&emp[i].jbg,&emp[i].fdg,&emp[i].zc);   //3
          getchar();} //4
    for(i=0;i<n;i++)
         printf("%5s實發工資:%7.2f\n", emp[i].name,emp[i]. jbg+emp[i]. fdg-emp[i].zc);//5
    return 0;

}

我的作答

double jbg/fdg/zc   // float jbg/fdg/zc

scanf("%s%lf%lf%lf",emp[i].name,&emp[i].jbg,&emp[i].fdg,&emp[i].zc) //

printf("%s實發工資:%.2f\n",emp[i].name,emp[i].zc)
3、填空題

分值20.0

得分: 0.0 

程序通過定義學生結構體變量,存儲了學生的學號、姓名和3門課的成績。 

函數fun的功能是將形參a所指結構體變量s中的數據進行修改,並把a中地址作為函數值返回主函數,在主函數中輸出修改後的數據。

例如:a所指變量s中的學號、姓名、和三門課的成績依次是: 

10001、" ZhangSan "、95、80、88, 

修改後輸出t中的數據應為:10002、"LiSi "、96、81、89。

註意:按照順序填代碼,不要帶編號1,2,3,4。空格或回車隔開。
#include  <stdio.h>
#include  <string.h>
struct student {
  long  sno;
  char  name[10];
  float  score[3];
};

 ______2__________ Modif(struct student  *p)
{
   int  i;

   p->sno = 10002;
   strcpy(p->name, "LiSi");
   for (i=0; i<3; i++)
       ______3_______++;

   return _____4________;
}

void main()
{
  struct student  s={10001,"ZhangSan", 95, 80, 88},  *t;
  int  i;

  printf("\n\nThe original data :\n");
  printf("\nNo: %ld  Name: %s\nScores:  ",s.sno, s.name);
  for (i=0; i<3; i++)
     printf("%6.2f ", ___1____);
  printf("\n");
  t = Modif(&s);
  printf("\nThe data after modified :\n");
  printf("\nNo: %ld  Name: %s\nScores:  ",t->sno, t->name);
  for (i=0; i<3; i++)
    printf("%6.2f ", t->score[i]);

  return 0;
}


參考答案

s.score[i]
struct student *
p->score[i]
p

我的作答

int
*p
score
s.score
2、簡答題

分值20.0

得分: 0.0 

線性表用順序實現。請填空寫一個求線性表L 中所有奇數之和的算法。

  例如: 

  L=(1,2,3,4,5) 其和為 9(本題結構體定義很不錯。)
#include <stdio.h>
#define N 10
typedef struct sqlist
 {
   int data[N];
   int last;
   }LIST;

 int Total(List list)
 {


     return sum;  
 }
 void Show(LIST list)
 {
   int i;
   for(i=0;i<=list.last;i++)
      printf("%3d", list.data[i]);
   printf("\n");
 }


int main()
 {
    LIST list;
    int i,sum;
    for(i=0;i<=5;i++)
     list.data[i]=i;
    list.last=5;
    Show(list);
    sum=Total(list);
    printf("sum=%3d\n",sum);
    return 0;
}

參考答案

int sum=0;
for(int i=0;i<=list.last;i++)
   if(list.data[i]%2)
      sum+=list.data[i];

技術分享圖片

技術分享圖片

C語言第十次博客作業--結構體