作业要求一

附加题目

写程序证明P++等价于(p)++还是等价于*(p++)?

1.设计思路:

(1).题目算法描述

第一步:定义变量p并赋初值

第二步:分三次计算每次分别输出 p++,(p)++,*(p++)

(2).流程图

这是初次尝试的错误流程图 错误原因:①流程图不能是多个程序的,一个程序一个流程图②另外流程图也不会出现三个框并列执行的情况

修改后的流程图

2.实验代码

(1)

#include <stdio.h>
int main ()
{
int p=1; //printf("%d",p++);
//printf("%d",(p)++);
//printf("%d",*(p++)); return 0;
}

(2)

#include <stdio.h>
int main ()
{
int a=1;
int *p = &a; //printf("%d",p++);
//printf("%d",(p)++);
//printf("%d",*(p++)); return 0;
}

结论:

当p为int类型时p++与(p)++运算结果相同但是(p++)计算报错,错误信息如下



错误原因:
无效 ,没有定义指针变量 间接访问运算符无法正常使用

当p为指针类型时,可以确定p++与(p)++结果相同

说明:

第一部分:

6-1 计算两数的和与差(10 分)

本题要求实现一个计算输入的两数的和与差的简单函数。

函数接口定义:

void sum_diff( float op1, float op2, float *psum, float *pdiff );

其中op1op2是输入的两个实数,*psum*pdiff是计算得出的和与差。

裁判测试程序样例:

#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;
} /* 你的代码将被嵌在这里 */

输入样例:

4 6

输出样例:

The sum is 10.00
The diff is -2.00

1.设计思路:

(1).题目算法描述

根据题目中已经给出的代码部分可以看出,题目是想利用指针变量写一个计算和差的函数

第一步:构建函数框架

第二步:利用间接访问运算符操作计算变量的和与差

(2).流程图

2.实验代码

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum = op1 +op2;
*pdiff = op1-op2;
}

答案正确

6-2 拆分实数的整数与小数部分(15 分)

本题要求实现一个拆分实数的整数与小数部分的简单函数。

函数接口定义:

void splitfloat( float x, int *intpart, float *fracpart );

其中x是被拆分的实数(0≤x<10000),*intpart和*fracpart分别是将实数x拆分出来的整数部分与小数部分。

裁判测试程序样例:

#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;
} /* 你的代码将被嵌在这里 */

输入样例:

2.718

输出样例:

The integer part is 2
The fractional part is 0.718

1.设计思路:

(1).题目算法描述

第一步:利用强制类型转换将x强制转换成int类型得到x的整数部分,用间接访问运算符将值赋给integer

第二步:用x-integer便可得到x的小数部分,用间接访问运算符将值赋给fractional即可

(2).流程图

2.实验代码

void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart = (int)x;
*fracpart = x - *intpart;
}

答案正确

第二部分

6-1 在数组中查找指定元素(15 分)

本题要求实现一个在数组中查找指定元素的简单函数。

函数接口定义:

int search( int list[], int n, int x );

其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到

则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。

裁判测试程序样例:

#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;
} /* 你的代码将被嵌在这里 */

输入样例1:

5
1 2 2 5 4
2

输出样例1:

index = 1

输入样例2:

5
1 2 2 5 4
0

输出样例2:

Not found

1.设计思路:

(1).题目算法描述

第一步:遍历数组寻找给定的元素

第二步:如果找到给定的元素将下标返回

第三步:如果没有找到元素则返回-1

(2).流程图

2.实验代码

int search( int list[], int n, int x )
{
int i;
for(i = 0;i < n;i++)
{
if(list[i]==x){
return i;
}
}
return -1;
}

答案正确

6-2 找最大值及其下标(10 分)

在一维整型数组中找出其中最大的数及其下标。

函数接口定义:

int fun(int *a,int *b,int n);

其中形参abn都是用户传入的参数。函数fun的功能是在指针a所指向的一维数组中找出其中最大的数及其下标,下标存到指针b所指的变量里,函数返回最大值。

裁判测试程序样例:

#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;
} /* 请在这里填写答案 */

输入样例:

2 1 5 4 8 4 5 8 9 1

输出样例:

max=9,position=8

1.设计思路:

(1).题目算法描述

第一步:定义变量i max,并将数组中第一个元素的值赋给max

第二步:遍历数组将数组中的每个元素与第一个元素进行比较

第三步:如果有比max大的,则将该元素的值赋给max

第四步:比max大的值的下标赋给*b

第五步:返回max

(2).流程图

2.实验代码

int fun(int *a,int *b,int n)//*a=a *b=&p下标 n=N;
{
int i = 0,max = *(a+1);
for(i = 1;i < n;i++)
{
if(*(a+i)>max){
max = *(a+i);
*b = i;
}
}
return max;
}

答案正确

第三部分:

6-1 最小数放前最大数放后(10 分)

为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换;输出数组元素。。

函数接口定义:

void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);

三个函数中的 arrn都是用户传入的参数。n 是元素个数。

input函数的功能是输入 n个元素存到指针arr所指向的一维数组中。

max_min函数的功能是求指针arr所指向的一维数组中的最大值和最小值,其中最小的数与第一个数对换,将最大的数与最后一个数对换。

output函数的功能是在一行中输出数组元素,每个元素输出占3列。

裁判测试程序样例:

#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ int a[10];
input(a,10);
max_min(a,10);
output(a,10);
return 0;
} /* 请在这里填写答案 */

输入样例:

5 1 4 8 2 3 9 5 12 7

输出样例:

1 5 4 8 2 3 9 5 7 12

1.设计思路:

(1).题目算法描述

①第一个函数

第一步:定义i

第二步:遍历数组将数组读入元素

②第二个函数

第一步:定义i,最大值最小值及其下标

第二步:遍历数组找最值

第三步:最值与首位值进行交换

③第三个函数

第一步:定义i

第二步:遍历数组输出元素

(2).流程图

2.实验代码

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 i = 0, max = *arr, min = *arr, t = 0, indexmax = 0,indexmin = 0;//indexmax和indexmin分别是最大值和最小值的下标
//遍历数组找最值
for(i = 0;i < n;i++)
{
if(*(arr+i)>max){
max = *(arr+i);
indexmax = i;
}
if(*(arr+i)<min){
min = *(arr+i);
indexmin = i;
}
}
//最值与首尾进行交换
t = *(arr+n-1);
*(arr+n-1)=max;
*(arr+indexmax) = t;
t = *arr;
*arr=min;
*(arr+indexmin) = t;
}
void output(int *arr,int n)
{
int i;
for(i = 0;i < n;i++)
{
printf(" %d ",*(arr+i));
}
}

3.错误信息

(1)第一次提交,错误提示为格式错误

纠错:

修改了第三个函数的输出缩进

printf(" %d",*(arr+i));

(2)第二次提交,仍然为格式错误

纠错:重新审题, 在一行中输出数组元素,每个元素输出占3列。

        错因每个输出的元素都带了两个空格,无论元素本身占几列都会带两列空格

再次修改输出缩进printf("%3d",*(arr+i));

(3)修改后的代码依然存在Bug当最大值在元素的首位时输出会混乱

纠错:使用两个for循环分两次遍历数组分别找出最大值最小值,以下是修改后的代码

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 i = 0, max = *arr, min = *arr, t = 0, indexmax = 0,indexmin = 0;//indexmax和indexmin分别是最大值和最小值的下标
//遍历数组找最大值
for(i = 0;i < n;i++)
{
if(*(arr+i)>max){
max = *(arr+i);
indexmax = i;
} }
//最大值与最后一个元素交换
t = *(arr+n-1);
*(arr+n-1)=max;
*(arr+indexmax) = t;
//遍历数组找最小值
for(i = 0;i < n;i++)
{
if(*(arr+i)<min){
min = *(arr+i);
indexmin = i;
}
}
//最小值与第一个元素交换
t = *arr;
*arr=min;
*(arr+indexmin) = t;
}
void output(int *arr,int n)
{
int i;
for(i = 0;i < n;i++)
{
printf(" %d ",*(arr+i));
}
}

答案正确

6-2 指针选择法排序(10 分)

指针选择法对10个数进行由大到小的排序。

函数接口定义:

void sort(int *x,int n);

函数sort中 x n都是用户传入的参数。函数将指针x所指数组中的n个元素按选择法降序排序。

裁判测试程序样例:

#include<stdio.h>
void sort(int *x,int n);
int main ( )
{int *p,i,a[10];
p=a;
for (i=0;i<10;i++) scanf("%d",p++);
p=a;
sort(a,10);
for(i=0;i<10;i++) printf("%4d",*p++);
printf("\n");
return 0;
} /* 请在这里填写答案 */

输入样例:

2 5 1 4 6 9 8 2 0 10

输出样例:

10 9 8 6 5 4 2 2 1 0

1.设计思路:

(1).题目算法描述

第一步:定义变量i、j、tmp、max

第二步:遍历数组找出最大的元素

第三步:将此元素放在数组的最前面

第四步:重复二、三步直到完成排序

(2).流程图

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;
}
}
}

答案正确

6-1 判断回文字符串(20 分)

本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。

函数接口定义:

bool palindrome( char *s );

函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false

裁判测试程序样例:

#include <stdio.h>
#include <string.h> #define MAXN 20
typedef enum {false, true} bool; bool palindrome( char *s ); int main()
{
char s[MAXN]; scanf("%s", s);
if ( palindrome(s)==true )
printf("Yes\n");
else
printf("No\n");
printf("%s\n", s); return 0;
} /* 你的代码将被嵌在这里 */

输入样例1:

thisistrueurtsisiht

输出样例1:

Yes
thisistrueurtsisiht

输入样例2:

thisisnottrue

输出样例2:

No
thisisnottrue

1.设计思路:

(1).题目算法描述

第一步:定义一个新的指针,并初始化

第二步:定义int型变量i j k

第三步:遍历原始指针使之指向最后一位(注意避开'\0')

第四步:比较两个指针的内容

第五步:如果指针内容不同返回false,否则返回ture

(2).流程图

2.实验代码

bool palindrome(char *s)
{
char *a = s;//新定义一个指针
int i = 0, j = 0, k = 0;
while (*a != '\0')//指针遍历到最后一位
{
a++;
i++;
}
a--; //因为最后一为为'\0'所以减一位
while (*s != '\0') //将两个指针进行比较
{
if (*s == *a)
{ k++;
}
else
{
return false;
}
s++;
a--;
}
if (k == i) //如果每个都相等k=i返回true
{
return true;
}
}

答案正确

反思:k,i的作用如何,不使用k,i如何?

设计时因为没用使用非判断if后语句可写,用i和k来判断是否遍历完成,现在看来时内存空间的浪费

简单的代码实现方式如下:

bool palindrome(char *s)
{
char *a = s;//新定义一个指针
while (*a != '\0')//指针遍历到最后一位
{
a++;
}
a--; //因为最后一位为'\0'所以减一位
while (s<a) //将两个指针进行比较
{
if (*s != *a)
{ return false;
}
s++;
a--;
} return true;
}

6-2 使用函数实现字符串部分复制(20 分)

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:

`void strmcpy( char *t, int m, char *s );

函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20 void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */ int main()
{
char t[MAXN], s[MAXN];
int m; scanf("%d\n", &m);
ReadString(t);
strmcpy( t, m, s );
printf("%s\n", s); return 0;
} /* 你的代码将被嵌在这里 */

输入样例:

7
happy new year

输出样例:

new year

1.设计思路:

(1).题目算法描述

第一步:定义i,j用于操作指针

第二步:从m-1开始遍历t,并将值赋给s

(2).流程图

2.实验代码

void strmcpy( char *t, int m, char *s )
{
int i,j;
for(i=m-1,j=0;*(t+i)!='\0';i++,j++)
{
*(s+j)=*(t+i);
}
}

2.错误调试

错误信息:部分正确

错误分析:s 的末尾元素没有归零

解决方法:在for循环结束后加上语句:*(s+j) = '\0';

答案正确

要求三内容地址:http://www.cnblogs.com/X-JY/p/8619229.html

C高级第一次PTA作业的更多相关文章

  1. C高级第一次PTA作业 要求三

    要求一.要求二 内容链接:http://www.cnblogs.com/X-JY/p/8550457.html 一.PTA作业中的知识点总结 1.6-1 计算两数的和与差(10 分) (1)*在程序中 ...

  2. C高级第一次PTA作业(2)

    6-1 在数组中查找指定元素 本题要求实现一个在数组中查找指定元素的简单函数. 1.设计思路 (1)算法: 第一步:定义一个数组名为a的数组,循环变量i,需要查找的数x,和数组元素的个数n. 第二步: ...

  3. 第一次PTA作业

    题目6-1拆分实数整数及小数部分 1设计思路 (1) 第一步:阅读题目要求及所给部分. 第二步:根据题意补全相应函数. (2)流程图 无 2.实验代码 #include <stdio.h> ...

  4. C高级第一次作业

    未来两周学习内容 复习指针的定义和引用 指针的应用场景: 指针作为函数参数(角色互换) 指针作为函数的参数返回多个值 指针.数组和地址间的关系 使用指针进行数组操作 数组名(指针)作为函数参数(冒泡排 ...

  5. C高级第二次PTA作业

    6-7 删除字符串中数字字符 1.设计思路: (1)算法: 第一步:定义一个字符数组item,输入一个字符串赋给字符数组item.调用函数delnum, 第二步:在函数delnum中定义循环变量i=0 ...

  6. 第一次C++作业

    电梯调度问题,PTA作业 ... 电梯调度问题 [github]https://github.com/zhanglingxin/elevator-scheduling 在本次代码中我第一次使用C++的 ...

  7. C++ 第一次上机作业

    今天完成了C++第一次上机作业,感觉比较简单. 题目: 求2个数或3个正整数中的最大数,用带有默认参数的函数实现. 对3个变量按由小到大顺序排序,要求使用变量的引用. 编写一个程序,用同一个函数名对几 ...

  8. 第二周c语言PTA作业留

    6-1 计算两数的和与差(10 分) 本题要求实现一个计算输入的两数的和与差的简单函数. 函数接口定义: void sum_diff( float op1, float op2, float psum ...

  9. C高级第二次作业

    PTA作业第一部分 6-7 删除字符串中数字字符(10 分) 删除一个字符串中的所有数字字符. 函数接口定义: void delnum(char *s); 其中 s是用户传入的参数. 函数的功能是删除 ...

随机推荐

  1. Java 常用对象-BigInteger类

    2017-11-02 21:57:09 BigInteger类:不可变的任意精度的整数.所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型).BigInteger ...

  2. Python 爬虫-正则表达式(补)

    2017-08-08 18:37:29 一.Python中正则表达式使用原生字符串的几点说明 原生字符串和普通字符串的不同 相较于普通字符串,原生字符串中的\就是反斜杠,并不表达转义.不过,字符串转成 ...

  3. 终于用ADB连上平板了

    可以看到设备管理器里, ADB Interface 设备装不上驱动. 1,百度到的内容,没有一个靠谱的. 2,google到内容了, 却因为看的不仔细,浪费了好多时间...(android自己的文章都 ...

  4. Eclipse 中 SDK无法更新---解决方法

    在SDK Manager -> tools -> options中: HTTP Proxy Server: mirrors.neusoft.edu.cn HTTP Proxy Port: ...

  5. [Java代码] Java是自学好还是参加培训班好?

    ava 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. 本教程给大家简单介 ...

  6. 20170706wdVBA正则表达式提取题目

    Public Sub GetContents() Dim Reg As Object Dim Matches As Object Dim OneMatch As Object Dim Index As ...

  7. Confluence 6 连接到一个 LDAP 目录

    https://www.cwiki.us/display/CONFLUENCEWIKI/Connecting+to+an+LDAP+Directory

  8. C# 导出HTML为Excel

    最近在项目中需要Excel导出,有多个Sheet页,每个Sheet页的内容比较多,且不是规整的表格,绑定值是个比较麻烦的事,便考虑直接将HTML转换为Excel文件进行导出. 一.使用JS方法将HTM ...

  9. hdu1358 kmp的next数组

    For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...

  10. ScoketTimeout Exception浅析

    以前都是用WebService的方式调用服务方的服务,此次直接调用别人的http服务. 使用的客户端是org.apache.http.client.HttpClient. 用的httpclient-4 ...