PTA指針實驗
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‘;
}
PTA指針實驗