6-1 計算兩數的和與差(10 分)
本題要求實現一個計算輸入的兩數的和與差的簡單函數。
函數接口定義:
void sum_diff( float op1, float op2, float *psum, float *pdiff );
其中op1和op2是輸入的兩個實數,*psum和*pdiff是計算得出的和與差。
裁判測試程序樣例:
#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;
}
/* 你的代碼將被嵌在這里 */
輸入樣例:
4 6
輸出樣例:
The sum is 10.00 The diff is -2.00
1.本題PTA提交列表

2.設計思路(包括流程圖),主要描述題目算法
本題很簡單,只用寫函數的代碼,讓兩個數兩加或者想減的結果等於指針就可以了

最終需要加入的代碼是
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{ *psum=op1+op2;*pdiff=op1-op2;}
運行的結果是

6-5 利用指針找最大值(10 分)
本題要求實現一個簡單函數,找出兩個數中的最大值。
函數接口定義:
void findmax( int *px, int *py, int *pmax );
其中px和px是用戶傳入的兩個整數的指針。函數findmax應找出兩個指針所指向的整數中的最大值,存放在pmax指向的位置。
裁判測試程序樣例:
#include <stdio.h>
void findmax( int *px, int *py, int *pmax );
int main()
{
int max, x, y;
scanf("%d %d", &x, &y);
findmax( &x, &y, &max );
printf("%d\n", max);
return 0;
}
/* 你的代碼將被嵌在這里 */
輸入樣例:
3 5
輸出樣例:
5
1.本題PTA提交列表

2.設計思路(包括流程圖),主要描述題目算法
在函數中用if語句比較兩個數的大小給pamx指針

最后的子函數代碼為
void findmax( int *px, int *py, int *pmax )
{
if(px>py)
{
pmax=px;}
else
{
pmax=py; }
}
執行的結果如下

發現少了指針的那個符號沒有指向指針所指的值
修改后得到
void findmax( int *px, int *py, int *pmax )
{
if(*px>*py)
{
*pmax=*px;}
else
{
*pmax=*py; }
}
運行的結果如下

6-6 使用函數實現字符串部分復制(20 分)
本題要求編寫函數,將輸入字符串t中從第m個字符開始的全部字符復制到字符串s中。
函數接口定義:
void strmcpy( char *t, int m, char *s );
函數strmcpy將輸入字符串char *t中從第m個字符開始的全部字符復制到字符串char *s中。若m超過輸入字符串的長度,則結果字符串應為空串。
裁判測試程序樣例:
#include <stdio.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判實現,略去不表 */
int main()
{
char t[MAXN], s[MAXN];
int m;
scanf("%d\n", &m);
ReadString(t);
strmcpy( t, m, s );
printf("%s\n", s);
return 0;
}
/* 你的代碼將被嵌在這里 */
輸入樣例:
7
happy new year
輸出樣例:
new year
1.本題PTA提交列表

2.設計思路(包括流程圖),主要描述題目算法
先把t的字符串全部復制到s中去,然后確定s的長度
然后通過循環一個一個將后面的字符往前移動,直到移動到m個字符處。

最終代碼如下
void strmcpy( char *t, int m, char *s ){
int i,len;
strcpy(s, t);
len = strlen(s);
for(i=len-m-1;i>0;i--){
*(s+i-1)=*(s+i);
}
*(s+len-m+1)='\0';
}
發現想要通過一重循環不好實現
所以不正確

修改后的代碼是
void strmcpy( char *t, int m, char *s ){
int i,j,len;
strcpy(s, t);
len = strlen(s);
for(i=m-1;i>0;i--){
for(j=i;j<len;j++){
*(s+j-1)=*(s+j);
}
}
*(s+len-m+1)='\0';
}

