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程序第一次作业的更多相关文章

  1. C语言程序第一次作业

    (一)实验总结 1. 求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 测试数据1:r=2 运行结果: (4)实验分析 没有问题 2.判断闰年 ( ...

  2. Java程序第一次作业

    public class yjj { public static void main(String[] args) { System.out.println("Hello Java" ...

  3. java第一次作业0

    lsl321 java第一次作业 #1. 本章学习总结 你对于本章知识的学习总结 本章我们学习了各种java相关文件的使用,以及码云,博客,pat等程序辅助软件,这些对于我们专业的学习有非常大的帮助, ...

  4. 集大1513 & 1514班 软件工程第一次作业评分与点评

    谢谢大多数同学按时完成了作业,同学态度都比较端正,没有为了完成作业或者讨好老师而说一些假话空话. 很多同学选择CS之前并没有从兴趣或者擅长出发.这是一个普遍的现象,十年前我们是这样,十年后的孩子们还是 ...

  5. OO第一次作业总结

    OO第一次学习总结 1.第一次作业:多项式加法 从未接触过java的我,在从输入输出开始学了几天后,按照C语言的思路,写出了一个与面向过程极其接近的程序. 在这个程序中,存在两个类:一个是Comput ...

  6. # C语言程序设计第一次作业1234

    ---恢复内容开始--- C语言程序设计第一次作业 1.求圆面积和周长 输入圆的半径,计算圆的周长和面积 (1)流程图 (2)测试数据及运行结果 测试数据r=3 运行结果 2.判断闰年 输入一个四位年 ...

  7. 构建之法助教园地第一次作业--点评<西北师范大学|李晓婷>

    一 博客点评 第一次作业--准备篇:https://www.cnblogs.com/Mookiepiece/p/10464606.html#4192515 点评内容: 首先,你对电脑很感兴趣,兴趣就是 ...

  8. oo第一次作业

    前言: 这是一篇面向对象作业总结,作业内容是对多项式进行求导,一共有三个阶段,具体要求不详述,第一阶段只要求’+’连接coeff*x^pow的形式,第二次支持*连接的幂函数及三角函数,第三次则需要支持 ...

  9. 17秋 SDN课程 第一次作业

    SDN第一次作业 你会选择作 网络编程 方向的程序员吗?为什么? 有可能.原因如下: 1.我的研究与网络密切相关: 2.SDN侧重软件实现,自然涉及socket等网络编程知识,属于基本功: 3.市场. ...

随机推荐

  1. [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能

    [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能 原文: Comparing AWS Lambda performance of Node.js, ...

  2. C# SerialPort自定义串口DCB

    C# SerialPort自定义串口DCBChange DCB fields from SerialPort instance CPS:中文DCB结构详解表 译自Change DCB fields f ...

  3. 关于工作中Git相关的总结

    来公司一周多,主要是在熟悉各种环境和流程,而作为研发来讲,git的使用也是必不可少的.以前使用方式单一,几个人对着master,pull和push,来了之后发现其实在日常的开发中,git可以很方便的帮 ...

  4. 如何从Eclipse 迁移到Android Studio 且保持Eclipse项目结构

    本文demo下载:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=531 Android项目 Eclipse与A ...

  5. 【BZOJ4237】稻草人(CDQ分治,单调栈)

    [BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的 ...

  6. ajax 状态码

    状态码定义 ... 10 信息1xx ... 10.1 100继续 ... 10.1.1 101交换协议 ... 10.1.2 成功的2xx ... 10.2 200 OK ... 10.2.1 20 ...

  7. 'net’ 不是内部命令或外部命令,也不是可运行的程序或批处理文件

    我的电脑-->属性-->高级-->环境变量 path的变量值新加: %SystemRoot%\system32 修改完成后,需要重新打开cmd命令行,否则不会生效的.

  8. handsontable 合并单元格

    <!DOCTYPE html> <html> <head> <title>handsontable demo</title> <met ...

  9. UWP 图片模糊

    先看一下效果: 这是微识别的个人中心页面,顶部有头像,以及背景图片模糊. 要实现这样的效果,有两种方法. 第一种麻烦点,也是我现在用的.想看简单的,翻到最后 1. 首先看一下xaml代码: <S ...

  10. Mac上使用jenkins+ant执行第一个程序

    本文旨在让同学们明白如何让jenkis在mac笔记本上运行,以模拟实际工作中在linux上搭建jenkins服务平台首先按照笔者的习惯先说一下如何安装jenkis和tomcat,先安装tomcat,在 ...