第一次作业
题目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.