2018第一次作业

一:PTA

1.计算两数的和与差

(1).设计思路

主要描述题目算法

第一步:观察函数定义
第二步:进行加减运算过程

(2).实验代码

`
#include <stdio.h>

void sum_diff( float op1, float op2, float *psum, float *pdiff );

int main()
{
float a, b, sum, diff;

scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);

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

(3).遇到的问题及解决方法

开始指针忘记加*,加上后答案正确。

2.拆分实数的整数与小数部分

(1).设计思路

主要描述题目算法

第一步:观察函数定义。
第二步:将整数部分赋值给int型传入数据,之后用float型传入数据减去整数部分得出小数部分。

(2).实验代码

`
#include <stdio.h>

void splitfloat( float x, int *intpart, float *fracpart );

int main()
{
float x, fracpart;
int intpart;

scanf("%f", &x);
splitfloat(x, &intpart, &fracpart);
printf("The integer part is %d\n", intpart);
printf("The fractional part is %g\n", fracpart);

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

(3).遇到的问题及解决方法

本题没有遇到问题。

3.在数组中查找指定元素

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:判断遍历数字是否与查找数字相同,如果相同index=i,并跳出循环,不相同则等于-1,直到循环结束,返回index的值。

2).流程图

(2).实验代码

 `#include <stdio.h>
#define MAXN 10

int search( int list[], int n, int x );

int main()
{
int i, index, n, x;
int a[MAXN];

scanf("%d", &n);
for( i = 0; i < n; i++ )
    scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
    printf("index = %d\n", index);
else
    printf("Not found\n");

return 0;
}
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;
}
`

(3).遇到的问题及解决方法

开始将return放进了循环中导致程序不能结束,改正后答案正确。

4.找最大值及其下标

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用if语句判断遍历数与a[i]的大小,如果a[i]小于遍历数则把a[i]赋值给max,其下标存到指针b所指变量,函数返回最大值。

2).流程图

(2).实验代码

`
#include<stdio.h>
#define N 10
int fun(int *a,int *b,int n);
int main()
{ int a[N],i,max,p=0;
for(i=0;i<N;i++) scanf("%d",&a[i]);
 max=fun(a,&p,N);
 printf("max=%d,position=%d\n",max,p);
 return 0;
}
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;
}
`

(3).遇到的问题及解决方法

本题没有问题。

5.最小数放前最大数放后

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用if语句比较当前数与最小值的大小,如果大于最大值则将数组下标赋值给idx,判断idx是否为0,如不等于0则将a[idx]与a[0]调换。

2).流程图

(2).实验代码

`
#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ int a[10];
input(a,10);
 max_min(a,10);
 output(a,10);
 return 0;
}
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));
    }   
}
`

(3).遇到的问题及解决方法

arr[i]与arr[idx]比较大小时符号错误,改正后答案正确。

6.指针选择法排序

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用for循环遍历数组,用if语句判断遍历数与后一个数的大小,若后一个数大于遍历数则两数交换。

2).流程图

(2).实验代码

`
#include<stdio.h>
void sort(int *x,int n);
int main ( )
{int *p,i,a[10];
 p=a;
 for (i=0;i<10;i++)  scanf("%d",p++);
     p=a;
 sort(a,10);
 for(i=0;i<10;i++)  printf("%4d",*p++);
 printf("\n");
 return 0;
 }    
 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;}
 }
`

(3).遇到的问题及解决方法

本题没有问题。

7.判断回文字符串

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:用for循环便利数组,用if语句判断相应字符是否相等,若相等则k加一,否则返回false,之后判断k是否等于n,相等则返回true。

2).流程图

(2).实验代码

`
#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
    char s[MAXN];

    scanf("%s", s);
    if ( palindrome(s)==true )
        printf("Yes\n");
    else
        printf("No\n");
    printf("%s\n", s);

    return 0;
}
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;
 }

  }
`

(3).遇到的问题及解决方法

开始误将k与n的比较放入for循环中,导致程序错误,放到循环外后答案正确。

8.使用函数实现字符串部分复制

(1).设计思路

1).主要描述题目算法

第一步:观察函数定义。
第二步:先求出长度n,之后判断m与n的大小,若m>n则返回空数组,否则用for语句遍历,将数组t的第m个开始的元素数值赋值给数组s,最后一个地址填入'/0'。

2).流程图

(2).实验代码

`
#include <stdio.h>
#define MAXN 20

void strmcpy( char *t, int m, char *s );
void ReadString( char s[] );

int main()
{
    char t[MAXN], s[MAXN];
    int m;

    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);

    return 0;
 }
 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';
}
  }
`

(3).遇到的问题及解决方法

if语句条件开始写错,且‘\0’表示错误,修改后正确。

9.额外加题3

(1).设计思路

1).主要描述题目算法

第一步:获取字符串并传入函数。
第二步:用for语句遍历,用if语句判断遍历字符是否为y,z,若不是则码值加二,若是则分别变为a,b。

2).流程图

3).运行结果

(2).实验代码

`
#include<stdio.h>
#define max 100
void jiami(char *);
int main()
{
    char name[max];
    gets(name);
    jiami(name);
    printf("%s",name);
    return 0;  
}
void jiami (char *s)
{
    for(;*s!='\0';s++)
    {
        if(*s=='z'){
            *s='b';
        }else if(*s=='y'){
            *s='a';
        }else{
            *s=*s+2;
        }
    }
} 
`

(3).遇到的问题及解决方法

本题没有问题。

二:学习总结和进度

1.学习内容

这两周所学知识对我来说比较困难,目前只了解了指针和字符串的基本知识,对这部分的知识还需要花费时间去练习。

2.git

https://coding.net/u/q807443119/p/zuoye/git/commit/ee2eff4fcacf5e380ffed10735d6d02a7ffe31bb?public=true

3.点评

丰大为 http://www.cnblogs.com/DavidPark/p/8551402.html
高立彬 http://www.cnblogs.com/gao628526/p/8551285.html
班庆泽 http://www.cnblogs.com/wsbqz/p/8641741.html

4.学习进度

posted @ 2018-03-25 20:39  顾家玮  阅读(316)  评论(8编辑  收藏  举报