zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JQuery 判断某个属性是否存在 hasAttr
    微信支付开发-Senparc.Weixin.MP详解
    c# 两个数组比较,将重复部分去掉,返回不重复部分
    String.Format数字格式化输出 {0:N2} {0:D2} {0:C2
    asp.net 时间比较,常用于在某段时间进行操作
    关于C#正则表达式MatchCollection类的总结,正则表达式的应用
    开发错误11:Configuration with name ‘default’ not found
    Android新旧版本Notification
    Okio 1.9简单入门
    Android  PNG透明图片转JPG格式背景变黑
  • 原文地址:https://www.cnblogs.com/X-JY/p/8550457.html
Copyright © 2011-2022 走看看