zoukankan      html  css  js  c++  java
  • 大一下第1次作业

    题目6-1 计算两数的和与差

    1 设计思路

    (1)主要描述题目算法

    第一步:psum为sum的地址,pdiff为diff的地址,形参op1、op2接受到实参a,b传来的值。

    第二步:根据题意进行赋值。

    2.实验代码

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

    (2) 本题调试过程碰到问题及解决办法

    无。 

    题目6-2 拆分实数的整数与小数部分

    1 设计思路

    (1)主要描述题目算法

    第一步:因为输入的数据为浮点型,强制转换x为整型,赋值给*intpart,*intpart的值为整数部分。

    第二步:x减去*intpart为小数部分。

    2.实验代码

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

    (2) 本题调试过程碰到问题及解决办法

    无。ps:原先定义了一个变量y用来存放强制转换x后的值,发现是多此一举。

    题目6-3 在数组中查找指定元素

    1 设计思路

    (1)主要描述题目算法

    第一步:定义变量flag=0用来标记,count用来存放指定元素的最小下标,用for循环和if语句一个一个的查找,找到了指定元素就令flag=1。

    第二步:判断flag是否为0(没找到),真的就令count=-1。

    第三步:返回count的值。

    2.实验代码

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

    (2) 本题调试过程碰到问题及解决办法

    无。

    3.流程图

    题目6-4 找最大值及其下标

    1 设计思路

    (1)主要描述题目算法

    第一步:定义变量MAX,MAX存放数组第一个的值。

    第二步:运用for循环比较,如果后一个的值大于MAX,就交换,下标存到指针b所指的变量里,进行下一次比较。

    第三步:返回MAX的值。

    2.实验代码

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

    (2) 本题调试过程碰到问题及解决办法

     错误原因:写这个程序时还不怎么会用指针,导致答案错误。

    改正方法:去看了书上数组与指针那一章的几个例题。

    3.流程图

    题目6-5 最小数放前最大数放后

    1 设计思路

    (1)主要描述题目算法

    第一步:运用for循环输入数组的值。

    第二步:运用for循环找出最小的数的下标,再用if语句判断它是不是第一个数,不是就与第一个数进行交换。同理找出最大的数,然后交换。

    第三步:输出数组元素。

    2.实验代码

    void input(int *arr,int n)
    {
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%d",arr++);
        }
    }
    void max_min(int *arr,int n)
    {
        int j,index=0,t,flag=0;
        for(j=1;j<n;j++)
        {
            if(*(arr+j)<*(arr+index))  index=j;
            
        }
                if(index!=0)
        {
            t=*arr;*arr=*(arr+index);*(arr+index)=t;
        }
                for(j=1;j<n;j++)
        {
            if(*(arr+j)>*(arr+flag))  flag=j;
            
        }
        if(flag!=0)
        {
            t=*(arr+n-1);*(arr+n-1)=*(arr+flag);*(arr+flag)=t;
        }
        
    }
    void output(int *arr,int n)
    {
        int k;
        for(k=0;k<n;k++,arr++)
        {
            printf("%3d",*arr);
        }
    }

    (2) 本题调试过程碰到问题及解决办法

    无。

    3.流程图

    题目6-6 指针选择法排序

    1 设计思路

    (1)主要描述题目算法

    第一步:用外循环控制趟数,n个数选n-1趟,假设当前趟的第一个数为最值,记在k中 。

    第二步:再用for循环从下一个数到最后一个数之间找最值,若其后有比最值更大的,则将其下标记在k中。

    第三步:若k不为最初的i值,就交换。

    2.实验代码

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

    (2) 本题调试过程碰到问题及解决办法

    因为以前做过此题,所以没有问题。

    3.流程 

    题目6-7 判断回文字符串

    1 设计思路

    (1)主要描述题目算法

    第一步:用while循环语句判断字符串数组有多少个字符。

    第二步:定义变量j,从后往前与从前往后比较字符,不相等就跳出循环。

    第三步:比较j和i的大小,j大于i返回真,j小于i返回假。

    2.实验代码

    bool palindrome( char *s )
    {
    	int i=0,j=0;
    	while(*(s+i)!='')
    	{
    		i++;
    	}
    	i--;
    	for(;j<=i;i--,j++)
    	{
    		if(*(s+i)!=*(s+j))
    		{
    			break;
    		}
    	}
    	if(j>i) return 1;
    	else return 0;
    } 

    (2) 本题调试过程碰到问题及解决办法

    老师上课讲过此题,所以并无问题。

    3.流程图

    题目6-8 使用函数实现字符串部分复制

    1 设计思路

    (1)主要描述题目算法

    第一步:用while循环语句判断字符串数组有多少个字符。

    第二步:判断m是否超过输入字符串的长度,是结果字符串应为空串,不是,定义一个变量i和j,i从m-1个字符开始赋值给j=0时的新字符数组。

    第三步:令最后一个字符数组的值为''。

    2.实验代码

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

    (2) 本题调试过程碰到问题及解决办法

    1、如果不写  void ReadString( char s[] ) 这个函数,在编译器中运行不了,但是加上后PTA提交答案为错误。

    解决办法:在PTA的提交中不写 void ReadString( char s[] ) 这个函数,,题目中已说明可以不用表示,其实它写的略去不表我想了半天。。。原来意思是不表示。。。

    2、按照我的写法写,最后没有写 *(s+j)='' 程序会输出乱码。    

       原因:因为C通过判断''来辨识字符串的结束。系统读取字符串,它只是从字符数组的开始,一直往后找,一直找到''为止。如果不加,系统只好再往后找,一直找到''为止。

    3.流程图

     

    二. 总结

    1、总结两周里所学的知识点有哪些学会了?哪些还没有学会?

    这两周主要学习了指针以及它的应用,知道了指针的作用(通过地址能找到所需的变量单元)和如何定义、使用它。我问题大的地方其实不是指针而是函数,可能时因为上学期对这一块少加练习的缘故,不知道形参和实参它们之间是如何传递的,不知道在函数调用结束后,形参所占的内存单元会被释放,形参发生改变不会改变主调函数实参的值。所以这几次PTA的作业,让我不光学习了指针还让我重新复习了函数。

    通过这几次的PTA作业,我发现刚开始写时,对指针的运用并不熟练,果然自己以为听懂了和实际写起来还是有很大的差别,这也说明了代码光看是没有用的。上个周末去参加了ACM的招新,有一道题已经完成了99%了,调试时总是输出答案不对,在我冥思苦想时,时间已经到了。等到学长他们讲思路时我终于发现了我的问题所在,就是一个小小的地方(重新计数时没让它的值等于0),非常后悔和可惜。虽然最后进了ACM,但是我觉得自己在写代码这块思路还是不清晰,想到啥写啥,代码也不够简洁,最好的办法还是多加练习,看书上的例题时最好开着编译器自己动手打打。

    2、Git地址https://coding.net/u/FENGZX/p/PTA/git?public=true

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

     董欣

    史泽文

     周璇

    4、学习进度表格

     

  • 相关阅读:
    未能创建可接受的游标。
    怎样修改查看Oracle字符集
    2005年国内各大公司的薪酬一览 同学发给我的,留在这里刺激一下自己,不过他说到了中国工程物理研究院(四川绵阳) 对此不表同意,具体情况我可最清楚呀,哈哈
    破解低价笔记本惊人的秘密
    Struts 的安装、配置与运行zt
    有用的数据:30款市场主流车型真实油耗一览
    JDBC连接Oracle数据库常见问题及解决方法
    查锁的方法
    用Oracle闪回功能恢复偶然丢失的数据数据被误删除了,多亏了万能的oracle,....后怕
    powerdesigner中去掉生成sql中的引号
  • 原文地址:https://www.cnblogs.com/fengzx/p/8612048.html
Copyright © 2011-2022 走看看