,题目6-1(1)
设计思路;首先使用题目中所给函数,题目让求出所给2数的和与差,使用函数中定义的2个指针变量,使用简单2个式子算出和与差值。
指针在该题目中的作用是指向sum和deff2个整型变量的地址,指针变量就等于他所指向的变量的值。
`
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
The diff is %.2f
", sum, diff);
return 0;
}
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2;
*pdiff=op1-op2;
}
`
题目6-2(1)
设计思路:首先使用题目所给函数,将所给的数值定义为整形变量可得出所求的整数部分,再用原数值减去整数部分即为所求的小数部分。
指针在该函数中用于将值传递回他所指向的变量。
`
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
", intpart);
printf("The fractional part is %g
", fracpart);
return 0;
}
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
`
题目6-1(2)
设计思路:使用题目所给函数,先定义一个整形变量I,使用for循环,令其遍历整个数组,在遍历过程中使用if语句进行判断是否有所要查找的元素。
当在数组中找到所要查找的元素时,令index等于当前循环数,并用break跳出,如果找不到则令index为-1,结束循环后返回index值
流程图:
`
#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
", index);
else
printf("Not found
");
return 0;
}
int search( int list[], int n, int x )
{
int i, index;
for(i = 0;i < n;i++ )
{
if(x==*(list+i) )
{index = i;
break;}
else{
index = -1;}
}
return index;
}
`
遇到的问题:这道题在写的时候由于在最初没有添加break导致程序无法得到正确的结果,后来在分析的时候发现for循环需要跳出于是添加了break。
题目6-2(2)
设计思路:通过所给函数可知,题目已经数组下标和所含元素的个数。先使用一个for语句对数组进行遍历,在遍历的过程中使用一个if语句判断所有遍历的元素与a[I]谁大谁小。若a[I]小于遍历数据则将a[I]赋给max,并将其下标赋给*b,函数返回max值。
流程图:
`
#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
",max,p);
return 0;
}
int fun(int *a,int *b,int n)
{
int i = 0,max = *a;
for(i = 0;i < n;i++)
{
if(max<*(a+i))
{
*b = i;
max = *(a+i);
}
}
return max;
}
`
遇到的问题:在定义max = a语句时产生了困扰但经过思考理解了。
题目6-1(3)
设计思路:本题目给出了三个函数,通过观察三个函数可以确定程序的大体流程,在第二函数使用for循环遍历整个数组,并使用if语句判断所遍历的数据与最大最小值的关系,若大于最大值便将下角标赋给idx,判断idx是否为0,若不等于将(a + idx)与*(a+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 t,i,idx=0;
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));
}
}
`
遇到的问题:这道题在使用算法对数组进行遍历之后无法正确的找出最大最小值并将他们置于头和尾,后来在同学建议下使用了一个index进行指引成功得出结果,
题目6-2(3)
设计思路:从给出函数可知x为指针数组,n为元素个数,先用一个for循环表示所循环次数,再使用for循环遍历数组之后使用冒泡进行排序。
void sort(int *x,int n) { int i,min=n-1,k; for(i=0;i<n;i++) { if(x[min]>x[i]) { k=x[min];x[min]=x[i];x[i]=k; } } if(n>0) { n--; sort(x,n); } }
流程图:
题目6-1(4)
设计思路:通过观察主函数有输入输出部分,且主函数需要有返回值,首先定义一个数n用于记录字符串长度,通过判断s[I]和s[I+1}的大小判断是否回文
bool palindrome( char *s ) { int i=0,n=0; for(;s[i]!=' ';i++) n++; for(i=0;i<=(n/2);i++) { if(s[i]!=s[n-i-1]) return 0; } return true; }
流程图:
题目6-2(4)
设计思路:通过观察可知本题要求将字符串t从字符m开始全都复制到字符串s上。首先将数组s初始化为空串,定义字符长度为n,判断m与n的关系确定s是否为空字符串,若不是空串将t[I]赋给s[I+1-m}
`
void strmcpy( char t, int m, char s )
{
s=NULL;
int i,n=1;
for(i=0;(t+i)!=' ';i++)
n++;
if(m>=n)
*s=NULL;
else
{
for(i=m-1;i<=n-1;i++)
s[i-m+1]=t[i];
}
}
`
流程图:
三。
在本周的学习中,我回顾了上学期所学的一些知识,并加强了对这些知识的运用,并在新的学习中了解了指针的含义和一些应用,比如指针可以代替数组,但在字符串和回文的学习处还有1一定程度的模糊。但我对指针的运用还不是非常的好,可以说很不熟练,可以说我还需要进一步加强对这部分知识的运用
点评三位同学的作业:
`
http://www.cnblogs.com/ryo-/p/8644256.html
http://www.cnblogs.com/DavidPark/p/8551402.html
http://www.cnblogs.com/shilcz/p/8611461.html