一、PTA實驗作業
題目1:結構體數組中查找指定編號人員
1. 本題PTA提交列表
2. 設計思路
struct student{
char num[10];
int year,month,day ;
};//該結構體表示學生的姓名與出生年月日
struct student fun(struct student *std, char *num)//進入函數
int i;
struct student a 定義一個結構體變量
for i=0 to i<N
if(strcmp((std+i)->num,num)==0)即找到指定編號人員
a=*(std+i)讓a保存這個人的信息
break
return a返回這個人的信息
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明
- 一開始這么寫,雖然也對但是沒有用到函數的特點而且不夠精簡。其他沒有問題。
題目2:時間換算
1.本題PTA提交列表
2.設計思路
struct time{
int h;
int m;
int s;
};//該結構體表示時間的小時,分鍾和秒
int n,n 存放一會兒要加的整數秒
struct time t 定義一個結構體變量t
輸入小時,分鍾和秒,以及n
if(t.s+n>=60秒需要進位)
t.m=t.m+(t.s+n)/60 計算秒進位后的分鍾
t.s=(t.s+n)%60 計算秒進位后剩下的秒
if(t.m>=60 即分鍾需要進位)
t.h=t.h+t.m/60 計算分鍾進位后的小時
t.m=t.m%60; 計算分鍾進位后剩余的分鍾
if(如果小時大於等於24)
t.h=0 回到一天的開始
else即沒有進位的話
t.s=t.s+n;
輸出小時,分鍾和秒
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明
- 一開始忘記了沒有進位的情況導致錯誤,很快就發現了錯誤。
題目3:通訊錄的錄入與顯示
1.本題PTA提交列表
2.設計思路
struct people{
char name[20];
int year;
int month;
int day;
char sex;
char tel[20];
char phone[20];
};//該結構體包含了一個人的名字,出生年也日,性別,固話和電話
int N,K,num,i
輸入N
定義一個結構體數組 a[n]
for i=0 to i<N
輸入第i個人的名字,出生年月日,性別,固話和電話
輸入K
for i=0 to i<K
輸入num
if(num是數組的某一個下標) 則輸出這個人的姓名 固話 手機 性別 生日
else 輸出Not Found
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明
- 沒有判斷輸入num的數是否可以小於零導致錯誤。
- 沒有將出生年月日不足兩位時前補零至兩位。
二、截圖本周題目集的PTA最后排名
三、閱讀代碼
1.判斷回文字符串
#include<stdio.h>
#include<string.h>
int fun( char *str,int len)
{
char *p = str; //令p指向字符首位
char *q = str+len - 1; //令j指向數組最后一位
while(p < q)
{
if(*p != *q) //如果不是回文字符則返回0
return 0;
p++;//p指針從前向后
q--;//q指針從后向前
}
return 1; //走到這一步肯定是回文字符
}
int main()
{
char str[100] ;
int x;
gets(str);
x=fun(str,strlen(str));
if(x==1) printf("yes");
else printf("no");
return 0;
}
我做這道題的時候是這樣的
該題代碼優點:
- 十二行代碼就判斷出了是否為回文字符串,而我寫了32行可以看出很簡潔。
- 運用兩個指針一個從前到后一個從后到前,很機智的代碼,並且可讀性高。
2.讓n個數后移m個位置,超過數組大小的數字移動到前面
#include <stdio.h>
void main()
{
void move(int *, int, int);
int number[20], n, m, i;
printf("how many numbers?\n");
scanf("%d", &n);
printf("input %d numbers:\n", n);
for(i = 0; i < n; i++)
scanf("%d", number+i); //數組名的又一種應用
printf("how many place you want move?\n");
scanf("%d", &m);
move(number, n, m);//調用自定義函數
printf("Now, they are: \n");
for(i = 0; i < n; i++)
printf("%3d", *(number+i)); //指針法輸出數組的新內容
printf("\n");
}
void move(int * array, int n, int m)
{
int *p, array_end;
array_end = *(array+n-1);
for(p = array+n-1; p > array; p--)
*p = *(p-1);//數組后移一位
*array = array_end;
m--;
// recursive call the move function until m reduce to 0
if(m>0)
move(array, n, m); //遞歸調用
}
- 優點:運用了遞歸使函數效率更高。運用函數傳遞指針和指針偏移實現使代碼的可讀性更高,效率也高。
四、本周學習總結
1.總結本周學習內容
-
結構體:
結構類型是一種允許程序員把一些數據分量聚合成一個整體的數據量。與數組的不同在於:數組中所有元素的數據類型必須相同,而結構中各成員的數據類型可以不同。
定義格式為struct 結構名{ 類型名 結構成員1;類型名 結構成員2;···類型名 結構成員n; }結構變量名表;
結構體變量的定義可以跟在結構體定義的后面,也可以在main函數中定義,格式為struct 結構名 結構變量名;
-
共用體:
共用體是C語言中的一種數據類型,是指將不同類型的數據項存放於同一段內存單元的一種構造數據類型。特點:節省空間。
定義格式為union 共用體類型名 {類型名 成員1; 類型名 成員2;···類型名 成員n;;} 共用體變量名表 ;
與結構體一樣,公用體變量的定義可以跟在結構體定義的后面,也可以在main函數中定義,格式為union 公用體名 共用體變量名
-
枚舉:
枚舉是C語言中的一種基本數據類型,並不是構造類型,它可以用於聲明一組常數。枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號,隔開。特點:第一個枚舉成員的默認值為整型的0,后續枚舉成員的值在前一個成員上加1。可以 人為設定枚舉成員的值,從而自定義某個范圍內的整數。
定義格式為enum 枚舉名 {枚舉元素1,枚舉元素2,…枚舉元素n}枚舉類型變量名表;
與結構體一樣,枚舉類型變量的定義可以跟在枚舉結構的后面,也可以在main函數中定義,格式為enum 枚舉名 枚舉類型變量名
-
注意點:結構體,共用體和枚舉在定義時都需要在最后加上
;
。 -
遞歸函數:
遞歸函數需要兩個基本元素 遞歸出口和遞歸式子。工作原理為:(1)運動開始時,首先為遞歸調用建立一個工作棧,其結構包括值參、局部變量和返回地址。
(2)每次執行遞歸調用之前,把遞歸函數的值參和局部變量的當前值以及調用后的返回地址壓棧;
(3)每次遞歸調用結束后,將棧頂元素出棧,使相應的值參和局部變量恢復為調用前的值,然后轉向返回地址指定的位置繼續執行。
2.羅列本周一些錯題
課堂派的第四題
我今天才知道原來 scanf("%s",s[i].name)
不用加取地址符。實在是很細節的東西沒有記好。