2018上第一次作业

要求一:完成PTA作业

答:作业已经完成!

要求二:pta作业编程题目的解题思路和调试过程记录

C高级语言第一次作业(1)

完成情况如图:

题目一:计算两个数的和与差

1.设计思路

(1)算法:
第一步:看主函数部分。通过主函数可得输入两个浮点型变量a,b,然后经过函数(sum_diff(a, b, &sum, &diff))调试之后,输出两个数的和(sum)与差(diff);
第二步:看函数变量。根据题目流程可看出是把a赋值给op1,b赋值到op2,&sum赋值到psum,&diff赋值到pdiff(注意:函数里的psum,pdiff为指针变量);
第三步:写函数部分的代码。根据题目要求,两个数的和为psum=op1+op2,两个数的差为pdiff=op1-op2。
提示:float psum,floatpdiff是定义和与差的指针变量,单写psum,pdiff是指和与差的值。
(2)流程图:
主函数:

调用函数:

2.实验代码:

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

3.本题调试过程碰到问题及解决的办法:

本题在调试过程中未遇到错误。

题目二:拆分实数的整数与小数部分

1.设计思路

(1)算法:
第一步:看主函数部分。定义x, fracpart为浮点型变量,intpart为整型变量(题目中fracpart是小数部分,intpart是整数部分),然后输入x(x为一个实数),经过函数(splitfloat(x, &intpart, &fracpart))调试之后,输出整数部分和小数部分的值;
第二步:看函数变量。根据题目流程可看出是x赋值给x,&intpart赋值给intpart, &fracpart赋值给fracpart(注意:函数里的intpart,fracpart为指针变量);
第三步:写函数部分的代码。根据题目要求,把一个实数强制转化为int型得到整数部分,然后用实数减去整数部分即得到了小数部分。
(2)流程图:
主函数:

调用函数:

2.实验代码:

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

3.本题调试过程碰到问题及解决的办法:

本题在调试过程中未遇到错误。

C高级语言第一次作业(2)

完成情况如图:

题目一:在数组中查找指定元素

1.设计思路

(1)算法:
第一步:看主函数部分。通过主函数可得定义 i, index, n, x,a[10]为整型(题目定义了MAXN为10),然后输入n(n是list[]中元素的个数),for循环输入数组,再输入x(x是待查找的元素),通过函数得出index的值,若index不为-1,则输出index
的值,否则输出Not found;
第二步:看函数变量。把a赋值给list[],n、x赋值给n、x;
第三步:写函数部分的代码。在函数中定义a为整型变量,根据题目要求,需知使得若x等于list[a],则返回a的值,若没有,则使index为-1。
(2)流程图:
主函数:

调用函数:

2.实验代码:

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

3.本题调试过程碰到问题及解决的办法:

本题问题

解决办法:发现我设的是a,不是i,结果误把a写为了i,改正即可。这提示我在写题时不要马虎!

题目二:找最大值及其下标

1.设计思路:

(1)算法:
第一步:看主函数部分。通过主函数可得定义 a[10],i,max,p为整型变量,p=10,然后输入a[0]~a[9]的值,经过函数(fun(a,&p,N))调用,得到最大值max及下标p的值;
第二步:看函数变量。fun(a,&p,N)中的变量赋值给int fun(int a,int b,int n)中的变量;
第三步:写函数部分的代码。求最大值及其下标的方法就是先令a[0]是最大值,然后循环数组里的数字,与max比较大小,如果比max大,则把这个数赋给max,再把其相应下表写出即可。
提示:在本题中,函数里的a为数组的第一个值的地址,则
a为数组a[0]的值,
(a+i)则为a[i]的值。另外,该代码中不要忘记return max,把max的值返回到主函数中。为什么不用返回下标的值呢?因为最开始是把下标的地址赋给b,b则为b的值(b的地址里存的数),在要求写的代码中,把i的值赋值给b,即b地址里存的数为i,因此不用返回i的值。
(2)流程图:
主函数:

调用函数:

2.实验代码:

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

3.本题调试过程碰到问题及解决的办法:

本题问题:

没写返回值return max;
解决办法:补上即可。

C高级语言第一次作业(3)

完成情况如图:

题目一:最小数放前最大数放后

1.设计思路

(1)算法:
本题里有三个函数。从简单的开始。
第一步:第一个函数的作用就是输入一个10个数字的数组,第三个函数是输出这个数组。这两个函数都是用for循环输入输出。
第二步:我觉得第二个函数是本题考察的重点。我把这个函数要做的事情分为两个部分。
第一是找最最值,第二是移动最值。其中找最值我设了两个数max,min,把这两个数等于a[0],再和数组中的数进行比较。把比max大的数赋值给max,比min小的数赋值给min。
第二是移动。
(2)流程图:
主函数:

调用函数:
①input(int *arr,int n)函数

②max_min(int *arr,int n)函数

③output(int *arr,int n)函数

2.实验代码:

void input(int *arr,int n)
{
int i;
for(i=0;i<=9;i++){
  scanf("%d",&arr[i]);
}
}
void max_min(int *arr,int n)
{
  int max,min,i,t,c,d;
  max=arr[0];
  min=arr[0];
  for(i=0;i<=9;i++){
    if(arr[i]>=max){
      max=arr[i];
      c=i;
    }
  }
    t=arr[c];
    arr[c]=arr[9];
    arr[9]=t;
  for(i=0;i<=9;i++){
    if(arr[i]<=min){
      min=arr[i];
      d=i;
    }
  }
    t=arr[d];
    arr[d]=arr[0];
    arr[0]=t;
}
void output(int *arr,int n)
{
	int i;
  for(i=0;i<=9;i++){
  printf("%3d",arr[i]);
  }
}

3.本题调试过程碰到问题及解决的办法:

本题问题:
在做这道题的时候,交换数字时没把i赋值给其它变量,而是直接用max,min和首末位置互换,从而使得数组中出现两个一样的最值情况(原本没有)
解决办法:
找到问题,把i赋值给c,d,更正完毕,正确。

题目二:指针选择法排序

1.设计思路

(1)算法:
本题的算法就是选择排序法。选择排序法就是选择出最大或最小放第一个位置,次大或次小放第二个位置,其它同理。而具体做法就是让第一个数与后面的比较,找到比第一个位置的数大或小(看升序还是降序)的时候,从那个大的或小的数的位置继续与其他的比较,直到找出最大或最小,再和第一个数交换位置,之后就从第二个人数继续下去,直到排序成功。
第一步:设 i,j,t,temp为int型变量;
第二步:写for循环,第一个循环是趟数,第二个是比较。如果(x+t)<(x+j)成立,则把i赋值给t;
第三步:找到最值后交换。
(2)流程图:
主函数:

调用函数:

2.实验代码:

void sort(int *x,int n)
{ 
 int i,j,t,temp;
 for(i=0;i<n-1;i++)
 {
 t=i;
 for(j=i+1;j<n;j++)
 {

 if(*(x+t)<*(x+j))
 t=j;
 }
 temp=*(x+i);
 *(x+i)=*(x+t);
 *(x+t)=temp;
 }
} 

3.本题调试过程碰到问题及解决的办法:

本题问题:
本题问题在于不会选择排序法,没有头绪,然后上网查了选择排序法,也懂了是怎样一回事,心得在算法上。
解决办法:
上网百度,写下心得。

C高级PTA第一次作业(4)

完成情况如图:

题目一:判断回文字符串

1.设计思路

(1)算法:
本题是看是否为回文。回文是abba或者abcba的格式。方法是先求出一个字符串有多少个字符(strlen()就是查多少字符用的,但不包括)然后数组中首尾相比(用for循环写出数组)如果不相等,则不是回文,如果相等,继续比较第二个和倒数第二个,以此类推,如果从头往后的数组的位数大于从后往前的数组的位数,那么跳出循环。如果最后真的从头往后的数组的位数大于从后往前的数组的位数,那么是回文。
第一步:定义i,j,n为整形变量;
第二步:求出数组s中的字符个数记为n;
第三步:j=n-1,j为数组下标;
第四步:写出for循环,在for循环里比较s[i]与s[j],如果不相等,则跳出循环。相等就继续下去,直到循环结束;
第五步:循环结束后,判断i和j的大小,若i>j,则是回文,否则不是回文。
(2)流程图:
主函数:

调用函数:

2.实验代码:

bool palindrome( char *s )
{
  int i,j,n;
  n=strlen(s);
  j=n-1;
  for(i=0;i<j;i++,j--)
  { 
    if(s[i]!=s[j]){
      break;
      } 
      } 
    if(i>=j){
      return true;
    }
}

3.本题调试过程碰到问题及解决的办法:

本题问题:

解决办法:
经检查发现if语句内容括多了,应该只有判断s[i]与s[j]的关系,若不相等就跳出循环这一点,改正后答案正确。

题目二:使用函数实现字符串部分复制

1.设计思路

(1)算法:
第一步:先测出被复制的数组的长度,然后把整个数组复制到新的数组上;
第二步:用for循环,第一个for循环是说明从那个字符开始,内部嵌套的for循环是从这个字符开始直到结束的字符整体前移(前移是(s+j-1)=(s+j)做到的);
第三步: *(s+k-m+1)='',在得到的新数组后加''。
(2)流程图:
主函数:

调用函数:

2.实验代码:

void strmcpy( char *t, int m, char *s )
{
  int i,j,k;
  k=strlen(t);
    strcpy(s,t);
     for(i=m-1;i>0;i--){  
        for(j=i;j<k;j++){  
            *(s+j-1)=*(s+j);  
        }  
    }  
      *(s+k-m+1)=''; 
}

3.本题调试过程碰到问题及解决的办法:

本题问题:
本题一点头绪都没有。
解决办法:
上网查找了答案,认真分析后,自己又在电脑上敲出来的。

附加题:

题目:为了防止信息被别人轻易盗取,需要把电码明文通过加密方式变换成为密文。变换规则如下:小写字母y变换为a,小写字母z变换为b,其他字母变换成为该字母ASCII码顺序后2个字母,比如o变换成q。要求给出你的姓名全拼加密后的结果。

我的姓名全拼加密后的结果:

1.设计思路

(1)算法:
第一步:定义一个字符为c,用while循环输入字符;
第二步:根据题目要求,如果是字母则加2;
第三步: 如果加2以后不再是字母或者字母要循环回来,此时就-26即可。
(2)流程图:

2.实验代码:

#include <stdio.h>
int main()
{
	char c;
	while((c=getchar())!='
')
	{
		if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
		{
			c=c+2;
	if(c>'Z'&&c<='Z'+2||c>'z')
		c=c-26;
		}
		printf("%c",c);	
	}
	printf("
");
 return 0;
 } 

3.本题调试过程碰到问题及解决的办法:

本题问题:
如图:

解决办法:
后来发现是'z'+2写成了'z+2',改正即可。

要求三:学习总结和进度

1、总结两周来所有PTA作业中每个题目所使用的知识点。(我学到了什么,未学会什么?)

分享:几种表达方式的区别:



这两周主要学了指针,指针与数组,指针与字符数组,在PTA作业习题中均有体现。这些知识点在课本上都有,我主要说一下习题的知识点。
在作业一中,我一遍过,觉得很简单。这里需要注意的是怎样把一个浮点数强制转化为整数型。就是类似于(int)x这样(若x是浮点型)。
在作业二中,第一个是看是否有list[a]等于x,第二个要注意找到最大值的方法。即先设最大值等于a[0],然后与数组中其他数比较大小,如果有比其大的,就把那个数赋值给所设的最大值,直到得到真的最大值。
在作业三中,第一题找最值的方法与作业二一样,主要是交换数组中的数的时候,要记得把循环里的那个i(i为数组的下标)赋值给一个新设的变量,要不然在做题的时候,i值是会随着i++增大的;第二题就是选择排序法,选择排序法是什么,怎么做详见算法。
在作业四中,我通过网上查找,新学了一个函数。就是strlen(),这个函数的作用就是数出一个字符串中有几个字符,还有strcpy(s,t)是把t的字符串复制到s中,这个不能弄颠倒。
至于指针问题,就是在定义一个指针的时候是带星号的,以后单写字母就是指针,加星号的是指针所指向的地址所存储的值,还有就是数组a[]的a表示数组第一个元素的地址,a[i]还可以写成*(a+i),另外要注意的是a=a+1是错误的,要想这样写,可以把a赋值给一个新的指针p,再p=p+1。
另外其实我有很多不会的,具体也说不出来个一二三,每次都是通过做题来补充自己。

2、将PTA作业的源代码使用git提交到托管平台上。

(1)提交证明:






(2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git

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

1、董雅洁:http://www.cnblogs.com/exo123/p/8575595.html
2、丰大为:http://www.cnblogs.com/DavidPark/p/8551402.html
3、徐铭博:http://www.cnblogs.com/xmb1547828350/p/8597402.html

4、学习进度表


IT小白
原文地址:https://www.cnblogs.com/jsjyys/p/8589997.html