C程序第一次作业
1-1 计算两数的和与差
1 设计思路
(1)主要描述题目算法
第一步:利用指针psum接收sum的地址,指针pdiff接收diff的地址,因此 * psum为sum, * pdiff为diff。
第二步:对 * psum及 * pdiff进行赋值。
2.实验代码
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum = op1+op2;
*pdiff = op1-op2;
}
1-2 拆分实数的整数与小数部分
1 设计思路
(1)主要描述题目算法
第一步:根据函数中形参指数型intpart为实参intpart的地址,fracpart也是如此,因此 * inpart的值为实参inpart的值,fracpart也是一样。
第二步: * inpart为x的整数部分,因此表示小数部分的 * fracpart=x- * inpart。
(2)流程图
2.实验代码
void splitfloat( float x, int *intpart, float *fracpart )
{
float f;
f = x;
*intpart = x*1;
*fracpart = f-*intpart;
return 0;
}
3.本题调试过程碰到问题及解决办法
错误原因:误使 * fracpart=f-(x/1),误记为浮点型数据与整型数据进行运算,最后结果为整型,正确应为浮点型。 改正方法:因 * intpart为整型数据,且为x的整数部分,因此直接用f- * intpart就可以。
2-1 在数组中查找指定元素
1 设计思路
(1)主要描述题目算法
第一步:定义k=-1,如果数组中有与x相等的元素时,另k等于其元素对应的下标。
第二步:遍历数组,为了找到最小下标,正向遍历数组,且当有一个对应元素时,即跳出循环。
第三步:返回k的值。
(2)流程图
2.实验代码
int search( int list[], int n, int x )
{
int i = 0,k;
k = -1;
for(i = 0;i<n;i++) {
if(list[i] == x) {
k = i;
break;
}
}
return (k);
}
2-2 找最大值及其下标
1 设计思路
(1)主要描述题目算法
第一步:指针型a为a[0]的地址,b为最大值对应下标的p的地址。
第二步:令max=a[0],遍历数组。
第三步:若 (a+i)>max,则令max= * (a+i),b=i.
第四步:返回max的值。
(2)流程图
2.实验代码
int fun(int *a,int *b,int n)
{
int max = *a;
int i =0;
for(i = 0;i<n;i++) {
if(max < *(a+i)) {
max = *(a+i);
*b = i;
}
}
return (max);
}
3.本题调试过程碰到问题及解决办法
错误原因:将 * b=a+i,a应当是a[0]的地址,因此不能将a+i。 改正方法:直接将 * b = i就可以。
3-1最小数放前最大数放后
1 设计思路
(1)主要描述题目算法
第一步:调用函数input(int *arr,int n),用for循环输入arr数组的值。
第二步:调用函数max_min(int *arr,int n),遍历数组,使得最大值位于函数元素的首位,最小值位于函数元素中的最后一位。
第三步:调用函数 output(int *arr,int n) ,遍历数组,按照格式输出arr数组中的元素。
(2)流程图
input函数流程图:
max_min函数流程图:
output函数流程图:
2.实验代码
void input(int *arr,int n)
{
int i = 0;
for(i = 0;i<n;i++) {
scanf("%d",&*(arr+i));
}
return 0;
}
void max_min(int *arr,int n)
{
int j = 0,max = *(arr+n-1),min = *(arr);
int tmp1,tmp2;
for(j=0;j<n;j++) {
if(*(arr)>*(arr+j)) {
tmp1 = *(arr);
*(arr) = *(arr+j);
*(arr+j) = tmp1;
}
}
for(j=n-1;j>=0;j--) {
if(*(arr+n-1)<*(arr+j)) {
tmp2 = *(arr+n-1);
*(arr+n-1) = *(arr+j);
*(arr+j) = tmp2;
}
}
return 0;
}
void output(int *arr,int n) {
int k = 0;
for(k=0;k<n-1;k++) {
printf(" %d",*(arr+k));
}
if(k == n-1) {
printf(" %d",*(arr+k));
}
return 0;
}
3.本题调试过程碰到问题及解决办法
错误点1:输入的方式错误,写成 & arr++。解决方法:在查阅书籍以后,了解到输入指针型数组应用scanf("%d",&*(arr+i))。
3-2指针选择法排序
1 设计思路
(1)主要描述题目算法
第一步:调用函数sort(int *x,int n),x为a数组首元素的地址,n为10。
第二步:选择法排序,首先需要双层循环,外层循环,从大到小。
第三步:内层循环,控制比较的次数,决定是否交换位置。
(2)流程图
主函数:
sort函数:
2.实验代码
void sort(int *x,int n)
{
int i = 0,j = 0;
int tmp;
for(i = 0;i<n;i++) {
for(j = i;j<n;j++) {
if(*(x+i)<*(x+j)) {
tmp = *(x+i);
*(x+i) = *(x+j);
*(x+j) = tmp;
}
}
}
return 0;
}
3.本题调试过程碰到问题及解决办法
错误点1:将j=0,导致最后结果为从小到大输出,和题目要求的顺序正好相反。解决方法:在多次调试及翻书查阅后,意识到只要使j=i就好,i之前的排好的数不需要再重新再排。
4-1 判断回文字符串
1 设计思路
(1)主要描述题目算法
第一步:先运算输入的字符串中有多少个元素,用i来表示。
第二步:判断如果 * (s) != * (b-j-1),answer = 0,则输入的字符串不为回文字符串。
第三步:若*(s) 一直等于 *(b-j-1),,最后answer = 1,则输入的字符串为回文字符串。
第四步:返回answer得值,非0为真,0为假。
(2)流程图
主函数:
palindrome函数:
2.实验代码
bool palindrome( char *s )
{
int i=0,j=0,answer=1;
char *b = s;
for(;*b != '\0';b++) {
i++;
}
for(; *s != '\0';s++,j++) {
if(*(s) != *(b-j-1)) {
answer = 0;
}
}
return (answer);
}
4-2 使用函数实现字符串部分复制
1 设计思路
(1)主要描述题目算法
第一步:调用函数t,s指向主函数中的t,s。
第二步:将指针型t中的值赋值给另一个数组,计算出数组的长度,将m的大小与数组的长度用if语句来进行比较。
第三步:如果m大于数组得长度,则数组s直接输出为空数组;另一种则遍历数组,使数组s满足要求。
第四步:最后不要忘了,在if语句的最后写上*s='\0'。
(2)流程图
主函数:
strmcpy函数:
2.实验代码
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;
}
3.本题调试过程碰到问题及解决办法
错误点1:并没有在最后加上*s = '\0',导致在最后提交时最后一个调试点错误。解决方法:在询问同学及参考了同学的代码后找出了自己的错误点,字符串的结尾应加'\0'. 错误点2:当m>i时,直接内容为空,导致最后的结果不为空字符。解决方法:在查阅书籍之后,发现内容应不为空,而为 * s='\0'。
额外加题3:为了防止信息被别人轻易盗取,需要把电码明文通过加密方式变换成为密文。变换规则如下:小写字母y变换为a,小写字母z变换为b,其他字母变换成为该字母ASCII码顺序后2为字幕,比如o变换成q。要求给出你的姓名全拼加密后的结果。
1 设计思路
(1)主要描述题目算法
第一步:想到用全局变量来定义N,及运用新学的指针来完成代码。
第二步:定义name[N],newName,并将name的首元素地址传给指针型newName。
第三步:遍历循环,用newName++来使newName循环指向下一个元素,分情况将newName中的元素进行替换,最后不要忘了使newName = '\0'。
(2)流程图
2.实验代码
#include <stdio.h>
#define N 100
int main ()
{
char name[N],*newName;
newName = name;
scanf("%s",newName);
int i=0;
for(;*newName != '\0';newName++) {
if(*newName == 'y')
{
*newName == 'a';
} else if (*newName == 'z') {
*newName == 'b';
} else {
*newName = *newName + 2;
}
}
*newName = '\0';
printf("%s",name);
}
要求三、学习总结和进度
总结:在这两周我复习了数组,学习了指针的含义和概念,数组和指针以及字符串与指针,而对于字符串与数组的运用是最不熟练的,希望在写一次写博客总结时,自己可以写上对于字符串与数组的运用是已经完全掌握的,这是大的方面。
而在小的方面,在做PTA中的题目时,觉得自己对选择法排序的掌握已经退步为差不多为0,而选择法排序和冒泡法排序都是十分重要的,自己会尽快的去熟练掌握它们的。
pta第四次作业的第二题,自己印象是最深刻的,因为在这题自己也是一筹莫展,在网上查找完题目,提交了理解了以后就自己的代码,但因为自己最后的一点点不甘心,最后在同学的帮助下,还是用自己的思路完成了代码。而在此次分析网上的代码时,代码中可以有很多简化的地方,strlen(数组名)即为该数组的长度,不需要用for循环用i++来表示,书中和之前牛老师都有提到过,在以后自己也会使用这种方法的。
在总结的最后,分享一个应该掌握但有可能没有注意到的知识点:pta第三次作业的第二题中主函数的代码
#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++
p=a;//为什么没了它最后输出错误
sort(a,10);
for(i=0;i<10;i++) printf("%4d",*p++);
printf("\n");
return 0;
}
看到上面的代码时,我有两个问题:
(1)为什么输入的是p++,这个是简单的,因为p指向的是p首元素的地址,p++指向写一个元素的地址。
(2)为什么主函数中代码里先后有两个p=a,第一个p=a是将p指向a数组,那么第二个是什么意思,并且在将第二个p=a去掉以后,最后的输出结果是错误的?
在百度无果后(应该是自己输入的问题),翻看了C程序设计这本书,发现书上是给了明确的案例加解释的:原因是指针变量的初始值是a数组的首元素地址,但经过for循环后,p就指向了a数组的末尾(p是可变的),此时p的初始值已经不是a[0]的首地址了,而是指向a+10,因此若再执行p++时,p指向的是a数组的下面10个元素,而这些存储单元的值是不可预料的。内容在233页,希望可以帮到大家。
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址
git地址:(https://git.coding.net/exo07/disizhouzuoye.git)
3、点评3个同学的本周作业
于耀淞:(http://www.cnblogs.com/jsjyys/p/8589997.html)
周璇:(http://www.cnblogs.com/zhouxuan99/p/8597350.html)
丰大为:(http://www.cnblogs.com/DavidPark/p/8551402.html)
4、请用表格和折线图呈现你本周(3/12 8:00~3/26 8:00)的代码行数和所用时间、博客字数和所用时间
C程序第一次作业的更多相关文章
- C语言程序第一次作业
(一)实验总结 1. 求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 测试数据1:r=2 运行结果: (4)实验分析 没有问题 2.判断闰年 ( ...
- Java程序第一次作业
public class yjj { public static void main(String[] args) { System.out.println("Hello Java" ...
- java第一次作业0
lsl321 java第一次作业 #1. 本章学习总结 你对于本章知识的学习总结 本章我们学习了各种java相关文件的使用,以及码云,博客,pat等程序辅助软件,这些对于我们专业的学习有非常大的帮助, ...
- 集大1513 & 1514班 软件工程第一次作业评分与点评
谢谢大多数同学按时完成了作业,同学态度都比较端正,没有为了完成作业或者讨好老师而说一些假话空话. 很多同学选择CS之前并没有从兴趣或者擅长出发.这是一个普遍的现象,十年前我们是这样,十年后的孩子们还是 ...
- OO第一次作业总结
OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...
- # C语言程序设计第一次作业1234
---恢复内容开始--- C语言程序设计第一次作业 1.求圆面积和周长 输入圆的半径,计算圆的周长和面积 (1)流程图 (2)测试数据及运行结果 测试数据r=3 运行结果 2.判断闰年 输入一个四位年 ...
- 构建之法助教园地第一次作业--点评<西北师范大学|李晓婷>
一 博客点评 第一次作业--准备篇:https://www.cnblogs.com/Mookiepiece/p/10464606.html#4192515 点评内容: 首先,你对电脑很感兴趣,兴趣就是 ...
- oo第一次作业
前言: 这是一篇面向对象作业总结,作业内容是对多项式进行求导,一共有三个阶段,具体要求不详述,第一阶段只要求’+’连接coeff*x^pow的形式,第二次支持*连接的幂函数及三角函数,第三次则需要支持 ...
- 17秋 SDN课程 第一次作业
SDN第一次作业 你会选择作 网络编程 方向的程序员吗?为什么? 有可能.原因如下: 1.我的研究与网络密切相关: 2.SDN侧重软件实现,自然涉及socket等网络编程知识,属于基本功: 3.市场. ...
随机推荐
- monkey简介与最常用命令
1.monkey简介 monkey是SDK附带的一个用来做压力测试的工具,monkey测试所有事件都是随机发生的,不带有主观性,测试人员主要通过跑monkey后打印出来的日志分析来发现问题 2.mon ...
- 关于margin-top的一些特别问题
当给子元素添加了margin-top的数值,浏览器解析的时候默认添加到父元素上解决的方法: 1 给父元素添加一个上边框border-top. 2 或者给子元素加个浮动. 3 给父元素添加overfl ...
- [POI2014]KUR-Couriers
题意 给一个数列,每次询问一个区间内有没有一个数出现次数超过一半 题解 主席树,一个数出现次数>一半,这个区间内只有这一个数满足,那么主席树直接维护所有数的出现次数,直接在树上二分查询 # in ...
- Java的深拷贝和浅拷贝
关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...
- Micropython TurnipBit 电子时钟 青少年编程入门
电子时钟是一个很常用但是制作非常简单的小玩具了,对于Micropython初学者来说,制作一个电子时钟是非常简单又容易检验自己学习成果的实验了.TurnipBit相比于其他开发板,制作电子时钟就更加简 ...
- hive数据库的哪些函数操作是否走MR
平时我们用的HIVE 我们都知道 select * from table_name 不走MR 直接走HTTP hive 0.10.0为了执行效率考虑,简单的查询,就是只是select,不带count, ...
- PowerShell 发布farm solution
SharePoint PowerShell在SharePoint Product列表里边,然后以管理员权限启动. 1. 添加Solution 到 SharePoint Farm. Add-SPSolu ...
- 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)
Exceptionless是一个非常优秀的事件记录服务,目前我们的自部署的Exceptionless已经稳定运行了近一年的时间,收集了千万条事件信息.但Exceptionless官方自宿主部署的文档不 ...
- java ---日期的格式化
import java.util.Date; import java.util.Scanner; import java.text.SimpleDateFormat; import java.util ...
- MongoDB 桌面管理器MongoVUE
MongoVUE是一个桌面GUI工具,专用于Windows平台,它有一个简洁.清爽的界面,它的基本功能是免费的.它可以以文本视图.树视图.表格视图来显示MongoDB的数据.还可以保持查询的结果供以后 ...