作業要求一
請将pta作業程式設計題目的解題思路和調試過程記錄在部落格中,每道題目的具體格式如下:
題目6-1 計算兩數的和與差
1.設計思路
(1)主要描述題目算法。可以用文字描述(不允許使用僞代碼),
第一步:函數裡的psum、pdiff為指針變量,把a指派給op1,b指派到op2,&sum指派到psum,&diff指派到pdiff
第二步:對*psum及*pdiff進行指派
第三步:輸出結果
2.實驗代碼
void sum_diff(float op1,float op2,float *psum,float *pdiff)
{
*psum=op1+op2;
*pdiff=op1-op2;
題目6-2 拆分實數的整數與小數部分
第一步:函數裡的intpart、fracpart為指針變量,x指派給x,&intpart指派給intpart, &fracpart指派給fracpart
第二步:用int定義整型函數
第三步:用減法定義小數部分計算式
void splitfloat(float x,int *intpart,float *fracpart)
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
6-3 在數組中查找指定元素
第一步:通過主函數可得定義整型變量 j, list[], n, x, q, index
第二步:設q=-1,利用for循環,周遊數組,當有一個對應元素時,跳出循環
第三步:若x等于list[q],則傳回q的值,若沒有,則使index為-1
(2)流程圖
int search ( int list[], int n, int x )
{
int j;
int q = -1;
for(j=0;j<n;j++){
if(x==list[j])
{
q=j;
break ;
}
}
return(q);
}
6-4 找最大值及其下标
(1)主要描述題目算法。可以用文字描述(不允許使用僞代碼),
第一步:定義一個長度為10的數組,用j記錄最大值對應的下标
第二步:令max=a[0],周遊數組
第三步:利用for循環輸入a[i]的值,根據被調用函數比較出a、&p、N的最大值;
第四步:輸出所得的最大值和p的值
(2)流程圖
int fun(int *a,int *b,int n){
int q=a[0],j;
for(j=0;j<n;j++){
if(q<a[j]){
q=a[j];
*b=j;}
}
return(q);
}
6-5 最小數放前最大數放後
第一步:調用題目中定義的input(int *arr,int n)函數,定義i,使用for循環結構,當i小于元素個數n時,輸入arr資料,函數調用結束
第二步:調用函數max_min(int arr,int n),周遊數組,使得最大值位于函數元素的首位,最小值位于函數元素中的最後一位
第三步:調用函數 output(int *arr,int n) ,周遊數組,按照格式輸出arr數組中的元素
void input(int *arr,int n){
int i;
for(i=0;i<n;i++){
scanf("%d",arr+i);
}
}
void max_min(int *arr,int n){
int min=arr[0],max=arr[0];
int i,temp;
int q=0,w=0;
for(i=0;i<n;i++){
if(min>*(arr+i)){
min=*(arr+i);
q=i;
}
if(max<*(arr+i)){
max=*(arr+i);
w=i;
}
}
temp=*(arr+0);*(arr+0)=*(arr+q);*(arr+q)=temp;
temp=*(arr+n-1);*(arr+n-1)=*(arr+w);*(arr+w)=temp;
}
void output(int *arr,int n){
int i;
for(i=0;i<n;i++){
printf("%3d",*(arr+i));
}
}
3.本題調試過程碰到問題及解決辦法
錯誤資訊:
錯誤原因:取位址時*arr+i缺括号,取位址對象錯誤。
改正方法:對于整體取位址,括号位置應為*(arr+i)。
6-6指針選擇法排序
第一步:定義指針變量p、循環變量i、和一個數組,将數組首元素的位址指派給指針變量p
第二步:使用選擇排序法對數組進行從大到小的排序,輸出數組元素
void sort(int *x,int n){
int i,j,s,temp;
for(i=0;i<n-1;i++){
s=i;
for(j=i+1;j<n;j++){
if(*(x+s)<*(x+j)){
s=j;
}
}
if(s!=i){
temp=*(x+i);*(x+i)=*(x+s);*(x+s)=temp;
}
}
}
錯誤原因:for循環初始值表達錯誤,對指針了解不清晰
改正方法:通過查找資料對for循環知識進行鞏固
6-7 判斷回文字元串
第一步:定義字元數組s[20],輸入字元串指派給s
第二步:用循環結構,判斷在數組元素内是s[i]與s[j]是否相等。若是,則傳回true;若不是則傳回false
bool palindrome( char *s ){
int i,count=0,q;
count=strlen(s);
q=count/2;
for(i=0;i<q;i++){
if((*(s+i))!=(*(s+count-i-1))){
return(false);
}
}
if(i==q){
return(true);
}
}
錯誤資訊:
錯誤原因:指針定義錯誤,缺少函數名額
改正方法:添加strlen(s)函數定義,取位址時*後加括号
6-8 使用函數實作字元串部分複制
第一步:定義兩個字元數組t[20],s[20],m,輸入一個數賦給m
第二步:調用函數strmcpy,并通過for循環條件,輸出字元數組s
void strmcpy( char *t, int m, char *s ){
int i;
for(i=m;*(t+i-1)!='\0';i++){
*(s+i-m)=*(t+i-1);
}
*(s+i-m)='\0';
}
要求三、學習總結和進度
1、總結兩周裡所學的知識點有哪些學會了?哪些還沒有學會?
學習了指針及其應用,用指針變量做函數參數,還有數組指針和字元指針。了解了在引用數組元素的時候,指針變量和數組之間的互相轉化。但是對函數的掌握還是不熟練,對字元串與指針的組合題目掌握不熟練,對*()的應用還要多加練習。
2、将PTA作業的源代碼使用ggit位址it送出到托管平台上,要求給出上傳成功截圖和你的git位址。
git位址:https://git.coding.net/Downager/180325.git
3、點評3個同學的本周作業(在作業中給出被點評同學部落格的連結),并邀請3名同學點評你的作業。
http://www.cnblogs.com/sun031915/ http://www.cnblogs.com/phsudie/ http://www.cnblogs.com/gu-an-cheng-wxm/
4、請用表格和折線圖呈現你本周(3/12 8:00~3/26 8:00)的代碼行數和所用時間、部落格字數和所用時間。