C高级第一次PTA作业
作业要求一
附加题目
写程序证明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 );
其中op1
和op2
是输入的两个实数,*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),*intpar
t和*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);
其中形参a
、b
、n
都是用户传入的参数。函数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);
三个函数中的 arr
和n
都是用户传入的参数。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作业的更多相关文章
- C高级第一次PTA作业 要求三
要求一.要求二 内容链接:http://www.cnblogs.com/X-JY/p/8550457.html 一.PTA作业中的知识点总结 1.6-1 计算两数的和与差(10 分) (1)*在程序中 ...
- C高级第一次PTA作业(2)
6-1 在数组中查找指定元素 本题要求实现一个在数组中查找指定元素的简单函数. 1.设计思路 (1)算法: 第一步:定义一个数组名为a的数组,循环变量i,需要查找的数x,和数组元素的个数n. 第二步: ...
- 第一次PTA作业
题目6-1拆分实数整数及小数部分 1设计思路 (1) 第一步:阅读题目要求及所给部分. 第二步:根据题意补全相应函数. (2)流程图 无 2.实验代码 #include <stdio.h> ...
- C高级第一次作业
未来两周学习内容 复习指针的定义和引用 指针的应用场景: 指针作为函数参数(角色互换) 指针作为函数的参数返回多个值 指针.数组和地址间的关系 使用指针进行数组操作 数组名(指针)作为函数参数(冒泡排 ...
- C高级第二次PTA作业
6-7 删除字符串中数字字符 1.设计思路: (1)算法: 第一步:定义一个字符数组item,输入一个字符串赋给字符数组item.调用函数delnum, 第二步:在函数delnum中定义循环变量i=0 ...
- 第一次C++作业
电梯调度问题,PTA作业 ... 电梯调度问题 [github]https://github.com/zhanglingxin/elevator-scheduling 在本次代码中我第一次使用C++的 ...
- C++ 第一次上机作业
今天完成了C++第一次上机作业,感觉比较简单. 题目: 求2个数或3个正整数中的最大数,用带有默认参数的函数实现. 对3个变量按由小到大顺序排序,要求使用变量的引用. 编写一个程序,用同一个函数名对几 ...
- 第二周c语言PTA作业留
6-1 计算两数的和与差(10 分) 本题要求实现一个计算输入的两数的和与差的简单函数. 函数接口定义: void sum_diff( float op1, float op2, float psum ...
- C高级第二次作业
PTA作业第一部分 6-7 删除字符串中数字字符(10 分) 删除一个字符串中的所有数字字符. 函数接口定义: void delnum(char *s); 其中 s是用户传入的参数. 函数的功能是删除 ...
随机推荐
- Java 常用对象-BigInteger类
2017-11-02 21:57:09 BigInteger类:不可变的任意精度的整数.所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型).BigInteger ...
- Python 爬虫-正则表达式(补)
2017-08-08 18:37:29 一.Python中正则表达式使用原生字符串的几点说明 原生字符串和普通字符串的不同 相较于普通字符串,原生字符串中的\就是反斜杠,并不表达转义.不过,字符串转成 ...
- 终于用ADB连上平板了
可以看到设备管理器里, ADB Interface 设备装不上驱动. 1,百度到的内容,没有一个靠谱的. 2,google到内容了, 却因为看的不仔细,浪费了好多时间...(android自己的文章都 ...
- Eclipse 中 SDK无法更新---解决方法
在SDK Manager -> tools -> options中: HTTP Proxy Server: mirrors.neusoft.edu.cn HTTP Proxy Port: ...
- [Java代码] Java是自学好还是参加培训班好?
ava 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. 本教程给大家简单介 ...
- 20170706wdVBA正则表达式提取题目
Public Sub GetContents() Dim Reg As Object Dim Matches As Object Dim OneMatch As Object Dim Index As ...
- Confluence 6 连接到一个 LDAP 目录
https://www.cwiki.us/display/CONFLUENCEWIKI/Connecting+to+an+LDAP+Directory
- C# 导出HTML为Excel
最近在项目中需要Excel导出,有多个Sheet页,每个Sheet页的内容比较多,且不是规整的表格,绑定值是个比较麻烦的事,便考虑直接将HTML转换为Excel文件进行导出. 一.使用JS方法将HTM ...
- hdu1358 kmp的next数组
For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...
- ScoketTimeout Exception浅析
以前都是用WebService的方式调用服务方的服务,此次直接调用别人的http服务. 使用的客户端是org.apache.http.client.HttpClient. 用的httpclient-4 ...