第一次作业

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

1.实验代码###

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

指针在此题中的作用:向函数中传入传出数据。
(1)设计思路
第一步:利用指针psum接收sum的地址,指针pdiff接收diff的地址,因此 * psum为sum, * pdiff为diff。
第二步:先写出函数,写出加减的运算过程。
(2)流程图

(3)本题调试过程碰到问题及解决办法:并未遇到问题。

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

1.实验代码###

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

(1)设计思路
第一步:根据函数中形参指数型intpart为实参intpart的地址,fracpart也是如此,因此 * inpart的值为实参inpart的值,fracpart也是一样。
第二步:先写出函数,将传入数据变为int型并赋值给整数部分的值,最后用传入的数据减去整数部分得到小数部分并赋值给小数部分。
(2)流程图

(3)问题及解决办法:本题调试时未遇到问题。

三、题目6-1 在数组中查找指定元素##

1.实验代码###

`#include <stdio.h>
int search( int list[], int n, int x )
{
int j=0,result=0;
for(j=0;j<n;j++)
{
	if(x==list[j])
	{
		result=j;
		return result;break;
	}
}
if(result==0)
{
	return -1;
}
} `

(1)设计思路
第一步:观察题中给了主函数和函数接口的定义,可以看到传出的数据有所需排序的数组,需要查找的数字和元素个数。
第二步:先写出函数运用一个for语句对数组进行遍历,在遍历的过程中运用一个if语句,if语句需要判断所遍历到的数字是否和要查找的数字相同,如果相同令index = i并用break跳出for循环,如果不相同index则仍等于-1,直到循环结束。最后返回index的值即可。
(2)流程图

(3)遇到的问题:
错误原因:设置的字母与下面输入的字母不相同导致。
改正方法:仔细检查改正。

四、题目6-2 找最大值及其下标##

1.实验代码###

`#include<stdio.h>
int fun(int *a,int *b,int n)
{
int j=0;
*a=0;*b=0;
for(j=0;j<n;j++)
{
	if(*a<*(a+j))
	{
		*a=*(a+j);
		*b=j;
	}
}
return *a;
}`

(1)设计思路
第一步:要找数组中的最大值及其下标,首先需要遍历数组,故先定义循环变量j。
第二步:根据题目给出的构造函数的形式,首先要给两指针变量赋初值a=0,b=0。
第三步:在遍历数组的过程中利用if判断语句,进行逐一的判断数组中的最大值,并将其赋给a,将其下标赋给b。
(2)流程图

(3)遇到的问题:此题调试过程中,未遇到问题,编译错误的主要原因是马虎。

五、题目6-1 最小数放前最大数放后##

1.实验代码###

`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 idx=0,i,t;
for ( i = 0; i < n; i++ ) 
{ 
	 if ( arr[i] < arr[idx] )
	{ 
      idx=i; } 		
} 	
   
if(idx!=0){
	t=arr[0];arr[0]=arr[idx];arr[idx]=t;
}
idx=0;
for ( i = 0; i < n; i++ ) 
{ 
	 if ( arr[i] > arr[idx] )
	{ 
       idx=i;} 		
} 

if(idx!=(n-1)){
    t=arr[n-1];
	arr[n-1]=arr[idx];
	arr[idx]=t;}
}

void output(int *arr,int n)
{
int i;
for(i = 0;i < n;i++){
	printf("%3d",*(arr + i));
} 	
}`

(1)设计思路
第一步:观察题中给了主函数和函数接口的定义,可以看到题中共需要三个函数,其中第一个和最后一个函数只需要遍历数组便可录入数据和传出排序后数据,第二个函数传入了数组,和数组所含数据个数需将最小数放前最大数放后。
第二步:首先需要一个for循环遍历数组在数组中设立if语句比较当前数据和最小值的大小,如果大于最大值则将当前数组的下标赋给idx,遍历过后判断idx是否等于0,如果不等于0将a[idx]与a[0]数值相互调换。最小值与之相反。
(2)流程图
对不起老师,这个流程图我实在不会。
(3)问题:
错误原因:代码可以写的很好,但是流程图无法依靠代码画出。
改正方法:我认为就是多练。

六、题目6-2 指针选择法排序##

1.实验代码###

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

(1)设计思路
第一步:先遍历一遍数组。
第二步:再遍历一遍数组并在此次遍历中判断所遍历到的数和下一个数的大小。
第三步:最后排出大小。
(2)流程图

(3)问题:此题未遇到问题。

七、题目6-1 判断回文字符串##

1.实验代码###

`bool palindrome( char *s )
{
int n = strlen(s);
int i , j , k = 0;
for(i = 0 ,j = n - 1;i < n; i ++,j --)
{
if(*(s + i) == *(s + j)){
k ++;
}else{
return false;
}
}

 if(k == n){
return true;
 }

}`

(1)设计思路
第一步:声明第一个函数,定义两个变量,数清楚一共几个字符.
第二步:判断第一个数与最后一个数是否一样,先用strlen将字符长度赋值给n,用一个for循环遍历数组,并在for循环中用一个if语句判断回文相应的字符是否相等,如果相等则将k加一,否则返回false。for循环后判断k与n是否相等,如果相等则返回true。
(2)流程图

八、题目6-2 使用函数实现字符串部分复制##

1.实验代码###

`void strmcpy( char *t, int m, char *s )
  {
int n = strlen(t);
int i;
if(m <= n){
for(i = 0;*(t + i) != '\0';i ++){
*(s+i) = *(t + m - 1 + i);

}
*(s + n) = '\0';
}else{
*s = '\0';
}
  }`

(1)设计思路
第一步:调用函数t,s指向主函数中的t,s;将指针型t中的值赋值给另一个数组,计算出数组的长度,将m的大小与数组的长度用if语句来进行比较。
第二步:如果m大于数组得长度,则数组s直接输出为空数组;另一种则遍历数组,使数组s满足要求,在if语句的最后写上s='\0',
(2)流程图

(3)问题:
错误原因:在if语句中最开始只写了m<n导致pta上出现错误;编译后没有写
(s + n) = '\0'导致错误。
改正方法:看完其他同学的改过来的。

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

我在近两周学习了指针的概念和定义指针,地址和指针的关系。之后学到了指针的相关运算,例如(p)++和(p++),以及赋值运算其中需要注意指针不能进行乘除运算。再之后学到了数组和指针的相关知识。目前我掌握的只是近两天学习的数组和指针的相关知识,之前学的不是不会,而是掌握的不牢,我认为就是时间长了,课下没做好复习导致的。

2.将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。##


https://coding.net/u/zgq459947/p/EDG/git?public=true

3.作业互评。##

(1)丰大为
(2)姚舜禹
(3)董欣

4.图表。##

posted @ 2018-03-25 19:01  张国庆  阅读(286)  评论(3编辑  收藏  举报