第1次作业

Posted 无药了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第1次作业相关的知识,希望对你有一定的参考价值。

作业要求二

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

6-1 计算两数的和与差

本题要求实现一个计算输入的两数的和与差的简单函数。

代码如下:

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

指针在题目中的作用:

    op1代表a,op2代表b,*psum代表sum,*pdiff代表diff。

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

本题要求实现一个拆分实数的整数与小数部分的简单函数。

代码如下:

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

指针在题目中的作用:

    x为输入数,*intpart取x整数部分,*fracpart取输入数减整数的部分(也就是小数部分)。

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

6-1 在数组中查找指定元素

本题要求实现一个在数组中查找指定元素的简单函数。

代码如下:

`int search(int list[], int n, int x ){
int i,index;
for(i=0;i<n;i++)
{
    if(list[i]==x){
	    index = i;
	    break;
    }else{
      index = -1;
    }
} 
 return index;
}`

(1)主要描述题目算法

     第一步:声明函数
     第二步:定义两个变量
     第三步:规划循环判断数组中有无指定函数
     第四步:返回原函数

(2)流程图

错误信息:

   错误原因:一开始找到相等函数的时候忘记在index=i之后加入break导致循环继续答案错误。
   改正方法:在index=i;之后加入break。

6-2 找最大值及其下标

在一维整型数组中找出其中最大的数及其下标。

代码如下:

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

(1)主要描述题目算法

     第一步:声明函数
     第二步:定义一个变量
     第三步:规划循环判断数组中前一个数是否比后一个大
     第四步:是就交换然后记下下标
     第五步:返回原函数

(2)流程图

错误信息:

   错误原因:最初的时候不知道输出什么好,所以写了return *a和return *b,结果答案错误。
   改正方法:咨询了室友之后,室友告诉我只需要输出return *a就行,我问了室友原因室友也不知道,希望老师解答一下。

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

6-1 最小数放前最大数放后

为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换;输出数组元素。

代码如下:

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

(1)主要描述题目算法

     第一步:声明第一个函数
     第二步:输入数组中所有的数
     第三步:返回原函数
     第四步:声明第二个函数
     第五步:找出最小的数并记下下标
     第六步:交换最小数
     第七步:找出最大的数并记下下标
     第八步:交换最大数
     第九步:返回原函数
     第十步:声明第三个函数
     第十一步:输出数组中所有的数
     第十二步:返回原函数

(2)流程图

错误信息:

   错误原因:一开始我写成了 min=*(arr+i); *arr=min; 只是一开始的值变成了最小值或最大值,并没有交换,结果答案错误。
   改正方法:经过的DEV C++运行之后我发现了问题定义了新的变量来表示指针,然后进行了交换的三行代码,答案正确。

6-2 指针选择法排序

指针选择法对10个数进行由大到小的排序。

代码如下:

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

(1)主要描述题目算法

     第一步:声明第一个函数
     第二步:定义三个变量
     第三步:确定一共循环几次
     第四步:第一个数与后面的数比较排序然后第二个数依此循环
     第五步:返回原函数

(2)流程图

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

6-1 判断回文字符串

本题要求编写函数,判断给定的一串字符是否为“回文”。

代码如下:

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

(1)主要描述题目算法

     第一步:声明第一个函数
     第二步:定义两个变量
     第三步:数清楚一共几个字符
     第四步:判断第一个数与最后一个数是否一样
     第五步:循环
     第六步:返回原函数

(2)流程图

错误信息(1):

   错误原因:忘记了strlen函数导致忘记取字符串字符的数量。
   改正方法:写入strlen函数。

错误信息(2):

   错误原因:开始我写的是
if(s[i]!=s[j]) break; if(i>j) return ture; return no;
造成的错误就是忽略了只有两个字符的情况。
   改正方法:
if(*(s+i)!=*(s+j)) { return false; } if(i>=j) return true;
对于这种情况进行了分别的讨论。

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

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

代码如下:

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

(1)主要描述题目算法

     第一步:声明第一个函数
     第二步:数清楚一共几个字符
     第三步:判断是否有意义
     第四步:如果有意义让字符串t从第m个字符开始的全部字符复制到字符串s
     第五步:最后加入\'\\0\'
     第七步:如果没意义直接让字符串s变为\'\\0\'
     第八步:返回原函数

流程图

错误信息:

   错误原因:一开始写的是 t[i]!=\'\\0\' 忘记了i的取值一开始是m结果编译错误。
   改正方法:改为 t[i-m]!=\'\\0\'

附加题

小写字母y变换为a,小写字母z变换为b,其他字母变换成为该字母ASCII码顺序后2为字母

代码如下:

`#include<stdio.h>
void mima( char *s );
int main ()
{
    char a[20];
    gets(a);
    mima(a);
    printf("%s",a);
    return 0;
} 

void mima( char *s ){
    int i;
    for(i=0;*(s+i)!=\'\\0\';i++)
    {
	    if(*(s+i)==\'y\'){
		    *(s+i)=\'a\';
	    }else if(*(s+i)==\'z\'){
		    *(s+i)=\'b\';
	    }else{
		    *(s+i)=*(s+i)+2;
	    }
    }
} `

(1)主要描述题目算法

     第一步:输入字符串
     第二步:声明函数
     第三步:循环判断是否为y,z
     第四步:如果为y则变为a,如果为z则变为b,如果都不是则加2
     第五步:返回原函数
     第七步:输出字符串

结果图

流程图

作业要求三

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

在所在的两个周,我们主要先复习了上半学期的主要知识,然后对于指针以及针对于一般变量、数组与字符变量代替,和指针在函数中的应用。更是学习了指针的理论知识和它所注意的事情。
主要没有搞清楚还有三点,一是对于字符变量还是略有生疏经常忘记 t[i]!=\'\\0\' 需要 i=0 要让初始量为零;二是对于"strcpy"、"strcat"、"strcmp"的应用还是不太明白:三是希望老师解答一下C高级第一次PTA作业(2)6-2 找最大值及其下标中我的错误。

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

git地址:https://git.coding.net/wuyaole/dayixiagxueqi01.git
截图

3、点评作业

高立彬
丰大为
于耀淞

4、用表格和折线图呈现本周(3/12 8:00~3/26 8:00)的代码行数和所用时间、博客字数和所用时间


以上是关于第1次作业的主要内容,如果未能解决你的问题,请参考以下文章

第八次团队作业:汇总博客

软件工程(2018)第二次结对作业

第1次作业+105032014158

第1次作业 105032014125

第1次作业+105032014070

第八次团队作业:汇总博客