题目6-1 计算两数的和与差
1 设计思路
(1)主要描述题目算法
第一步:psum为sum的地址,pdiff为diff的地址,形参op1、op2接受到实参a,b传来的值。
第二步:根据题意进行赋值。
2.实验代码
void sum_diff( float op1, float op2, float *psum, float *pdiff ) { *psum=op1+op2; *pdiff=op1-op2; }
(2) 本题调试过程碰到问题及解决办法
无。
题目6-2 拆分实数的整数与小数部分
1 设计思路
(1)主要描述题目算法
第一步:因为输入的数据为浮点型,强制转换x为整型,赋值给*intpart,*intpart的值为整数部分。
第二步:x减去*intpart为小数部分。
2.实验代码
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
(2) 本题调试过程碰到问题及解决办法
无。ps:原先定义了一个变量y用来存放强制转换x后的值,发现是多此一举。
题目6-3 在数组中查找指定元素
1 设计思路
(1)主要描述题目算法
第一步:定义变量flag=0用来标记,count用来存放指定元素的最小下标,用for循环和if语句一个一个的查找,找到了指定元素就令flag=1。
第二步:判断flag是否为0(没找到),真的就令count=-1。
第三步:返回count的值。
2.实验代码
int search( int list[], int n, int x ) { int count,j,flag=0; for(j=0;j<n;j++) { if(list[j]==x) { count=j; flag=1; } }
if(flag==0) count=-1;
return count; }
(2) 本题调试过程碰到问题及解决办法
无。
3.流程图
题目6-4 找最大值及其下标
1 设计思路
(1)主要描述题目算法
第一步:定义变量MAX,MAX存放数组第一个的值。
第二步:运用for循环比较,如果后一个的值大于MAX,就交换,下标存到指针b所指的变量里,进行下一次比较。
第三步:返回MAX的值。
2.实验代码
int fun(int *a,int *b,int n) { int j,MAX; MAX=a[0];
for(j=1;j<n;j++) { if(MAX<*(a+j)) { MAX=*(a+j); *b=j; } } return MAX; }
(2) 本题调试过程碰到问题及解决办法
错误原因:写这个程序时还不怎么会用指针,导致答案错误。
改正方法:去看了书上数组与指针那一章的几个例题。
3.流程图
题目6-5 最小数放前最大数放后
1 设计思路
(1)主要描述题目算法
第一步:运用for循环输入数组的值。
第二步:运用for循环找出最小的数的下标,再用if语句判断它是不是第一个数,不是就与第一个数进行交换。同理找出最大的数,然后交换。
第三步:输出数组元素。
2.实验代码
void input(int *arr,int n) { int i; for(i=0;i<n;i++) { scanf("%d",arr++); } } void max_min(int *arr,int n) { int j,index=0,t,flag=0; for(j=1;j<n;j++) { if(*(arr+j)<*(arr+index)) index=j; } if(index!=0) { t=*arr;*arr=*(arr+index);*(arr+index)=t; } for(j=1;j<n;j++) { if(*(arr+j)>*(arr+flag)) flag=j; } if(flag!=0) { t=*(arr+n-1);*(arr+n-1)=*(arr+flag);*(arr+flag)=t; } } void output(int *arr,int n) { int k; for(k=0;k<n;k++,arr++) { printf("%3d",*arr); } }
(2) 本题调试过程碰到问题及解决办法
无。
3.流程图
题目6-6 指针选择法排序
1 设计思路
(1)主要描述题目算法
第一步:用外循环控制趟数,n个数选n-1趟,假设当前趟的第一个数为最值,记在k中 。
第二步:再用for循环从下一个数到最后一个数之间找最值,若其后有比最值更大的,则将其下标记在k中。
第三步:若k不为最初的i值,就交换。
2.实验代码
void sort(int *x,int n) { int i,t,k,j; for(i=0;i<(n-1);i++) { k=i; for(j=i+1;j<n;j++) { if(*(x+j)>*(x+k)) { k=j; } } if(i!=k) { t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; } } }
(2) 本题调试过程碰到问题及解决办法
因为以前做过此题,所以没有问题。
3.流程
题目6-7 判断回文字符串
1 设计思路
(1)主要描述题目算法
第一步:用while循环语句判断字符串数组有多少个字符。
第二步:定义变量j,从后往前与从前往后比较字符,不相等就跳出循环。
第三步:比较j和i的大小,j大于i返回真,j小于i返回假。
2.实验代码
bool palindrome( char *s ) { int i=0,j=0; while(*(s+i)!=' ') { i++; } i--; for(;j<=i;i--,j++) { if(*(s+i)!=*(s+j)) { break; } } if(j>i) return 1; else return 0; }
(2) 本题调试过程碰到问题及解决办法
老师上课讲过此题,所以并无问题。
3.流程图
题目6-8 使用函数实现字符串部分复制
1 设计思路
(1)主要描述题目算法
第一步:用while循环语句判断字符串数组有多少个字符。
第二步:判断m是否超过输入字符串的长度,是结果字符串应为空串,不是,定义一个变量i和j,i从m-1个字符开始赋值给j=0时的新字符数组。
第三步:令最后一个字符数组的值为' '。
2.实验代码
void strmcpy( char *t, int m, char *s ) { int i,j=0; while(*(t+i)!='