C高級第一次PTA作業


作業要求一

附加題目

寫程序證明P++等價於(p)++還是等價於*(p++)?

1.設計思路:

(1).題目算法描述
第一步:定義變量p並賦初值
第二步:分三次計算每次分別輸出 p++,(p)++,*(p++)
(2).流程圖
這是初次嘗試的錯誤流程圖 錯誤原因:①流程圖不能是多個程序的,一個程序一個流程圖②另外流程圖也不會出現三個框並列執行的情況

修改后的流程圖
流程圖

2.實驗代碼

(1)

#include <stdio.h>
int main ()
{
    int p=1;
    
    //printf("%d",p++);
    //printf("%d",(p)++);
    //printf("%d",*(p++));
    
    return 0;
}

(2)

#include <stdio.h>
int main ()
{
    int a=1;
    int *p = &a;
    
    //printf("%d",p++);
    //printf("%d",(p)++);
    //printf("%d",*(p++));
    
    return 0;
}

結論:

當p為int類型時p++與(p)++運算結果相同但是(p++)計算報錯,錯誤信息如下

錯誤原因:
無效 ,沒有定義指針變量 間接訪問運算符無法正常使用
當p為指針類型時,可以確定p++與(p)++結果相同

說明:

第一部分:

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.設計思路:

(1).題目算法描述
根據題目中已經給出的代碼部分可以看出,題目是想利用指針變量寫一個計算和差的函數
第一步:構建函數框架
第二步:利用間接訪問運算符操作計算變量的和與差
(2).流程圖
流程圖

2.實驗代碼

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
    *psum = op1 +op2;
    *pdiff = op1-op2;
}

答案正確

答案正確

6-2 拆分實數的整數與小數部分(15 分)

本題要求實現一個拆分實數的整數與小數部分的簡單函數。

函數接口定義:

void splitfloat( float x, int *intpart, float *fracpart );

其中x是被拆分的實數(0≤x<10000),*intpart和*fracpart分別是將實數x拆分出來的整數部分與小數部分。

裁判測試程序樣例:

#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;
}

/* 你的代碼將被嵌在這里 */

輸入樣例:

2.718

輸出樣例:

The integer part is 2
The fractional part is 0.718

1.設計思路:

(1).題目算法描述

第一步:利用強制類型轉換將x強制轉換成int類型得到x的整數部分,用間接訪問運算符將值賦給integer
第二步:用x-integer便可得到x的小數部分,用間接訪問運算符將值賦給fractional即可
(2).流程圖
流程圖

2.實驗代碼

void splitfloat( float x, int *intpart, float *fracpart )
{
    *intpart = (int)x;
    *fracpart = x - *intpart;
}

答案正確

答案正確

第二部分

6-1 在數組中查找指定元素(15 分)

本題要求實現一個在數組中查找指定元素的簡單函數。

函數接口定義:

int search( int list[], int n, int x );

其中list[]是用戶傳入的數組;n(≥0)是list[]中元素的個數;x是待查找的元素。如果找到

則函數search返回相應元素的最小下標(下標從0開始),否則返回−1。
裁判測試程序樣例:

#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;
}

/* 你的代碼將被嵌在這里 */

輸入樣例1:

5
1 2 2 5 4
2

輸出樣例1:

index = 1

輸入樣例2:

5
1 2 2 5 4
0

輸出樣例2:

Not found

1.設計思路:

(1).題目算法描述
第一步:遍歷數組尋找給定的元素
第二步:如果找到給定的元素將下標返回
第三步:如果沒有找到元素則返回-1
(2).流程圖
流程圖

2.實驗代碼

int search( int list[], int n, int x )
{
    int i;
    for(i = 0;i < n;i++)
    {
        if(list[i]==x){
            return i;
        }
    }
    return -1;
}

答案正確

答案正確

6-2 找最大值及其下標(10 分)

在一維整型數組中找出其中最大的數及其下標。

函數接口定義:

int fun(int *a,int *b,int n);

其中形參abn都是用戶傳入的參數。函數fun的功能是在指針a所指向的一維數組中找出其中最大的數及其下標,下標存到指針b所指的變量里,函數返回最大值。
裁判測試程序樣例:

#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;
}


/* 請在這里填寫答案 */

輸入樣例:

2 1 5 4 8 4 5 8 9 1

輸出樣例:

max=9,position=8

1.設計思路:

(1).題目算法描述
第一步:定義變量i max,並將數組中第一個元素的值賦給max
第二步:遍歷數組將數組中的每個元素與第一個元素進行比較
第三步:如果有比max大的,則將該元素的值賦給max
第四步:比max大的值的下標賦給*b
第五步:返回max
(2).流程圖
流程圖

2.實驗代碼

int fun(int *a,int *b,int n)//*a=a *b=&p下標 n=N;
{
    int i = 0,max = *(a+1);
    for(i = 1;i < n;i++)
    {
        if(*(a+i)>max){
            max = *(a+i);
            *b = i;
        }
    }
    return max;
}

答案正確

答案正確

第三部分:

6-1 最小數放前最大數放后(10 分)

為一維數組輸入10個整數;將其中最小的數與第一個數對換,將最大的數與最后一個數對換;輸出數組元素。。

函數接口定義:

void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);

三個函數中的 arrn都是用戶傳入的參數。n 是元素個數。

input函數的功能是輸入 n個元素存到指針arr所指向的一維數組中。

max_min函數的功能是求指針arr所指向的一維數組中的最大值和最小值,其中最小的數與第一個數對換,將最大的數與最后一個數對換。

output函數的功能是在一行中輸出數組元素,每個元素輸出占3列。
裁判測試程序樣例:

#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ int a[10];
input(a,10);
 max_min(a,10);
 output(a,10);
 return 0;
}

/* 請在這里填寫答案 */

輸入樣例:

5 1 4 8 2 3 9 5 12 7

輸出樣例:

1 5 4 8 2 3 9 5 7 12

1.設計思路:

(1).題目算法描述
①第一個函數
第一步:定義i
第二步:遍歷數組將數組讀入元素
②第二個函數
第一步:定義i,最大值最小值及其下標
第二步:遍歷數組找最值
第三步:最值與首位值進行交換
③第三個函數
第一步:定義i
第二步:遍歷數組輸出元素
(2).流程圖
流程圖

2.實驗代碼

void input(int *arr,int n)
{
    int i = 0;
    for(i = 0;i < n;i++)
    {
        scanf("%d",arr+i);
    }
}
void max_min(int *arr,int n)
{
    int i = 0, max = *arr, min = *arr, t = 0, indexmax = 0,indexmin = 0;//indexmax和indexmin分別是最大值和最小值的下標
    //遍歷數組找最值
    for(i = 0;i < n;i++)
    {
        if(*(arr+i)>max){
            max = *(arr+i);
            indexmax = i;
        }
        if(*(arr+i)<min){
            min = *(arr+i);
            indexmin = i;
        }
    }
    //最值與首尾進行交換
    t = *(arr+n-1);
    *(arr+n-1)=max;
    *(arr+indexmax) = t;
    t = *arr;
    *arr=min;
    *(arr+indexmin) = t;
}
void output(int *arr,int n)
{
    int i;
    for(i = 0;i < n;i++)
    {
        printf(" %d ",*(arr+i));
    }
}

3.錯誤信息

(1)第一次提交,錯誤提示為格式錯誤

糾錯:

修改了第三個函數的輸出縮進
printf(" %d",*(arr+i));
(2)第二次提交,仍然為格式錯誤

糾錯:重新審題, 在一行中輸出數組元素,每個元素輸出占3列。

        錯因每個輸出的元素都帶了兩個空格,無論元素本身占幾列都會帶兩列空格

再次修改輸出縮進printf("%3d",*(arr+i));
(3)修改后的代碼依然存在Bug當最大值在元素的首位時輸出會混亂

糾錯:使用兩個for循環分兩次遍歷數組分別找出最大值最小值,以下是修改后的代碼

void input(int *arr,int n)
{
    int i = 0;
    for(i = 0;i < n;i++)
    {
        scanf("%d",arr+i);
    }
}
void max_min(int *arr,int n)
{
    int i = 0, max = *arr, min = *arr, t = 0, indexmax = 0,indexmin = 0;//indexmax和indexmin分別是最大值和最小值的下標
    //遍歷數組找最大值
    for(i = 0;i < n;i++)
    {
        if(*(arr+i)>max){
            max = *(arr+i);
            indexmax = i;
        }
        
    }
    //最大值與最后一個元素交換
    t = *(arr+n-1);
    *(arr+n-1)=max;
    *(arr+indexmax) = t;
    //遍歷數組找最小值
    for(i = 0;i < n;i++)
    {
        if(*(arr+i)<min){
            min = *(arr+i);
            indexmin = i;
        }
    }
    //最小值與第一個元素交換
    t = *arr;
    *arr=min;
    *(arr+indexmin) = t;
}
void output(int *arr,int n)
{
    int i;
    for(i = 0;i < n;i++)
    {
        printf(" %d ",*(arr+i));
    }
}

答案正確

答案正確

6-2 指針選擇法排序(10 分)

指針選擇法對10個數進行由大到小的排序。

函數接口定義:

void sort(int *x,int n);

函數sort中 x n都是用戶傳入的參數。函數將指針x所指數組中的n個元素按選擇法降序排序。

裁判測試程序樣例:

#include<stdio.h>
void sort(int *x,int n);
int main ( )
{int *p,i,a[10];
 p=a;
 for (i=0;i<10;i++)  scanf("%d",p++);
 p=a;
 sort(a,10);
 for(i=0;i<10;i++)  printf("%4d",*p++);
 printf("\n");
 return 0;
 }

/* 請在這里填寫答案 */

輸入樣例:

2 5 1 4 6 9 8 2 0 10

輸出樣例:

10 9 8 6 5 4 2 2 1 0

1.設計思路:

(1).題目算法描述
第一步:定義變量i、j、tmp、max
第二步:遍歷數組找出最大的元素
第三步:將此元素放在數組的最前面
第四步:重復二、三步直到完成排序
(2).流程圖
流程圖

2.實驗代碼

 void sort(int *x,int n)
 {
     int i = 0, j = 0, tmp = 0, max = 0;
     for(i = 0;i < n-1;i++)
     {
         max = i;
         for(j = i;j < n;j++)
         {
             if(*(x+max)<*(x+j)){
                max = j;
             }
         }
         if(max != i){
                        tmp = *(x+max);
                        *(x+max) = *(x+i);
                        *(x+i) = tmp;
         }
     }
 }


答案正確

答案正確

6-1 判斷回文字符串(20 分)

本題要求編寫函數,判斷給定的一串字符是否為“回文”。所謂“回文”是指順讀和倒讀都一樣的字符串。如“XYZYX”和“xyzzyx”都是回文。

函數接口定義:

bool palindrome( char *s );

函數palindrome判斷輸入字符串char *s是否為回文。若是則返回true,否則返回false

裁判測試程序樣例:

#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
    char s[MAXN];

    scanf("%s", s);
    if ( palindrome(s)==true )
        printf("Yes\n");
    else
        printf("No\n");
    printf("%s\n", s);

    return 0;
}

/* 你的代碼將被嵌在這里 */

輸入樣例1:

thisistrueurtsisiht

輸出樣例1:

Yes
thisistrueurtsisiht

輸入樣例2:

thisisnottrue

輸出樣例2:

No
thisisnottrue

1.設計思路:

(1).題目算法描述
第一步:定義一個新的指針,並初始化
第二步:定義int型變量i j k
第三步:遍歷原始指針使之指向最后一位(注意避開'\0')
第四步:比較兩個指針的內容
第五步:如果指針內容不同返回false,否則返回ture
(2).流程圖
流程圖

2.實驗代碼

bool palindrome(char *s)
{
    char *a = s;//新定義一個指針
    int i = 0, j = 0, k = 0;
    while (*a != '\0')//指針遍歷到最后一位
    {
        a++;
        i++;
    }
    a--;                     //因為最后一為為'\0'所以減一位
    while (*s != '\0')       //將兩個指針進行比較
    {
        if (*s == *a)
        {

            k++;
        }
        else
        {
            return false;
        }
        s++;
        a--;
    }
    if (k == i)           //如果每個都相等k=i返回true
    {
        return true;
    }
}

答案正確

答案正確

反思:k,i的作用如何,不使用k,i如何?

設計時因為沒用使用非判斷if后語句可寫,用i和k來判斷是否遍歷完成,現在看來時內存空間的浪費
簡單的代碼實現方式如下:

bool palindrome(char *s)
{
    char *a = s;//新定義一個指針
    while (*a != '\0')//指針遍歷到最后一位
    {
        a++;
    }
    a--;                     //因為最后一位為'\0'所以減一位
    while (s<a)       //將兩個指針進行比較
    {
        if (*s != *a)
        {

          return false;
        }
        s++;
        a--;
    }
    
        return true;
}

6-2 使用函數實現字符串部分復制(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.設計思路:

(1).題目算法描述
第一步:定義i,j用於操作指針
第二步:從m-1開始遍歷t,並將值賦給s

(2).流程圖
流程圖

2.實驗代碼

void strmcpy( char *t, int m, char *s )
{
    int i,j;
    for(i=m-1,j=0;*(t+i)!='\0';i++,j++)
    {
        *(s+j)=*(t+i);
    }
}

2.錯誤調試
錯誤信息:部分正確
錯誤分析:s 的末尾元素沒有歸零
解決方法:在for循環結束后加上語句:*(s+j) = '\0';

答案正確

答案正確

要求三內容地址:http://www.cnblogs.com/X-JY/p/8619229.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM