第一次作业
题目
1.证明P++等价于(p)++还是等价于*(p++)?
#include <stdio.h>
int main()
{
int a=5;
int *p=&a;
printf("p=%d\n",p); //p=6487620
printf("p++=%d\n",p++); //p++=6487620
p=&a;
printf("(p)++=%d\n",(p)++); //(p)++=6487620
printf("*(p++)=%d\n",*(p++)); //*(p++)=6487628
}
2 题目6-1 计算两数的和与差
(1) 实验代码
#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;
}
(2) 设计思路
主要描述题目算法
第一步:由题可得,形参和实参相关联,故若求两数之和就直接进行形参相加;
第二步:求两数之差的原理和求和原理相似;
(3)本题调试过程中碰到的问题及解决方法
本题没有问题。
题目6-2拆分实数的整数与小数部分
(1)实验代码
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-(int)x;
}
(2)设计思路
主要描述题目算法
第一步:求整数,就直接用int强转即可;
第二步:求小数部分,就是用原数减去整数部分即可;
(3)本题调试过程中碰到的问题及解决方法
本题没有问题
题目6-3在数组中查找指定元素
(1)实验代码
int search( int list[], int n, int x )
{
int i,index;
for(i=0;i<n;i++)
{
if(list[i]==x)
{
index=i;;
break;
}else
{
index=-1;
}
}
return index;
}
(2)设计思路
第一步:首先定义一个循环变量;
第二步:要查找指定元素,就遍历数组,再用if条件进行判断;
流程图
(3)本题调试过程中碰到的问题及解决方法
开始用的是continue而不是break,发现只需要直接结束循环就能实现找到元素,所以最后修改成了break。
6-4找最大值及其下标
(1)实验代码
int fun(int *a,int *b,int n)
{
int i;
for(i=0;i<n;i++)
{
if(a[i]>*a)
{
*a = a[i];
*b = i;
}
}return *a;
}
(2)设计思路
第一步:先定义循环变量;
第二步:遍历数组并用if条件进行判断;
流程图:
(3)本题调试过程中碰到的问题及解决方法
本题没有问题;
6-5最小数放前最大数放后
(1)实验代码
#include<stdio.h>
void input(int *arr,int n)
{
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
}
void max_min(int *arr,int n)
{
int j=0,x=0,y=n-1;
for(j=0;j<n;j++)
{
if(arr[x]>arr[j])
{
int t;
t=arr[x];
arr[x]=arr[j];
arr[j]=t;
}
}
for(j=n-1;j>0;j--)
{
if(arr[y]<arr[j])
{
int k;
k=arr[y];
arr[y]=arr[j];
arr[j]=k;
}
}
}
void output(int *arr,int n)
{
int a=0;
for(a=0;a<n;a++)
{
printf("%3d",arr[a]);
}
}
(2)设计思路
第一步:本题有三个接口,第一个是数组存入;
第二步:第二个接口就是进行题目要求的进行操作,首先用遍历的方法进行找最小值,并把它放到第一位,之后再找最大值放到最后一位;
第三步:第三个接口,把数组输出;
流程图:
(3)本题调试过程碰到问题及解决办法
本题没有问题;
6-6指针选择法排序
(1)实验代码:
void sort(int *x,int n){
int i,j,t;
for(j=1;j<10;j++)
{
for(i=0;i<10-j;i++)
{
if(*(x+i)<*(x+i+1))
{
t=*(x+i);
*(x+i)=*(x+i+1);
*(x+i+1)=t;
}
}
}
}
(2)设计思路
第一步:本题和上学期学过的冒泡排序和选择排序法相似,就是在加上指针。其实和上学期大同小异。
第二步:进行冒泡排序之后再返回结果;
流程图:
(3)本题调试过程碰到问题及解决办法
本题没有问题,和上学期的内容较为相似;
6-7判断回文字符串
(1)实验代码
bool palindrome( char *s )
{
int i=0,j=0,result=1;
char *b = s;
for(;*b != '\0';b++) {
i++;
}
for(; *s != '\0';s++,j++) {
if(*(s) != *(b-j-1)) {
result = 0;
}
}
return result;
}
(2)设计思路
第一步:回文判断原理就是关于中心字母左右对称;
第二步:根据上述原理,首先定义两个变量,之后遍历数组,再进行以中心为轴左右进行对比;
第三步:在对比过程中,若有不相同即跳出判断不是回文,反之为回文;
流程图
(3)本题调试过程碰到问题及解决办法
6-8使用函数实现字符串部分复制
(1)实验代码
void strmcpy( char *t, int m, char *s )
{
int i = 0;
char *b = t;
for(;*b!='\0';b++) {
i++;
}
if(m>i) {
*s='\0';
} else {
for(;*t!='\0';s++,t++)
*s = *(t+m-1);
}
*s = '\0';
return 0;
}
(2)设计思路
第一步:首先把已知字符数组给空数组;
第二步:之后再根据题目要求之后再进行赋值操作;
(3)本题调试过程碰到问题及解决办法
这个题是在网上查找答案因为自己不会做,看了很多遍也自己打了很多遍,所以没有问题。
作业要求三
(1)总结两周所学的知识点有哪些学会了?哪些还没有学会?
这两周主要学习了指针的用法和作用,最主要应该掌握的应该是指针在数组中的运用,而且函数调用在指针的用法中也尤为主要,上学期字符的应用自己掌握的不是很好,需要多多看书并且多加练习。
(2)PTA作业源代码上传Git
Git超链接:
地址
上传截图:
(3)点评3位同学本周作业,并邀请3位同学点评作业
(4)表格和折现图记录学习情况
表格:
折线图: