作業要求一 :
作業要求二:
·題目6-1 計算兩數的和與差
1.設計思路
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題需要實現一個計算輸入的兩數的和與差的簡單函數。
第二步:由主函數知,op1和op2(形參)是輸入的兩個實數,指針數據*psum,*pdiff(形參)表示輸出的結果。
第三步:根據加減運算即可得出結果。
(2)流程圖:
2. 實驗代碼
#include <stdio.h> void sum_diff( float op1, float op2, float *psum, float *pdiff ); int main() { float a, b, sum, diff; scanf("%f %f", &a, &b); sum_diff(a, b, &sum, &diff); printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff); return 0; } void sum_diff(float op1,float op2,float *psum,float *pdiff) { *psum=op1+op2; *pdiff=op1-op2; }
3.本題調試過程碰到問題及解決辦法
錯誤原因:對函數調用的一些基礎知識遺忘。
改正方法:查看課本,找到正確的表達方式。
·題目6-2 拆分實數的整數與小數部分
1.設計思路:
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要求實現一個拆分實數的整數與小數部分的簡單函數。
第二步:由於輸入的實數是小數,要將其拆分出整數部分就需要進行強制轉換,再用該數減去整數部分,就是小數部分。
第三步:整數部分用指針變量*intpart表示,小數部分用*fracpart表示。
(2)流程圖:
2.實驗代碼:
#include <stdio.h> void splitfloat( float x, int *intpart, float *fracpart ); int main() { float x, fracpart; int intpart; scanf("%f", &x); splitfloat(x, &intpart, &fracpart); printf("The integer part is %d\n", intpart); printf("The fractional part is %g\n", fracpart); return 0; } void splitfloat(float x,int *intpart,float *fracpart) { *intpart=(int)x; *fracpart=x-*intpart; }
3.本題調試過程碰到問題及解決辦法
錯誤原因:將賦值變量的方向弄反了。
改正方法:看到提交時的錯誤提醒后修改。
·題目6-1 在數組中查找指定元素
1.設計思路
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要求實現一個在數組中查找指定元素的簡單函數。
第二步:在函數調用里,將實參的值傳遞給形參(a→list[])
第三步:通過if 循環語句依次查找元素,如果找到則輸出該元素及對應位次,若沒找到,則返回-1或輸出Not Found
(2)流程圖:
主函數:
調用函數 splitfloat:
2.實驗代碼:
#include <stdio.h> #define MAXN 10 int search( int list[], int n, int x ); int main() { int i, index, n, x; int a[MAXN]; scanf("%d", &n); for( i = 0; i < n; i++ ) scanf("%d", &a[i]); scanf("%d", &x); index = search( a, n, x ); if( index != -1 ) printf("index = %d\n", index); else printf("Not found\n"); return 0; } int search( int list[], int n, int x ) { int j,m=-1; for(j=0;j<n;j++) { if(x==list[j]) { m=j; break; } } return(m); }
3.本題調試過程碰到問題及解決辦法
錯誤:break的位置放錯了
錯誤原因:對break的運用不熟練,導致程序運行出現問題
改正方法:仔細看了課本關於break的運用方法,又詢問同學做了改正。
·題目6-2 找最大值及其下標
1.設計思路
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要求實現在一維整型數組中找出其中最大的數及其下標。
第二步:定義一個長度為10的數組,用j記錄最大值對應的下標(轉換成指針),a[j]就是最大值
第三步:將最大值與每個元素依次進行比較,輸出最大值及下標。
(2)流程圖:
2.實驗代碼;
#include<stdio.h> #define N 10 int fun(int *a,int *b,int n); int main() { int a[N],i,max,p=0; for(i=0;i<N;i++) scanf("%d",&a[i]); max=fun(a,&p,N); printf("max=%d,position=%d\n",max,p); return 0; } int fun(int *a,int *b,int n) { int m=a[0]; int j; for(j=0;j<n;j++) { if(m<a[j]) { m=a[j]; *b=j; } } return (m); }
3.本題調試過程碰到問題及解決辦法
錯誤原因:函數調用結束時應該返回return (m),卻寫成return 0.
改正方法:在函數里不應該是return 0,而應該是返回調用該函數的值。
題目6-1 最小數放前最大數放后
1.設計思路
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要求實現為一維數組輸入10個整數;將其中最小的數與第一個數對換,將最大的數與最后一個數對換;輸出數組元素。
第二步:先定義一個數組,對數組的各個元素賦值。定義最大值max和最小值min和兩個變量q,g,
第三步:將最大值和和數組最后一個元素交換,最小值和首元素交換,輸出數組的每一個元素。
(2)流程圖:
主函數:
調用函數input:
調用函數max_min:
調用函數output:
2.實驗代碼:
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,g=0; for(i=0;i<n;i++) { if(min>*(arr+i)) { min=*(arr+i); q=i; } if(max<*(arr+i)) { max=*(arr+i); g=i; } } temp=*(arr+0); *(arr+0)=*(arr+q); *(arr+q)=temp; temp=*(arr+n-1); *(arr+n-1)=*(arr+g); *(arr+g)=temp; } void output(int *arr,int n) { int i; for(i=0;i<n;i++) { printf("%3d",*(arr+i)); } }
3.本題調試過程碰到問題及解決辦法
錯誤原因:printf("%d",*(arr+i));輸出的格式不對。
改正方法:把%d改成%3d
題目6-2 指針選擇法排序
1.設計思路
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要求實現指針選擇法對10個數進行由大到小的排序。
第二步:定義一個指針變量p循環變量i和一個數組。將數組首元素的地址賦值給指針變量p
第三步:使用選擇排序法對數組進行從大到小的排序,輸出數組元素。
(2)流程圖:
主函數:
調用函數sort:
2.插入代碼:
void sort(int *x,int n) { int i,m,k,t; for(i=0;i<n-1;i++) { k=i; for(m=i+1;m<n;m++) { if(*(x+k)<*(x+m)) { k=m; } } if(k!=i) { t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; } } }
3.本題調試過程碰到問題及解決辦法
錯誤原因:判斷大小的方向弄反了
改正方法:應該是if(*(x+k)<*(x+m))
題目6-1 判斷回文字符串
1.設計思路
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要求編寫函數,判斷給定的一串字符是否為“回文”。
第二步:定義字符數組s[20],輸入字符串賦值給s
第三步:調用函數palindrome,判斷字符數組第i個元素和第count-i-1個元素是否相等,如果不相等返回false,相等返回true。
(2)流程圖:
主函數:
調用函數palindrome:
2.插入代碼:
bool palindrome( char *s ) { int i,m; int count=0; count=strlen(s); m=count/2; for(i=0;i<m;i++) { if((*(s+i))!=(*(s+count-i-1))) { return(false); } } if(i==m) { return(true); } }
3.本題調試過程碰到問題及解決辦法
錯誤原因:在if條件里沒有對字符數組長度減一
改正方法:改成if((*(s+i))!=(*(s+count-i-1)))
題目6-2 使用函數實現字符串部分復制
1.設計思路:
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要求編寫函數,將輸入字符串t中從第m個字符開始的全部字符復制到字符串s中。
第二步:定義兩個字符數組t[20],s[20],m,輸入一個數賦給m。
第三步:調用函數strmcpy,並通過for循環條件,輸出字符數組s
(2)流程圖:
主函數:
調用函數strmcpy:
2.插入代碼:
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'; }
3.本題調試過程碰到問題及解決辦法
錯誤原因:終止符 \0 應該用單引號‘’
改正方法;改成'\0'
學習總結和進度
學習總結:
這兩周學習了指針及其應用,包括它的含義,使用方式,還有數組指針和字符指針。我知道了在程序中 * 的用途,在定義指針變量和訪問指針變量時,意義是不同的。還有在引用數組元素的時候,指針變量和數組之間相互轉化。
但是對函數的掌握還是不熟練,對字符串與指針還是搞不清楚,尤其是最后一次的PTA,所以,還是要盡快熟練掌握。
代碼地址:
https://git.coding.net/Aspirer1/c1.git
點評同學:
孫銘婧:http://www.cnblogs.com/sun031915/p/8644175.html
張心悅:http://www.cnblogs.com/zxy980612/p/8641661.ht
吳曉明:http://www.cnblogs.com/gu-an-cheng-wxm/p/8597592.html
學習進度: