题目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)!='\0')
	{
		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时的新字符数组。

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

2.实验代码

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

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

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

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

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

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

3.流程图

 

 

二. 总结

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

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

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

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

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

 董欣

史泽文

 周璇

4、学习进度表格

 

 

posted on 2018-03-25 11:01  冯子旋  阅读(381)  评论(20编辑  收藏  举报