6-1 计算两数的和与差(10 分)

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是计算两个数的和与差,根据“函数接口定义”确定了变量,op1和op2是输入的两个实数,psum和pdiff是计算得出的和与差。

2.算法设计

(1)根据题干给*psum、 *pdiff赋值

3.流程图

4. [代码]

(https://github.com/dangrui/dangrui.git)

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

5.问题与解决方法

再调用函数中,此句后边加了分号void sum_diff( float op1, float op2, float *psum, float *pdiff )
在之前已经被声明了,不能重复声明。

6-2 拆分实数的整数与小数部分(15 分)

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是将这个数的小数和整数部分分开,根据“函数接口定义”确定了变量,x, intpart, fracpart其中x是被拆分的实数(0≤x<10000),intpart和fracpart分别是将实数x拆分出来的整数部分与小数部分。

2.算法设计

(1)将定义的float类型的X强制转换成int型取整
(2)取得整数部分后用X - 整数部分 = 小数部分

3.流程图

4.代码

(https://github.com/dangrui/dangrui.git)

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

5.问题与解决方法

开始认为取余便可得到整数部分*intpart = x%10 -*fracpart;无效操作数的二进制%(有“浮”和“int”)
之后又把程序改为*intpart = (int)x%10 -*fracpart;结果只有个位数的数字才有用十位以上就不对了
之后遍去百度“如何取整”得到答案---[x]或INT(x)---

6-1 在数组中查找指定元素(15 分)

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是在输入的一串数字中查找指定元素,根据函数接口int search( int list[], int n, int x );进行编译,确定输出结果。

2.算法设计

(1)做一个循环将所有的数查找一遍。
(2)用if语句进行判断,如果找到则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。

3.流程图

4.代码

(https://github.com/dangrui/dangrui.git)

int search(int list[],int n,int x)     //如果找到一样的值,返回下标,下标是从0开始的,所以返回值不加1
{
    int i;//i最小下标
    for(i = 0;i <= n;i++)
    {
        if(list[i] == x)
            return i;
    }
    return -1;
}

6-2 找最大值及其下标(10 分)

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是找出输入的数字中最大数及其下标,根据函数接口int fun(int *a,int *b,int n);进行编译,确定输出结果。

2.算法设计

(1)将max的初始值定为*a
(2)定义一个循环找出最大值
(3)将最大值赋给max
(4)将下标i赋给b

3.流程图

4.代码

(https://github.com/dangrui/dangrui.git)

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

5.问题与解决方法

没给max赋初值,将一串数字的首位*a赋给max.

6-1 最小数放前最大数放后(10 分)

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是将其中最小的数与第一个数对换,将最大的数与最后一个数对换,根据函数接口

void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);

确定输出结果。

2.算法设计

(1)输入
(2)找出最大值和最小值并与首位、末位交换位置
(3)输出

3.流程图

4.代码

(https://github.com/dangrui/dangrui.git)

    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,t;
    int j=0,p=0;
    for(i=0;i<n;i++)
    {  
	 if(*(arr+i)<min)
		{  
     		min = *(arr+i);
      		p =i ;
		}
		if(max<*(arr+i))	
		{  
            max = *(arr+i);
			j = i ;  
        }
	}  
    	t=*(arr+0);  
        *(arr+0)=*(arr+p);  
       	*(arr+p)=t;
		t=*(arr+n-1);  
        *(arr+n-1)=*(arr+j);  
        *(arr+j)=t; 
    }  
    void output(int *arr,int n)
    {
   int i;
   for(i = 0;i<n;i++)
   printf("%3d",arr[i]);
    } 

5.问题与解决方法

(1)在input中输入下标时,不能加&否则数组下标类型无效
(2)“int arr [ 0 ]“阴影参数,要将它赋值到一个已知变量中
(3)错误的一元“*”类型的参数(有“int”),直接打arr【】既可

6-2 指针选择法排序(10 分)

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是将数字按从大到小的顺序依次排列,根据函数接口void sort(int *x,int n);进行编译,确定输出结果。

2.算法设计

(1)设计一个循环,比较前后两个数的大小
(2)交换位置

3.流程图

4.代码

(https://github.com/dangrui/dangrui.git)

{
 		int i,j,s,t;
 		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)
			 {
			 	t=*(x+i);
			 	*(x+i)=*(x+s);
			 	*(x+s)=t;
			 }
		 }
	 }

6-1 判断回文字符串(20 分)

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是判断字符串两边是否对称,根据函数接口bool palindrome( char *s );进行编译,确定输出结果。

2.算法设计

(1)for循环遍历数组
(2)不对称false,对称true

3.流程图

4.代码

(https://github.com/dangrui/dangrui.git)

bool palindrome(char *s)   //定义返回值为布尔类型的函数  
{  
    char *a = s;
    int i = 0,j=0,k=0;  
    while (*a != '\0')     
    {  
        a++;  
        i++;  
    }  
    a--;                     //因为最后一为为'\0'所以减一位  
    while (*s != '\0')       //进行两个比较  
    {  
        if (*s == *a)  
        {  
            k++;  
        }  
        else   
        {  
            return false;  
        }  
        s++;  
        a--;  
    }  
    if (k == i)           //如果每个都相等 k=i返回true  
    {  
        return true;  
    }  
}  

5.问题与解决方法

(1)因为最后一为为'\0'所以减一位
(2)直接将两边的字符进行比对既可

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

1.案例描述

需要写一个被题干调用的函数,被调用函数的作用是复制部分字符串,根据函数接口void strmcpy( char *t, int m, char *s );进行编译,确定输出结果。

2.算法设计

(1)写一个循环,首先确保所给位置在输出的字符串中
(2)输出此位置之后的字符串

3.流程图

4.代码

(https://github.com/dangrui/dangrui.git)

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';
}

时间总结


托管代码

学习总结

以前写PTA如果懒了的话,就找同学的抄一下就好,但是现在不行了,上课之后要看书重新捋顺知识,之后做PTA,不懂的地方错误的原因都要标注出来,只有这样才能更好地完成博客作业,这也使得我对C语言的学习投入了更多的精力,和时间,也和我的懒惰做了对抗。

评论同学

王帅(http://www.cnblogs.com/moxiaoshuai/p/8633373.html)
张琪(http://www.cnblogs.com/zhang03/p/8641322.html#3933170)
邓欣茹(http://www.cnblogs.com/dxfish/p/8597352.html)
焦瑞君(http://www.cnblogs.com/jiaoruijun/p/8639383.html)
梁圣然(http://www.cnblogs.com/messi6/p/8626565.html)