wujr5 / c-and-cpp-language-learning

C和C++编程语言学习 - 2015级

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

软件:week3 实验:数学函数与格式输出

ghostbody opened this issue · comments

问题

不少同学还是没有看gitub的issue,那些scanf和printf问题上周issue已经说过,不看是自己吃亏。看了不懂再提出问题,总比在实验课上写scanf("char a = %c")还纠结为什么错高效率很多。

其次,再次强调一下,扩展题目也是自己自学为主,不强制要求做,不占期末分数,没有ddl,也没有提交规定。这个题目老师也没有要求我们出,出这个题主要目的是使让大家提前预习前面的知识,提前自学完,到老师讲概念定义的理论时候,你就不会晕,也知道怎么回事。这是一种高效率的学习方法。做不出来没关系,学完到一定程度再做。

另外,我每周会放一些往年的期中或者期末考试题在扩展题上,供大家参考。

问题1 不懂得使用搜索工具

编程语言学习不是像高中时候学语文数学那样拿着书,听老师讲就行了。有很多知识老师是不讲的,而且书上面也没有。比如,一个库函数 double log(double _x),书本或者老师不会教你怎么怎么用的,必须要你自己去百度或者谷歌。

搜索引擎:
谷歌、百度

参考it界的学习网站:
Stack Overflow
CSND 博客
开源**

问题2 不会看编译错误

编译器的一个很重要的功能就是检查你写的代码是否符合这个语言定义的语法,一定要学会看编译器的提示信息,例如:

1.c:12:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘scanf’
   scanf("%c%d%f%ld%lld%lf", &a, &b, &c, &d, &e, &f);

这句话的意思你不要晕,看到一大串就慌了,这不是应该有的学习态度。你要仔细去理解。这句话说在1.c这个文件中的第12行的第三列出现了错误,你就要到文件中找到相应的那一行。它继续描述错误,是在scanf前少了一个符号,删了赋值运算符,逗号运算符,或者后面的一个attribute宏,我们在源代码中发现,就是少了一个分号而已。

练习,解释下列编译错误是什么意思?

1.c:13:59: error: ‘g’ undeclared (first use in this function)
   printf("%c %d %.2f %ld %lld %.7lf\n", a, b, c, d, e, f, g);
1.c:13:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long long unsigned int’ [-Wformat=]
   printf("%c %d %.2f %ld %lld %.7lf\n", a, b, c, d, e, f);
   ^

问题3 对评测系统的误解

在线评测系统(Online Judge)是用户提交代码后,后台通过测试样例测试程序正确性的系统。我们先看几个概念:
1、 测试样例
对于程序的一组符合题目逻辑输入输出,称为一组测试样例。如a-b中,输入 1 2,输出 -1 是一组测试样例。每个题目中会有多个样例,可是评测系统并不会公布这些样例,你需要通过完善自己的程序逻辑来达到通过测试的目的。因此,你通过题目给的example并不意味着你通过全部测试。
2、评测过程
如图所示
alt OJ
3、输入输出流
输入流指的是程序的所有输入,输出流指的是程序的所有输出。也就是评测系统会给你的程序一个输入流作为你的处理的开始,然后你的程序需要提供一个符合预期的输出。因此,所有的提示型语句:“please input ”之类的会被认为是输出流中的东西,你的程序不能够出现这个。
4、数据输入范围
数据输入范围是指你需要解决的问题规模。
比如,同样是a-b的题目,a,b的范围可以有很多种,因为实数是一个无穷集合。你需要解决的问题大小是题目给你限定好的。比如题目说a<10000, b<1000, 就说明题目的输入流中不存在大于1000的a或者b,你不需要考虑大数字的相加。相反,有些题目就是要求大数据的问题,这个题目的难度就不一样,难度和数据的大小一般成正比。

这是评测系统的原理。因此你需要考虑很多东西,否则我所有的答案直接printf出来,这样题目没有任何意义。

问题4 代码风格很糟糕

大家现在写的代码开始复杂了,代码风格也就开始不管了。有些同学把所有的计算表达式全部放到printf里面,看的我眼花缭乱。有的同学写代码左对齐,毫无缩进,非常难看。
1、请大家检查自己的代码风格,用之前的cpplint,否则一年之后你会埋怨我没有抓代码风格,到时候习惯了之后,你会发现那样写的代码是项目毒瘤。
2、你可以给其他同学看你的代码,看看你要花多少口舌解释你的代码,就是你这份代码在协同工作时候的交流成本,这个肯定越低越好。

google style 在线检查

练习:给你的同学看1003你提交的代码,让他理解1003那个题目的思路,和各个变量是干嘛的。

问题5 不会读题,读题不认真

现阶段西西里的课程练习题都是中文的,而考试的时候是英文的。你怎么读这个题目,决定了你是否能做对这个题目。比如,二次方程的题目明确说明了输出时候小根在前,大根在后,这是题目的关键信息,然而不少同学直接忽略。

所以,请大家认真读题目。

问题 6 不会使用函数

函数是c语言一个很重要的概念,之后老师肯定会重点讲。而现在我们使用的printf,scanf和log这些都是库里面定义好的函数。既然学习一个东西,首先得知道怎么用,之后才能学习怎么创造。

对于每个函数的使用方法,你需要去看他的函数原型(prototype):
函数原型有三个元素:函数名(一般蕴含这个函数的作用)、函数的返回类型、函数的参数列表,如:

double log (double x);

这个函数规定了输入的参数是double,处理后得到的结果也是double。这也就是为什么vs里面直接把int类型的变量当做参数传入会报错的原因。这个函数的返回值是double。所以应该对应起来,用double类型来存储,或者在printf中咏%lf直接输出。

double x = 100.0;
double a = log(x);
printf("%lf", log(x));

练习,解释下面函数的参数和函数的调用方法用法:

int scanf(const char *format,...);
extern void printf(const char *format,...);
double pow(double x, double y); 

本周扩展题目:

http://172.18.228.154:8080/

大家有什么问题就在下面留言,非常欢迎

C语言头文件函数库

大家在从写第一个C语言程序Hello world开始,第一行程序就包含了#include <stdio.h>.之后写的每一个C语言程序基本上第一句都是它,但是很多同学现在对这句话什么意思还是不理解,现在我详细给大家讲解一下.

函数库

首先stdio.h是C语言的一个函数库,这个函数库中实现了一些函数,当你需要使用库里面的函数的时候直接调用就可以了,比如stdio.h库中的scanf()和printf()函数

调用库函数时需要注意两点

    1.首先是在程序加上#<include>(尖括号里是你调用的函数所在的库)如果不加的话会
提示the identifier is not defined,因为函数名也是一个标识符,它是在头文件中声明并定义的
    2.当你使用某个库函数,你在程序里定义的标识符不能与库函数中的函数名重名,否则
会提示你标识符重定义或标识符模糊

常用函数库

<stdio.h> 标准输入输出函数库
<string.h> 有关字符串操作的函数
<math.h> 数学函数集合函数库
<time.h> 获取系统时间,计时函数库

C程序的生命周期(目前只做了解,不懂也没关系)

C程序在执行之前要经过三个阶段,预处理,编译和链接,连接完成后程序才会执行

预处理

预处理阶段编译器主要做的工作是将源文件中的include头文件替换成文件和宏定义(如#DEFINE #IF等,后面会学,现在不要求掌握),

编译

编译过程主要做的工作是语法检查,函数分配内存空间,生成目标文件等等,

链接

假如一个程序包含多个文件,在分别对每个源程序进行编译并得到多个目标程序后,要把这些目标程序连接起来,同时还要同系统提供的资源(如函数库)连接成为一个整体,如果不出现错误,会得到一个后缀为 .exe的可执行文件

执行

本周实验课作业

自行编写小程序,要求:
程序1.使用<math.h>中的任意5个函数,并计时,将程序运行时间输出
程序2.格式化输出,输出一个表格,
程序3.以不同颜色输出helloworld(提示:使用windows.h库,这个不是C语言的标准库,主要目的是训练大家的搜索能力)
程序4.使用<string.h>中8个函数,并计时,将程序运行时间输出(选做)
效果图及实验模板链接:[模板及效果图]https://github.com/ghostbody/c-and-cpp-language-learning/tree/master/week4

效果图:
颜色输出:
alt OJ

表格打印:
alt OJ

当然你可以选择打印彩色的表格。

deadline:学委10月25日21:00之前收齐打包发到邮箱2824759538@qq.com

##提交各式:打包成zip或rar格式

    +学号_名字_week5(主目录)
                 -mathFunction.c
                 -table.c
                 -color.c
                 -stringFunction.c
                -学号_实验报告.pdf

与期末成绩挂钩!!!

注意,基本要求就是实现上述两个图片上的效果。至于,是否需要人工输入数据,是否有其他的功能,你自己选择,请在实验报告注明。原则就是:做的越多,分数越高,当然你做的东西是要有意义的,如果只是多输出一行数据,那就是没意义的。