第一次作业

题目6-1 计算两数的和与差

1.设计思路.
第一步:输入俩个实数.
第二步:将俩个实数的和的值赋给指针psum所指的变量sum,将俩个实数的差的值赋给指针pdiff所指的变量diff.
第三步:输出.
2.实验代码

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

3.错误信息:答案错误.
错误原因:未将和指向指针而是直接指向的变量sum.
改正方法:将指向和改为指针psum.

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

1.设计思路
第一步:输入X.
第二步:利用int使x强转为整数并将值指向指针intpart所指变量intpart输出.
第三步:用x减去强转的x这样就能留下小数部分,并将值付给 指针fracpart所指变量fracpart输出 .
2.实现代码

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

3.暂无错误

题目(2)6-1 在数组中查找指定元素

1.设计思路
第一步:传入数组,数组个数n,及所找值.
第二步:利用for循环判断数组里第几个数和所找值相等,
第三步:如果相等则返回索引值,如果不等则返回-1
流程图

2.实验代码

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

错误信息:.答案错误
错误原因:if当中等号只用了一个
改正方法:将if中等号改成"=="

题目(2)6-2 找最大值及其下标

1.设计思路
第一步:令最大值max等于第一个数a0;
第二步:利用for循环判断数组里是否有大于max的数,如果有则把值赋给max
第三步:如果数组中没有比max大的数,则直接返回max.
流程图

2.实验代码

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

3.错误信息:答案错误
错误原因:在判断时输入的并非指针a+i而是直接输入的a[i];
改正方法:将a[i]改成*(a+i)

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

1.设计思路
第一步:输入数组arr
第二步:令最大值max和最小值min都等于数组第一个元素.
第三步:判断数组中是否有比max大的数,如果有则把这个数赋值给max,并记录下下标.同理判断是否有比min小的数,并赋值记录下标.
第四步:定义俩个变量,使记录下的下标最大值最小值和第一个数和最后一个数交换
第五步:三列输出数组arr
流程图

2.实验代码

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

错误信息:部分正确.
错误原因:交换时忽略了第一位元素数值为0
改正方法:将数组最后一位定义为arr+i-1

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

1.设计思路
第一步:定义俩个for循环.并将数组第一个元素小标0定位最大值
第二步:判断数组中是否存在比arr+max大的数,如果有则记录他的小标,并将小标赋值给max.
第三步:在for循环里判断数组小标和最大值max小标是否相同,如果不同,则交换俩数的小标
流程图

2.实验代码

void sort(int *x,int n)
 {
     int i = 0, j = 0, tmp = 0, max = 0;
     for(i = 0;i < n-1;i++)
     {
         max = i;
         for(j = i;j < n;j++)
         {
             if(*(x+max)<*(x+j)){
                max = j;
             }
         }
         if(max != i){
                        tmp = *(x+max);
                        *(x+max) = *(x+i);
                        *(x+i) = tmp;
         }
     }
 }

错误信息:部分正确
错误原因:未判断max!=i的情况
改正方法:在for循环里多了个判断是否!=的情况.

题目(4)6-1 判断回文字符串

1.设计思路
第一步:将数组长度定义为n
第二步:利用一个for循环,循环停止条件是n/2
第三步:判断数组第一个和最后一位是否相等,以此类推.如果相等则返回true,如果不等则返回false.
流程图

2.实验代码

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

错误信息:部分正确
错误原因:未定义数组s的长度.且for循环结束条件不对
改正方法:利用strlen定义数组长度,并将条件改为n/2

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

1.设计思路
第一步:输入for循环,让i=m,并且结束条件为最后一位是'\0'结束符.
第二步:将数组t的第m位赋值给数组s从后往前数第m位
第三步:在结束之后给数组s添加一个结束符
流程图

2.实验代码

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

错误信息:答案错误
错误原因:未考虑数组s结束时的结束符
改正方法:在最后加上数组s的结束符.

附加题
1.设计思路
第一步:定义字符串数组并输入.
第二步:判断数组里的字母,如果有y则用a替换,如果有z则用b替换,其余的变换成为该字母ASCII码顺序后2为字母
第三步:输出

2.实验代码

	#include<stdio.h>
	#include<stdlib.h>
	int main()
	{
	char str[1000];
	int i;
	scanf("%s",&str);
	for(i=0;str[i] !='\0';i++)
	{
		if(str[i]=='y')
		{
			str[i]='a';
		}else if(str[i]=='z')
		{
			str[i]='b';
		}else{
			str[i]=str[i]+2;
		}
		
	}
	printf("%s",str);
	}

错误提醒:答案错误
错误原因:在for循环时,结束条件判断错误
改正方法:把等于变成不等于

学习总结

1.这俩周主要学习了指针的运用,*号的作用及调用函数的知识,指针运用灵活,简化了步骤,不过容易把指针和变量搞混
2.
3.
http://www.cnblogs.com/748luwenqi/p/8645546.html
http://www.cnblogs.com/cty-1/p/8594997.html
http://www.cnblogs.com/chenxidream/p/8597160.html
4.

posted on 2018-03-25 18:17  曹佰强  阅读(145)  评论(4编辑  收藏  举报

导航