• 2018上第一次作业


    要求一:完成PTA作业

    答:作业已经完成!

    要求二:pta作业编程题目的解题思路和调试过程记录

    C高级语言第一次作业(1)

    完成情况如图:

    题目一:计算两个数的和与差

    1.设计思路

    (1)算法:
    第一步:看主函数部分。通过主函数可得输入两个浮点型变量a,b,然后经过函数(sum_diff(a, b, &sum, &diff))调试之后,输出两个数的和(sum)与差(diff);
    第二步:看函数变量。根据题目流程可看出是把a赋值给op1,b赋值到op2,&sum赋值到psum,&diff赋值到pdiff(注意:函数里的psum,pdiff为指针变量);
    第三步:写函数部分的代码。根据题目要求,两个数的和为psum=op1+op2,两个数的差为pdiff=op1-op2。
    提示:float psum,floatpdiff是定义和与差的指针变量,单写psum,pdiff是指和与差的值。
    (2)流程图:
    主函数:

    调用函数:

    2.实验代码:

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

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

    本题在调试过程中未遇到错误。

    题目二:拆分实数的整数与小数部分

    1.设计思路

    (1)算法:
    第一步:看主函数部分。定义x, fracpart为浮点型变量,intpart为整型变量(题目中fracpart是小数部分,intpart是整数部分),然后输入x(x为一个实数),经过函数(splitfloat(x, &intpart, &fracpart))调试之后,输出整数部分和小数部分的值;
    第二步:看函数变量。根据题目流程可看出是x赋值给x,&intpart赋值给intpart, &fracpart赋值给fracpart(注意:函数里的intpart,fracpart为指针变量);
    第三步:写函数部分的代码。根据题目要求,把一个实数强制转化为int型得到整数部分,然后用实数减去整数部分即得到了小数部分。
    (2)流程图:
    主函数:

    调用函数:

    2.实验代码:

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

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

    本题在调试过程中未遇到错误。

    C高级语言第一次作业(2)

    完成情况如图:

    题目一:在数组中查找指定元素

    1.设计思路

    (1)算法:
    第一步:看主函数部分。通过主函数可得定义 i, index, n, x,a[10]为整型(题目定义了MAXN为10),然后输入n(n是list[]中元素的个数),for循环输入数组,再输入x(x是待查找的元素),通过函数得出index的值,若index不为-1,则输出index
    的值,否则输出Not found;
    第二步:看函数变量。把a赋值给list[],n、x赋值给n、x;
    第三步:写函数部分的代码。在函数中定义a为整型变量,根据题目要求,需知使得若x等于list[a],则返回a的值,若没有,则使index为-1。
    (2)流程图:
    主函数:

    调用函数:

    2.实验代码:

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

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

    本题问题

    解决办法:发现我设的是a,不是i,结果误把a写为了i,改正即可。这提示我在写题时不要马虎!

    题目二:找最大值及其下标

    1.设计思路:

    (1)算法:
    第一步:看主函数部分。通过主函数可得定义 a[10],i,max,p为整型变量,p=10,然后输入a[0]~a[9]的值,经过函数(fun(a,&p,N))调用,得到最大值max及下标p的值;
    第二步:看函数变量。fun(a,&p,N)中的变量赋值给int fun(int a,int b,int n)中的变量;
    第三步:写函数部分的代码。求最大值及其下标的方法就是先令a[0]是最大值,然后循环数组里的数字,与max比较大小,如果比max大,则把这个数赋给max,再把其相应下表写出即可。
    提示:在本题中,函数里的a为数组的第一个值的地址,则
    a为数组a[0]的值,
    (a+i)则为a[i]的值。另外,该代码中不要忘记return max,把max的值返回到主函数中。为什么不用返回下标的值呢?因为最开始是把下标的地址赋给b,b则为b的值(b的地址里存的数),在要求写的代码中,把i的值赋值给b,即b地址里存的数为i,因此不用返回i的值。
    (2)流程图:
    主函数:

    调用函数:

    2.实验代码:

    int fun(int *a,int *b,int n)
    {
      int i,max=*a;
      for(i=0;i<n;i++){
        if(*(a+i)>max){
          max=*(a+i);
          *b=i;
        }
        }
        return max;
      }
    

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

    本题问题:

    没写返回值return max;
    解决办法:补上即可。

    C高级语言第一次作业(3)

    完成情况如图:

    题目一:最小数放前最大数放后

    1.设计思路

    (1)算法:
    本题里有三个函数。从简单的开始。
    第一步:第一个函数的作用就是输入一个10个数字的数组,第三个函数是输出这个数组。这两个函数都是用for循环输入输出。
    第二步:我觉得第二个函数是本题考察的重点。我把这个函数要做的事情分为两个部分。
    第一是找最最值,第二是移动最值。其中找最值我设了两个数max,min,把这两个数等于a[0],再和数组中的数进行比较。把比max大的数赋值给max,比min小的数赋值给min。
    第二是移动。
    (2)流程图:
    主函数:

    调用函数:
    ①input(int *arr,int n)函数

    ②max_min(int *arr,int n)函数

    ③output(int *arr,int n)函数

    2.实验代码:

    void input(int *arr,int n)
    {
    int i;
    for(i=0;i<=9;i++){
      scanf("%d",&arr[i]);
    }
    }
    void max_min(int *arr,int n)
    {
      int max,min,i,t,c,d;
      max=arr[0];
      min=arr[0];
      for(i=0;i<=9;i++){
        if(arr[i]>=max){
          max=arr[i];
          c=i;
        }
      }
        t=arr[c];
        arr[c]=arr[9];
        arr[9]=t;
      for(i=0;i<=9;i++){
        if(arr[i]<=min){
          min=arr[i];
          d=i;
        }
      }
        t=arr[d];
        arr[d]=arr[0];
        arr[0]=t;
    }
    void output(int *arr,int n)
    {
    	int i;
      for(i=0;i<=9;i++){
      printf("%3d",arr[i]);
      }
    }
    

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

    本题问题:
    在做这道题的时候,交换数字时没把i赋值给其它变量,而是直接用max,min和首末位置互换,从而使得数组中出现两个一样的最值情况(原本没有)
    解决办法:
    找到问题,把i赋值给c,d,更正完毕,正确。

    题目二:指针选择法排序

    1.设计思路

    (1)算法:
    本题的算法就是选择排序法。选择排序法就是选择出最大或最小放第一个位置,次大或次小放第二个位置,其它同理。而具体做法就是让第一个数与后面的比较,找到比第一个位置的数大或小(看升序还是降序)的时候,从那个大的或小的数的位置继续与其他的比较,直到找出最大或最小,再和第一个数交换位置,之后就从第二个人数继续下去,直到排序成功。
    第一步:设 i,j,t,temp为int型变量;
    第二步:写for循环,第一个循环是趟数,第二个是比较。如果(x+t)<(x+j)成立,则把i赋值给t;
    第三步:找到最值后交换。
    (2)流程图:
    主函数:

    调用函数:

    2.实验代码:

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

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

    本题问题:
    本题问题在于不会选择排序法,没有头绪,然后上网查了选择排序法,也懂了是怎样一回事,心得在算法上。
    解决办法:
    上网百度,写下心得。

    C高级PTA第一次作业(4)

    完成情况如图:

    题目一:判断回文字符串

    1.设计思路

    (1)算法:
    本题是看是否为回文。回文是abba或者abcba的格式。方法是先求出一个字符串有多少个字符(strlen()就是查多少字符用的,但不包括)然后数组中首尾相比(用for循环写出数组)如果不相等,则不是回文,如果相等,继续比较第二个和倒数第二个,以此类推,如果从头往后的数组的位数大于从后往前的数组的位数,那么跳出循环。如果最后真的从头往后的数组的位数大于从后往前的数组的位数,那么是回文。
    第一步:定义i,j,n为整形变量;
    第二步:求出数组s中的字符个数记为n;
    第三步:j=n-1,j为数组下标;
    第四步:写出for循环,在for循环里比较s[i]与s[j],如果不相等,则跳出循环。相等就继续下去,直到循环结束;
    第五步:循环结束后,判断i和j的大小,若i>j,则是回文,否则不是回文。
    (2)流程图:
    主函数:

    调用函数:

    2.实验代码:

    bool palindrome( char *s )
    {
      int i,j,n;
      n=strlen(s);
      j=n-1;
      for(i=0;i<j;i++,j--)
      { 
        if(s[i]!=s[j]){
          break;
          } 
          } 
        if(i>=j){
          return true;
        }
    }
    

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

    本题问题:

    解决办法:
    经检查发现if语句内容括多了,应该只有判断s[i]与s[j]的关系,若不相等就跳出循环这一点,改正后答案正确。

    题目二:使用函数实现字符串部分复制

    1.设计思路

    (1)算法:
    第一步:先测出被复制的数组的长度,然后把整个数组复制到新的数组上;
    第二步:用for循环,第一个for循环是说明从那个字符开始,内部嵌套的for循环是从这个字符开始直到结束的字符整体前移(前移是(s+j-1)=(s+j)做到的);
    第三步: *(s+k-m+1)='',在得到的新数组后加''。
    (2)流程图:
    主函数:

    调用函数:

    2.实验代码:

    void strmcpy( char *t, int m, char *s )
    {
      int i,j,k;
      k=strlen(t);
        strcpy(s,t);
         for(i=m-1;i>0;i--){  
            for(j=i;j<k;j++){  
                *(s+j-1)=*(s+j);  
            }  
        }  
          *(s+k-m+1)=''; 
    }
    

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

    本题问题:
    本题一点头绪都没有。
    解决办法:
    上网查找了答案,认真分析后,自己又在电脑上敲出来的。

    附加题:

    题目:为了防止信息被别人轻易盗取,需要把电码明文通过加密方式变换成为密文。变换规则如下:小写字母y变换为a,小写字母z变换为b,其他字母变换成为该字母ASCII码顺序后2个字母,比如o变换成q。要求给出你的姓名全拼加密后的结果。

    我的姓名全拼加密后的结果:

    1.设计思路

    (1)算法:
    第一步:定义一个字符为c,用while循环输入字符;
    第二步:根据题目要求,如果是字母则加2;
    第三步: 如果加2以后不再是字母或者字母要循环回来,此时就-26即可。
    (2)流程图:

    2.实验代码:

    #include <stdio.h>
    int main()
    {
    	char c;
    	while((c=getchar())!='
    ')
    	{
    		if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
    		{
    			c=c+2;
    	if(c>'Z'&&c<='Z'+2||c>'z')
    		c=c-26;
    		}
    		printf("%c",c);	
    	}
    	printf("
    ");
     return 0;
     } 
    

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

    本题问题:
    如图:

    解决办法:
    后来发现是'z'+2写成了'z+2',改正即可。

    要求三:学习总结和进度

    1、总结两周来所有PTA作业中每个题目所使用的知识点。(我学到了什么,未学会什么?)

    分享:几种表达方式的区别:



    这两周主要学了指针,指针与数组,指针与字符数组,在PTA作业习题中均有体现。这些知识点在课本上都有,我主要说一下习题的知识点。
    在作业一中,我一遍过,觉得很简单。这里需要注意的是怎样把一个浮点数强制转化为整数型。就是类似于(int)x这样(若x是浮点型)。
    在作业二中,第一个是看是否有list[a]等于x,第二个要注意找到最大值的方法。即先设最大值等于a[0],然后与数组中其他数比较大小,如果有比其大的,就把那个数赋值给所设的最大值,直到得到真的最大值。
    在作业三中,第一题找最值的方法与作业二一样,主要是交换数组中的数的时候,要记得把循环里的那个i(i为数组的下标)赋值给一个新设的变量,要不然在做题的时候,i值是会随着i++增大的;第二题就是选择排序法,选择排序法是什么,怎么做详见算法。
    在作业四中,我通过网上查找,新学了一个函数。就是strlen(),这个函数的作用就是数出一个字符串中有几个字符,还有strcpy(s,t)是把t的字符串复制到s中,这个不能弄颠倒。
    至于指针问题,就是在定义一个指针的时候是带星号的,以后单写字母就是指针,加星号的是指针所指向的地址所存储的值,还有就是数组a[]的a表示数组第一个元素的地址,a[i]还可以写成*(a+i),另外要注意的是a=a+1是错误的,要想这样写,可以把a赋值给一个新的指针p,再p=p+1。
    另外其实我有很多不会的,具体也说不出来个一二三,每次都是通过做题来补充自己。

    2、将PTA作业的源代码使用git提交到托管平台上。

    (1)提交证明:






    (2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git

    3、点评3个同学的本周作业

    1、董雅洁:http://www.cnblogs.com/exo123/p/8575595.html
    2、丰大为:http://www.cnblogs.com/DavidPark/p/8551402.html
    3、徐铭博:http://www.cnblogs.com/xmb1547828350/p/8597402.html

    4、学习进度表


    IT小白
  • 相关阅读:
    第二章例2-9
    第二章例2-8
    第二章例2-7
    第二章例2-6
    第二章例2-5
    第二章例2-4
    第二章例2-3
    第二章例2-2
    第二章例2-1
    第一章例1-2
  • 原文地址:https://www.cnblogs.com/jsjyys/p/8589997.html
Copyright © 2020-2023  润新知