1. 程式人生 > >PTA指針實驗

PTA指針實驗

測試程序 pan class out lan printf turn strlen ret

6-1 計算兩數的和與差(10 分)

本題要求實現一個計算輸入的兩數的和與差的簡單函數。

函數接口定義:

void sum_diff( float op1, float op2, float *psum, float *pdiff );

其中op1op2是輸入的兩個實數,*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 );

其中pxpx是用戶傳入的兩個整數的指針。函數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指針實驗