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
The diff is %.2f
", 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
", intpart);
    printf("The fractional part is %g
", 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
", index);
    else
        printf("Not found
");

    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
",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("
");
 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
");
    else
        printf("No
");
    printf("%s
", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

thisistrueurtsisiht

输出样例1:

Yes
thisistrueurtsisiht

输入样例2:

thisisnottrue

输出样例2:

No
thisisnottrue

1.设计思路:

(1).题目算法描述
第一步:定义一个新的指针,并初始化
第二步:定义int型变量i j k
第三步:遍历原始指针使之指向最后一位(注意避开'')
第四步:比较两个指针的内容
第五步:如果指针内容不同返回false,否则返回ture
(2).流程图
流程图

2.实验代码

bool palindrome(char *s)
{
    char *a = s;//新定义一个指针
    int i = 0, j = 0, k = 0;
    while (*a != '')//指针遍历到最后一位
    {
        a++;
        i++;
    }
    a--;                     //因为最后一为为''所以减一位
    while (*s != '')       //将两个指针进行比较
    {
        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 != '')//指针遍历到最后一位
    {
        a++;
    }
    a--;                     //因为最后一位为''所以减一位
    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
", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s
", 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)!='';i++,j++)
    {
        *(s+j)=*(t+i);
    }
}

2.错误调试
错误信息:部分正确
错误分析:s 的末尾元素没有归零
解决方法:在for循环结束后加上语句:*(s+j) = '';

答案正确

答案正确

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

原文地址:https://www.cnblogs.com/X-JY/p/8550457.html