C語言第十次博客作業--結構體
阿新 • • 發佈:2017-12-24
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語言第十次博客作業--結構體