第一次作业

PTA第一次作业作业

第一题:
计算两个数的和与差:
1.设计思路
(1)算法
第一步:阅读一遍主函数和函数的声明。
第二步:分析,在主函数中先定义四个浮点型的标识符a,b,sum,diff,对a,b分别赋值,函数调用,a的值传递给op1,b的值传递给op2,sum的地址传递给指针变量psum,diff的地址传递给指针变量pdiff;最后输出两个数的和与差。
第三步:两个数的和sum等于a+b,两个数的差diff等于a-b;所以在函数调用时,在调用函数sum_diff中两个数的和*psum等于op1+op2,两个数的差*diff等于op1-op2;

(2)流程图:

 

2.实验代码:

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

3.本题调试过程碰到问题及解决的办法:

错误信息1:函数定义的格式错误

  错误原因:在函数定义时在括号后加一个";"

  改正方法:删除";";

第二题:

拆分实数的整数与小数部分:

1.设计思路

(1)算法:

第一步:阅读一遍主函数和函数的声明。

第二步:分析,在主函数中,先定义两个浮点数x,fracpart,和整型数inpart;读入一个浮点数赋值给x;调用函数splitfloat;将主函数中的x的值传递给被调函数中的形参x,将intpart和fracpart的地址传递给被调函数中的形参指针变量inpart和fracpart;最后输出是熟的整数和小数部分。

第三步:在被调函数中, x的整数部分就是对x进行取整,所以强制将x转化为整型舍去小数部分;x的小数部分就是x减去整数部分。

(2)流程图:

 

2.实验代码:

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

3.本题调试过程碰到问题及解决的办法:

错误信息1:程序不能通过

  错误原因:强制转化的格式错误,错误:int(x);

  改正方法:int放在括号内,加上强制转化的数,正确格式:(int)x;

 

第二次PTA作业

 

6-1 在数组中查找指定元素

本题要求实现一个在数组中查找指定元素的简单函数。

1.设计思路

(1)算法:

第一步:定义一个数组名为a的数组,循环变量i,需要查找的数x,和数组元素的个数n。

第二步:读入n和需要查询的数x,并对数组各元素进行赋值。

第三步:调用函数,在函数中进行查找。

第四步:输出所查找数的在数组中的位置。

(2)流程图:

 

 

2.实验代码:

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

3.本题调试过程碰到问题及解决办法:

错误信息;当查找的数在数组中多次出现是结果出去

改正方法:当第一次查找到的时候跳出这个循环,在语句后面加一个break;

6-2 找最大值及其下标

在一维整型数组中找出其中最大的数及其下标。

1.设计思路

(1)算法:

第一步:定义一个数组名为a的数组、循环变量i、最大值max、和数组中最大数的下标p。

第二步:对数组进行赋值。

第三步:调用函数。在函数中找到最大值及其对应的下标。

第四步:输出数组元素的最大值及其下标。

(2)流程图:

 

 

2.实验代码:

    int fun(int *a,int *b,int n){
        int q=a[0];
        int j;
        for(j=0;j<n;j++){
            if(q<a[j]){
                q=a[j];
                *b=j;
            }
        }
        return(q);
    }

3.本题调试过程碰到问题及解决办法:

 C高级PTA作业(3)

6-1 最小数放前最大数放后

1.设计思路:

(1)算法:

第一步:先定义一个数组。

第二步:对数组的各个元素赋值。

第三步:定义最大值max和最小值min和两个变量q,w,max和min为数组首元素的值,q和w都为0,遍历数组查找出最大值和最小值以及对应的下标。

第四步:将最大值和和数组最后一个元素交换,最小值和首元素交换。

第五步:遍历数组输出数组的每一个元素。

流程图:

 

 

 

 

2.实验代码:

void input(int *arr,int n){
        int i;
        for(i=0;i<n;i++){
            scanf("%d",arr+i);
        }
    } 
    void max_min(int *arr,int n){
        int min=arr[0],max=arr[0];
        int i,temp;
        int q=0,w=0;
        for(i=0;i<n;i++){
            if(min>*(arr+i)){
                min=*(arr+i);
                q=i;
            } 
        }
        temp=*(arr+0);*(arr+0)=*(arr+q);*(arr+q)=temp;
        for(i=0;i<n;i++){
               if(max<*(arr+i)){
                max=*(arr+i);
                w=i;
            }
       }
       temp=*(arr+n-1);*(arr+n-1)=*(arr+w);*(arr+w)=temp;
    }
    void output(int *arr,int n){
        int i;
        for(i=0;i<n;i++){
            printf("%3d",*(arr+i));
        }
    }

 

3.本题调试过程碰到问题及解决办法:

错误信息1:在DEV-C++中结果是一串奇怪的数字。

错误原因:输出的格式错误我的代码是printf("%.3d",*(arr+i));

改正方法:格式改成%3d。

6-2 指针选择法排序

1.设计思路:

(1)算法:

第一步:定义一个指针变量p循环变量i和一个数组。将数组首元素的地址赋值给指针变量p。

第二步:读数组的各个元素赋值。

第三步:使用选择排序法对数组进行从大到小的排序。

第四步:遍历数组输出数组的各个元素。

(2)流程图:

 

 

2.实验代码:

 

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

 

3.本题调试过程碰到问题及解决办法:

错误信息1: 结果错误,没有按照从大到小的顺序排列。

错误原因:不明白选择排序法,在选择排序法中第二次for循环中的循环变量的起始值错误。

改正方法:将第二次for循环的起始值改成i+1。

 

第四次PTA作业:

6-1 判断回文字符串

1.设计思路:

()算法:

第一步:定义字符数组s[20],输入字符串赋值给s;

第二步:调用函数palindrome,

第三步:在函数palindrome中,定义循环变量i=0,变量count为字符数组的长度,q,q=count/2;判断字符数组第i个元素和第count-i-1个元素是否相等,如果不相等返回false,相等的话返回true。

第四步:如果返回值是true就输出Yes,否则的话就输出No。

(2).流程图

 

 

 

2.实验代码:

    bool palindrome( char *s ){
        int i,count=0,q;
        count=strlen(s);
        q=count/2;
        for(i=0;i<q;i++){
            if((*(s+i))!=(*(s+count-i-1))){
                return(false);
            }
        }
        if(i==q){
            return(true);
        }
    }

3.本题调试过程碰到问题及解决办法

错误信息1.结果错误

错误原因:在函数中for循环中的判断条件错误,错误为i<=p;

改正方法:将i<=p改为i<p.

 

6-2 使用函数实现字符串部分复制

1.设计思路:

(1)算法:

第一步:定义两个字符数组t[20],s[20],m,并且输入一个数赋给m。

第二步:调用strmcpy函数将字符数组t从m个元素开始全部的元素复制到字符数组s。

第三步:在strmcpy函数中,定义一个循环变量i,初值为m,使用for循环判断条件为*(t+i-1)!='\0',如果满足的话就执行*(s+i-m)=*(t+i-1);i++。如果不满足的话就说明m>字符数组的实际长度,就不执行for循环,在最后执行*(s+i-m)='\0';

第四步:输出字符数组s。

(2)流程图:

 

2.实验代码:

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

3.本题调试过程碰到问题及解决办法:

错误信息1:部分正确,

错误原因:for循环中的循环条件错误,错误为*(t+i)!='\0'

改正方法:将*(t+i)!='\0'改为*(t+i-1)!='\0'

谁评论我的作业:

陈天胤,袁中,姜健,王文博,李新华,辛静瑶

 我评论谁的作业:

李新华:http://www.cnblogs.com/Lixinhua18/p/8569649.html

王文博:http://www.cnblogs.com/wwb986187/p/8635502.html

梁圣然:http://www.cnblogs.com/messi6/p/8626565.html

林昊:http://www.cnblogs.com/lh991014/p/8638313.html

学习总结和进度:

1.进度表:

 

 

 

 

 

 

2.两周来所有PTA作业中每个题目所使用的知识点。

第一次PTA作业:

在函数调用时是单向值传递,取浮点型数字的整数部分方法是将数字强制转化为整型,

第二次PTA作业:

输出整数占m列的格式是%md,

第三次PTA作业:

选择排序法外层循环条件小于是数组元素个数-1,内层循环起始条件是外层循环变量的值+1,循环条件是小于数组元素的个数,找到最大值或最小值的下标与第一个元素交换,

第四次PTA作业:

strlen函数是计算字符数组的实际长度,回文序列判断条件相等字符对应的下标和是数组元素个数-1,

3.我的收获:

%u是输出无符号数所用的格式符,逗号表达式的求解过程:先求表达式1.再求表达式2,逗号表达式的值是表达式是2的值,逗号运算符优先级时最低的,%md是输出的整数占三列

数据结构包括逻辑结构和物理结构,数据元素的存储结构形式包括顺序存储和链式存储,

&:取地址运算符,*:指针运算符或间接访问运算符

int *p=a将数组首元素的地址赋给指针变量p,

*p++先算*p再算++,*(p+i)=a[i];输出字符串时用%s,

对字符数组只能对各个元素赋值,数组在定义时可以整体赋初值,但是不能在赋值语句中整体赋值。数组名代表的是地址,但是是一个常量,它的值是不能改变的,

posted @ 2018-03-13 21:04  _晨曦  阅读(401)  评论(26编辑  收藏  举报