2018上C语言程序设计(高级)作业- 第1次作业
作业要求一 :
作业要求二:
·题目6-1 计算两数的和与差
1.设计思路
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题需要实现一个计算输入的两数的和与差的简单函数。
第二步:由主函数知,op1和op2(形参)是输入的两个实数,指针数据*psum,*pdiff(形参)表示输出的结果。
第三步:根据加减运算即可得出结果。
(2)流程图:
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.本题调试过程碰到问题及解决办法
错误原因:对函数调用的一些基础知识遗忘。
改正方法:查看课本,找到正确的表达方式。
·题目6-2 拆分实数的整数与小数部分
1.设计思路:
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题要求实现一个拆分实数的整数与小数部分的简单函数。
第二步:由于输入的实数是小数,要将其拆分出整数部分就需要进行强制转换,再用该数减去整数部分,就是小数部分。
第三步:整数部分用指针变量*intpart表示,小数部分用*fracpart表示。
(2)流程图:
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=(int)x; *fracpart=x-*intpart; }
3.本题调试过程碰到问题及解决办法
错误原因:将赋值变量的方向弄反了。
改正方法:看到提交时的错误提醒后修改。
·题目6-1 在数组中查找指定元素
1.设计思路
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题要求实现一个在数组中查找指定元素的简单函数。
第二步:在函数调用里,将实参的值传递给形参(a→list[])
第三步:通过if 循环语句依次查找元素,如果找到则输出该元素及对应位次,若没找到,则返回-1或输出Not Found
(2)流程图:
主函数:
调用函数 splitfloat:
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 j,m=-1; for(j=0;j<n;j++) { if(x==list[j]) { m=j; break; } } return(m); }
3.本题调试过程碰到问题及解决办法
错误:break的位置放错了
错误原因:对break的运用不熟练,导致程序运行出现问题
改正方法:仔细看了课本关于break的运用方法,又询问同学做了改正。
·题目6-2 找最大值及其下标
1.设计思路
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题要求实现在一维整型数组中找出其中最大的数及其下标。
第二步:定义一个长度为10的数组,用j记录最大值对应的下标(转换成指针),a[j]就是最大值
第三步:将最大值与每个元素依次进行比较,输出最大值及下标。
(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 m=a[0]; int j; for(j=0;j<n;j++) { if(m<a[j]) { m=a[j]; *b=j; } } return (m); }
3.本题调试过程碰到问题及解决办法
错误原因:函数调用结束时应该返回return (m),却写成return 0.
改正方法:在函数里不应该是return 0,而应该是返回调用该函数的值。
题目6-1 最小数放前最大数放后
1.设计思路
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题要求实现为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换;输出数组元素。
第二步:先定义一个数组,对数组的各个元素赋值。定义最大值max和最小值min和两个变量q,g,
第三步:将最大值和和数组最后一个元素交换,最小值和首元素交换,输出数组的每一个元素。
(2)流程图:
主函数:
调用函数input:
调用函数max_min:
调用函数output:
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 min=arr[0],max=arr[0]; int i,temp; int q=0,g=0; for(i=0;i<n;i++) { if(min>*(arr+i)) { min=*(arr+i); q=i; } if(max<*(arr+i)) { max=*(arr+i); g=i; } } temp=*(arr+0); *(arr+0)=*(arr+q); *(arr+q)=temp; temp=*(arr+n-1); *(arr+n-1)=*(arr+g); *(arr+g)=temp; } void output(int *arr,int n) { int i; for(i=0;i<n;i++) { printf("%3d",*(arr+i)); } }
3.本题调试过程碰到问题及解决办法
错误原因:printf("%d",*(arr+i));输出的格式不对。
改正方法:把%d改成%3d
题目6-2 指针选择法排序
1.设计思路
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题要求实现指针选择法对10个数进行由大到小的排序。
第二步:定义一个指针变量p循环变量i和一个数组。将数组首元素的地址赋值给指针变量p
第三步:使用选择排序法对数组进行从大到小的排序,输出数组元素。
(2)流程图:
主函数:
调用函数sort:
2.插入代码:
void sort(int *x,int n) { int i,m,k,t; for(i=0;i<n-1;i++) { k=i; for(m=i+1;m<n;m++) { if(*(x+k)<*(x+m)) { k=m; } } if(k!=i) { t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; } } }
3.本题调试过程碰到问题及解决办法
错误原因:判断大小的方向弄反了
改正方法:应该是if(*(x+k)<*(x+m))
题目6-1 判断回文字符串
1.设计思路
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题要求编写函数,判断给定的一串字符是否为“回文”。
第二步:定义字符数组s[20],输入字符串赋值给s
第三步:调用函数palindrome,判断字符数组第i个元素和第count-i-1个元素是否相等,如果不相等返回false,相等返回true。
(2)流程图:
主函数:
调用函数palindrome:
2.插入代码:
bool palindrome( char *s ) { int i,m; int count=0; count=strlen(s); m=count/2; for(i=0;i<m;i++) { if((*(s+i))!=(*(s+count-i-1))) { return(false); } } if(i==m) { return(true); } }
3.本题调试过程碰到问题及解决办法
错误原因:在if条件里没有对字符数组长度减一
改正方法:改成if((*(s+i))!=(*(s+count-i-1)))
题目6-2 使用函数实现字符串部分复制
1.设计思路:
(1)主要描述算法:
第一步:根据函数接口定义和要求可知本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
第二步:定义两个字符数组t[20],s[20],m,输入一个数赋给m。
第三步:调用函数strmcpy,并通过for循环条件,输出字符数组s
(2)流程图:
主函数:
调用函数strmcpy:
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'; }
3.本题调试过程碰到问题及解决办法
错误原因:终止符 \0 应该用单引号‘’
改正方法;改成'\0'
学习总结和进度
学习总结:
这两周学习了指针及其应用,包括它的含义,使用方式,还有数组指针和字符指针。我知道了在程序中 * 的用途,在定义指针变量和访问指针变量时,意义是不同的。还有在引用数组元素的时候,指针变量和数组之间相互转化。
但是对函数的掌握还是不熟练,对字符串与指针还是搞不清楚,尤其是最后一次的PTA,所以,还是要尽快熟练掌握。
代码地址:
https://git.coding.net/Aspirer1/c1.git
点评同学:
孙铭婧:http://www.cnblogs.com/sun031915/p/8644175.html
张心悦:http://www.cnblogs.com/zxy980612/p/8641661.ht
吴晓明:http://www.cnblogs.com/gu-an-cheng-wxm/p/8597592.html
学习进度: