一、PTA實驗作業
題目1:兩個4位正整數的后兩位互換
1. 本題PTA提交列表
2. 設計思路
定義循環變量i,兩個數組a[4],b[4]
for i=0 to 3a[i]*p取各個位*p/=10
end
for i=0 to 3b[i]*q取各個位*q/=10
end
分別對*p和*q重新賦值
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
本題沒有多大問題,就是想再找一種更簡單的做法。
題目2: 輸出月份英文名
1. 本題PTA提交列表
2. 設計思路
if形參n不再月份范圍內return NULL
定義指針數組*a[]并賦值十二個月份return a[n-1]
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
剛開始我用的switch語句來判斷月份,后來在舍友提醒下改成了數組來存放英文并直接返回。
- 部分正確 :月份不在范圍內
解決辦法:加入if判斷若不在范圍內,就返回NULL
題目3:過濾字符串只保留串中的字母字符
1. 本題PTA提交列表
2. 設計思路
定義*a存放ptr,循環變量i,計數變量count
while(*ptr)if *ptr 是字母將*ptr存放到*(a+i)中 i++else count++ 記錄非字母ptr++繼續循環
end
*(a+i)賦值結束符
return count非字母個數
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
這道題前面一直在對p直接判斷,導致提交運行超時,后來利用另一個指針來存放符合題意的字符并返回,就不會運行超時。
二、截圖本周題目集的PTA最后排名。
三、閱讀代碼
strcpy字符串復制函數原型
char * strcpy(char * dest, const char * src) // 實現src到dest的復制
{if ((src == NULL) || (dest == NULL)) //判斷參數src和dest的有效性{return NULL;}char *strdest = dest; //保存目標字符串的首地址while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內容復制到dest下return strdest;
}
memcpy內存拷貝函數原型
void *memcpy(void *memTo, const void *memFrom, size_t size)
{if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效return NULL;char *tempFrom = (char *)memFrom; //保存memFrom首地址char *tempTo = (char *)memTo; //保存memTo首地址 while(size -- > 0) //循環size次,復制memFrom的值到memTo中*tempTo++ = *tempFrom++ ; return memTo;
}
strcpy和memcpy主要有以下3方面的區別。
1、復制的內容不同。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。
2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
strcpy字符串復制函數原型
#include "assert.h"
char *strcpy(char *strDest, const char *strSrc) //使用const來約束strSrc,提高程序的健壯性。如果函數體內的語句試圖改動strSrc的內容,編譯器將指出錯誤。
{ assert((strDest != NULL) && (strSrc!= NULL)); //對傳入參數strDest和strSrc進行檢查,禁止空指針傳入if (strDest == strSrc) return strDest; char *tempDest = strDest; while((*strDest++ = *strSrc++) != '\0'); return tempDest;
}
四、本周學習總結
1.自己總結本周學習內容。
1.1"&"與"*"互為逆運算
- "&"是取地址符
&(變量名)=>獲取變量的地址
- "*"是指針聲明符和間接訪問運算符(取值運算符)
*(變量名)=>將變量當作地址,到相應的地址取值
1.2指針
- 定義指針變量
int *p,i;
p=&i;
p=0;
p=NULL;
p=(int *) 1732;(表示p指向地址為1732的int型變量)
指針變量就是用來儲存地址的變量
指針的作用:用來傳遞地址,作為引用類型的變量,減少內存消耗。
1.3指針與數組
數組名就是一個地址,指向這個數據的開端
*p==a[0]
*(p+n)==a[n]
*p+=1,(*p)++,++*p將指針p所指向的變量值加1
*p++,*(p++)先取*p的值作為表達式的值,在將指針p的值加1
1.4排序和查找
- 冒泡排序
void bubble (int a[],int n)
{int i,j,t;for( i=0; i<n; i++)for( j=0; j<n-1; j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
- 選擇排序
void choose (int a[],int n)
{int i,j,t;for( i=1; i<n; i++)for( j=i+1; j<n; j++)if(a[j]>a[i]){t=a[j];a[j]=a[i];a[i]=t;}
}
- 二分查找法
int Bsearch(int *p, int n, int x) \\ 二分查找函數
{ int low, high, mid;low = 0; high = n - 1; \\開始時查找區間為整個數組 while (low <= high) { \\循環條件mid = (low + high) / 2; \\ 中間位置if (x == p[mid])break; \\查找成功,中止循環else if (x < p[mid]) high = mid - 1; \\前半段,high前移 else low = mid + 1; \\后半段,low后移 } if(low <= high) return mid; \\ 找到返回下標 else return -1; \\找不到返回-1
}
1.5結構體的定義
struct time{int hour;int minute;int second;
};
struct time t;
struct time{int hour;int minute;int second;
} t;
1.6結構體嵌套
struct date{int year;int month;int day;
};
struct person{char name[256];struct date birthday;
};
1.7結構體的引用和初始化
struct student{int number;char name[256];char sex[6];int age;int grade;
};
int main()
{struct student alan={01,"alan","man",16};printf(alan.name);
}
1.8結構體數組
struct student{int number;char name[256];char sex[6];int age;int grade;
};
int main()
{struct student class[5];strcpy(alan.name,"alan");printf(alan.name);
}
2.羅列本周一些錯題。
寫函數fun , a數組中n個整數從小到大排列,函數功能是:從a中刪除第一個遭到與x值相同的數組元素,刪除后a的數組仍然由小到大有序排列。
這道題尤其要注意最后一個空n=n-1,平時很容易忽略掉