2018上C语言程序设计(高级)作业- 第1次作业

作业要求一

1、写程序证明P++等价于(p)++还是等价于*(p++)?

       代码证明:
 #include <stdio.h>
int main()
{
    int a=10;
	int *p=&a;
	printf("p=%d\n",p);              //p=6487620
	printf("p++=%d\n",p++);          //p++=6487620
	p=&a;
	printf("(p)++=%d\n",(p)++);      //(p)++=6487620
	printf("*(p++)=%d\n",*(p++));    //*(p++)=6487628
 } 

作业要求二

-题目6-1 计算两数的和与差
1、设计思路
(1)主要描述题目算法
第一步:根据题意,首先先计算两个实数的和。由形参*psum和实参sum相关联,再由实参与形参的关系即可得出两数之和;
第二步:求两数之差,和求两数之和相似,用同样的原理即可得出。
(2)流程图:

2、实验代码

#include<stdio.h>
 void sum_diff( float op1, float op2, float *psum, float *pdiff )
 {
 	*psum=op1+op2;
 	*pdiff=op1-op2;
 }

3、本题调试过程中碰到的问题及解决方法
错误信息1:

        错误原因:用注释里的编程方式没有把运行构造函数后的结果返回给主函数,导致运行结果出错。
       改正方法:在出现这种方法错误的时候,我通过改主函数中的sum和diff的值得出自己的错误原因的。之后自己通过翻阅课本,照葫芦画瓢写出了用指针的正确方法。通过形参中指定的形参来返回给实参。

-题目6-2拆分实数的整数与小数部分
1、设计思路
(1)主要描述题目算法
第一步:根据题意,要求一个实数的整数部分,直接把这个实数强制转换成整数型即可得到所得的整数部分。
第二步:想得到该实数的小数部分,可利用先前求出的整数部分,通过原实数和其整数部分做差即可得出其小数部分。
(2)流程图:
2、实验代码

#include <stdio.h>
void splitfloat( float x, int *intpart, float *fracpart )
{
	*intpart=(int)(x);
	*fracpart=x-*intpart;
}
3、本题调试过程碰到问题及解决办法
          由于此题和第一题类似,在调试过程中没有出现问题。
  • 题目6-3在数组中查找指定元素
    1、设计思路
    (1)主要描述题目算法
    第一步:在构造的函数里首先要定义一个循环变量j,以及定义一个函数返回值result;
    第二步:根据题目要求,要找指定的元素,首先要遍历数组,在遍历的过程中用if判断语句进行判断并返回相应的下标;
    (2)流程图:

    2、实验代码
    
#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;
		}
	}
	if(result==0)
	{
		return -1;
	}
} 
3、本题调试过程碰到问题及解决办法
          本题在解答的过程中没有遇到问题;
  • 题目6-4找最大值及其下标
    1、设计思路
    (1)主要描述题目算法
    第一步:要找数组中的最大值及其下标,首先需要遍历数组,故先定义循环变量j;
    第二步:根据题目给出的构造函数的形式,首先要给两指针变量赋初值a=0,b=0;
    第三步:在遍历数组的过程中利用if判断语句,进行逐一的判断数组中的最大值,并将其赋给a,将其下标赋给b;
    (2)流程图:

     2、实验代码
    
#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;
}
 3、本题调试过程碰到问题及解决办法
            本题在解答的过程中没有遇到问题;
  • 题目6-5最小数放前最大数放后
    1、设计思路
    (1)主要描述题目算法
    第一步:根据题目要求,此题需要定义三个函数接口;首先需要定义一个函数使得数组存入数据;
    第二步:在第二个函数接口中,需要进行题目要求的最小值在前,最大值在后的操作。要完成这个操作,首先要分两步去进行,先把最小值去放在第一位。而在数组中第一位的小标一般为0,故可定义一个变量x=0,之后再遍历数组,找出最小值并把它交换到一个位;同理可用此方法找最大值,但题目要求是把最大值放在最后,而在数组一般最后的元素下标为n-1,故可定义变量y=n-1,可用逆序遍历的方法去找到最大值。(就个人而言,逆序遍历还比较简单,也可正序遍历,纯属个人习惯);
    第三步:在第三个函数中,要去把已经进行完排序的数组进行输出操作,定义此函数直接遍历数组进行输出。(注:题目中要求的每个元素输出占3列,就个人的理解为在输出次元素的时候前面还有2个和此元素相同类型的空间,即题目所需输出的为%3d);
    (2)流程图:①第一个函数:
    ②第二个函数:
    ③第三个函数:

         2、实验代码
    
#include<stdio.h>
void input(int *arr,int n)
{
	int i=0;
	for(i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
 } 
void max_min(int *arr,int n)
 {
 	int j=0,x=0,y=n-1;
 	for(j=0;j<n;j++)
 	{
 		if(arr[x]>arr[j])
 		{
 			int swap;
 			swap=arr[x];arr[x]=arr[j];arr[j]=swap;
		 }
	 }
	 for(j=n-1;j>0;j--)
	 {
	 	if(arr[y]<arr[j])
	 	{
	 		int temp;
	 		temp=arr[y];arr[y]=arr[j];arr[j]=temp;
		 }
	 }
 }
 void output(int *arr,int n)
 {
 	int k=0;
 	for(k=0;k<n;k++)
 	{
 		printf("%3d",arr[k]);
	 }
 }

修改后,简便一点的答案,只含第二个函数:

void max_min(int *arr,int n)
 {
 	int j=0,max=0,min=0,swap=0,m=0,f=0;
 	for(j=0;j<n;j++)
 	{
 		if(j==0)
 		{
 			max=arr[0];min=arr[0];
		 }else
		 {
		 	if(max<arr[j])
		 	{
		 		max=arr[j];m=j;
			 }
			 if(min>arr[j])
			 {
			 	min=arr[j];f=j;
			 }
		 }
    }
    swap=arr[0];arr[0]=min;arr[f]=swap;
    swap=arr[n-1];arr[n-1]=max;arr[m]=swap;
	} 
         3、本题调试过程碰到问题及解决办法
                     错误信息1:
 void max_min(int *arr,int n)
 {
 	int j=0,x=0,y=n-1;
 	for(j=0;j<n;j++)
 	{
 		if(arr[x]>arr[j])
 		{
 			int swap;
 			swap=arr[x];arr[x]=arr[j];arr[j]=swap;
		 }
	 }
	 for(j=n-1;j>0;j--)
	 {
	 	if(arr[y]<arr[j])
	 	{
	 		int temp;
	 		temp=arr[y];arr[y]=arr[j];arr[j]=temp;
		 }
	 }
 }
                     错误原因:出现这个错误主要是在第一次在编写过程完成后再核对过程中出现的马虎现象。当时在核对时,输入pta中的实例,但由于没仔细看输出结果,故直接上传到pta上,当出现错误的时候仔细看了下代码,发现此方法在查找最小值是没有问题的,问题主要出现在查找最大值的代码中,由我自己写的代码,发现在查找到最大值之后也把最大值放到了最后一个位置,但是在这遍历的过程中其他的位置上元素也发生了变化(自己也对这段代码有些迷惑,但感觉自己的这种看法是对的)用此函数运行后的结果会出现这种的结果:


改正方法:在第一次提交错误之后,自己再重新检查了一下自己代码,找到原因所在,就重新的编写了一遍。

  • 题目6-6指针选择法排序(之前用了冒泡法,现在改为了选择法)
    1、设计思路:
    (1)第一步:根据题目,要求把数组的元素从小到大遍历一遍,故首先在创建循环变量,由于用到选择法(或冒泡法)排序,需要定义两个循环变量,故定义j=0,k=0;
    第二步:利用冒泡法排序的话,其原理是先将首元素和其他元素逐一比较进行交换,并在数组中依次类推到其他的元素上,依次排序;
    (题目说选择法排序,但我用了冒泡法排序,也是通过了测试,感觉用冒泡还比较熟悉一点,选择法排序和冒泡自我认为大同小异)
    (2)流程图:

       2、实验代码
    
#include<stdio.h>
void sort(int *x,int n)
 {
 	int j=0,k=0,max=0,swap=0,flag=0;
 	for(j=0;j<n-1;j++)
 	{
 		max=x[j];
 		flag=j;
 		for(k=j+1;k<n;k++)
		{
			if(max<x[k])
			{
				max=x[k];flag=k;
			}
		 }
		 swap=x[j];x[j]=max;x[flag]=swap; 
	 }
  } 
      3、本题调试过程碰到问题及解决办法
                    本题在调试过程中没有出现问题;
  • 题目6-7判断回文字符串
    1、设计思路:
    (1)第一步:判断是否为回文字符串满足的条件为首尾相等,且首加一,尾减一仍成立,依次类推。故,首先先找出这个字符串的长度;
    第二步:在找到长度之后,再定义两个循环变量进行依次的判断只要出现两者不相等的时候就返回false,反之返回true;
    (2)流程图
    2、实验代码
#include <stdio.h>
#include <string.h>
#define MAXN 20
bool palindrome( char *s )
{
	int i=0,j,flag,n;
    flag = strlen(s);
    j = flag - 1;
    n = flag/2;
    while(i<=n){
        if(*(s+i)!= *(s+j))
            return false;
        j--;
        i++;
    }
    return true;
 } 
      3、本题调试过程碰到问题及解决办法
              错误信息1

              错误原因:起初,在写这种含有字符问题的时候是比较懵的,当拿到这个题之后,自己当时只有一个怎么去判断是否为回文的方法构架,就是简单的去挨个去比较由中心字符隔开的左右两侧是否相同。于是就写下来上述的截图代码。在当时自己很肯定的说这个是错的,但是不知道具体出现在哪。
              改正方法:于是就去网上查了一下相关的代码。找到了一个和我的想法查不太多的看了之后就仿照他的写了自己的这个代码。总结的看,我的代码可能是在for语句上出现了错误,以及在前后两者在进行比较的时候也是错的。
  • 题目6-8使用函数实现字符串部分复制
    1、设计思路
    (1)第一步:根据题目要求,首先要引入一个有关字符的函数包这是为了之后在字符进行操作的是所用到的。
    第二步:之后利用字符所拥有的函数,将已知的字符复制到一个空的字符数组里。
    第三步:再根据题目要截取已知的字符数组的一部分,此时需要进行嵌套,让空的数组进行依次截取出所需的数组;

             (2)流程图
    


2、实验代码
```
#include <stdio.h>
#include<string.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s )
{
int i,j,len;

strcpy(s, t);  
len = strlen(s);  
for(i=m-1;i>0;i--){  
    for(j=i;j<len;j++){  
        s[j-1]=s[j];  
    }  
}  
s[len-m+1]='\0'; 
}
```
        3、本题调试过程碰到问题及解决办法
                错误信息1:本题没有问题,因为自己不会写;
                改正方法:自己去网上去查了查才会的这道题。这道题看明白之后,自己感觉似懂非懂,有种一看就会又有种看不懂的感觉。但是这个是自己仿照网上自己凭感觉写的,只是幸运的通过了。
  • 附加题3
    实验代码
#include<stdio.h>
#include<string.h>
#define MAX 10
int main()
{
	char str[MAX];
	int i=0;
	char c=getchar();
	while(c!='\n')
	{
		str[i]=c;
		i++;
		c=getchar();
	}
	str[i]='\0';
	for(i=0;str[i]!='\0';i++)
	{
		if(str[i]=='y')
		{
			str[i]='a';
		}
		if(str[i]=='z')
		{
			str[i]='b';
		}
		if(str[i]>='a'&&str[i]<='x')
		{
			str[i]=str[i]+2;
		}
	}
		printf("%s",str);
	return 0;
}

实验截图:

流程图:

作业要求三

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

         这两周所学: 这两周总的来说我学到了指针的用法。其中自我感觉较为重要的是指针在数组上的应用。同时这两周我还复习巩固了一下上学期的函数调用。
         未学会的知识点:这两周是开学的前两周,自我感觉讲的内容和与上学期的联系很密切,而我的问题也是和上学期的问题差不多,我在字符上的问题很大。一遇到这种问题整个人都是懵的,感觉啥也不会,在别的方面感觉还是可以的。所以自己打算补补在字符方面的内容。

2、PTA作业源代码上传Git

          ①Git超链接:

地址
②上传成功截图:

3、点评3位同学本周作业,并邀请3位同学点评作业

          ①点评3位同学:

于耀淞
丰大为
班庆泽
②邀请3位同学:
丰大为
班庆泽
执念丶。

4、表格和折线图记录学习情况

          ①表格:

          ②折线图:

posted @ 2018-03-18 11:59  高立彬  阅读(1546)  评论(26编辑  收藏  举报