零散知识点

  • 模块化:将一个问题分解成若干个子问题的过程成为模块化。
  • 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题;还可以提高程序代码的重用性。
  • 函数:函数是构成C程序的基本单位。函数由函数首部和函数体两个部分组成,函数首部包含函数的返回类型、函数名称和参数表声明;函数体包含实现特定功能所需要执行的语句序列。
  • 函数调用原则:C语言中规定,所有函数必须“先定义后使用”。即:如果被调用的函数在前面定义,则可以直接调用;否则,需要将被调用函数的函数原型在前面声明,以便通告C编译程序,这个函数的完整定义在后面。
  • 常用标准函数头文件
    1. math.h——包含与数学有关的函数
    2. ctype.h——包含与字符处理有关的函数
    3. string.h——包含与字符串处理有关的函数
    4. stdio.h——包含与输入输出有关的函数
    5. stdlib.h——包含与动态分配存储空间和产生随机值有关的函数
  • 递归
  1. 递归定义:定义一个概念的时候用到自身概念的定义形式被称为递归定义。
  2. 递归算法:具有“求解子问题的基本方法与求解整个问题所采用的方法一样”特征的求解算法称为递归算法。
  3. 递归函数特征:在函数的执行体中出现了调用函数本身。
  4. 例子——实现阶乘递归算法的递归函数如下:
 //计算n!
long factorial(int n)
{
if (n == )
return ;
else
return n * factorial(n - );
}
  • 利用递归函数实现二分查找

二分查找算法描述:对于一个已经从小到大排序的数据序列,用给定数据key与查找区间中间位置的数据比较,如果相等表明查找成功;否则,如果key比中间位置的数据小,则在前半个区间用同样的方法继续查找;否则在后半个区间用同样的方法继续查找。

实现代码如下:

 #include<stdio.h>
#pragma warning(disable:4996)
#include<stdlib.h>
#define NUM 10
void input(int value[]);
void output(int value[]);
int search(int value[], int key, int low, int high); main()
{
int value[NUM], result, key;
input(value);
output(value);
printf("\nEnter the key : ");
scanf("%d\n", &key); result = search(value, key, , NUM - );
if (result != )
printf("\n%d is the %dth element", key, result);
else
printf("\nfail to find %d", key);
} void input(int value[])
{
int i;
for (i = ; i < NUM; i++){
scanf("%d", &value[i]);
}
} void output(int value[])
{
int i;
for (i = ; i < NUM; i++){
printf("%4d", value[i]);
}
} int search(int value[], int key, int low, int high)
{
int mid;
if (low>high)
return -;
mid = (low + high) / ;
if (value[mid] == key)
return mid;
if (key < value[mid])
return search(value, key, low, mid - );
else
return search(value, key, mid + , high);
}
  • 自定义函数
  • 基本格式

<函数返回类型> <函数名> (<参数表>)

{

<函数体>;

}

  • 说明:
  1. <函数返回类型> 是指函数执行完毕后函数返回值所属的数据类型。
  2. <函数名> 的命名应该符合C语言的用户自定义标识符规则,并且最好“见名知意”,最好用一个能够反映操作功能的动词命名;。
  3. <参数表> 指出了调用函数时,需要向函数提供的参数个数和每个参数所属的数据类型,是函数之间交换信息的接口;若形参是一维数组类型,则无需指出一维数组的元素个数。
  4. 在调用函数之后,参数传递经历两个基本步骤:1)根据形式参数的声明格式,为每一个形式参数分配存储空间。2)再将实际参数的值赋给对应的形式参数。函数执行完毕后,释放为函数调用分配的所有存储空间,并回到调用函数的位置。
  5. 将实际参数传递给形式参数的过程具有以下基本特征:a)具有单向性,实际参数既可以是变量,也可以是表达式;b)实际参数的值赋给形式参数之后,实际参数与形式参数不再有任何关系。
  6. 在函数没有被调用的时候,系统不会为任何参数分配空间,因此称为形参。
  7. <函数体> 由若干条需要执行的语句组成的语句序列,是函数的核心部分。
  8. C语言中,一个函数可以有返回值,也可以没有返回值。如果有返回值,返回值的类型在函数名前声明,并在函数体中利用return语句将返回值返回(若函数有返回值,在函数返回时,可以立即引用这个返回值,也可以将它保留在一个相应类型的变量中;否则,返回值将会丢失);如果没有返回值,在函数名前声明void,默认的返回类型是int。
  • 函数的调用

函数调用语句的基本格式:<函数名> (<实际参数表>);

  1. <函数名> 是需要调用的函数名称。
  2. <实际参数表> 中的参数与这个函数的形式参数表相对应。
  3. 例子:
 int dataArray[];
int n;
double ave; //自定义函数
double average(int value[], int num){
int i, sum = ;
for (i = ; i < num; i++){
sum += value[i];
return sum*1.0 / num;
}
} //函数调用
ave = average(dataArray, n);

自定义函数的应用实例

  • 输出乘法口诀表

 #include<stdio.h>
void drawline(int n, char ch); //必须存在 main()
{
int i, j;
printf("\n 9*9 table\n");
drawline(, '=');
printf("\n 1 2 3 4 5 6 7 8 9");
drawline(, '='); //此处必须为单引号'',否则会产生乱码
for (i = ; i <= ; i++){
printf("\n%4d", i);
for (j = ; j <= ; j++){
printf("%4d", i*j);
}
if (i < )
drawline(, '_');
else
drawline(, '=');
}
} void drawline(int n, char ch){
int i;
putchar('\n');
for (i = ; i <= n; i++){
putchar(ch);
}
}

  • 计算最长文本行

 #include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
void readline(char maxline[]); main()
{
char maxline[10] = "";
readline(maxline);
printf("the longest line is:\n");
puts(maxline);
} void readline(char maxline[])
{
char line[];
int maxlength;
int n; maxlength = ;
printf("\nEnter the line:\n");
do{
gets(line);
n = strlen(line);
if (n > strlen(maxline)){
maxlength = n;
strcpy(maxline, line);
}
} while (n > );
}

本博客内容为原创,版权所有违者必究,转载请注明来源 http://www.cnblogs.com/sunshine-blog/

c语言程序设计案例教程(第2版)笔记(二)—函数、递归的更多相关文章

  1. c语言程序设计案例教程(第2版)笔记(四)—指针、分配存储空间、文件

    零散知识点: 指针类型:每个变量占用的首单元地址称为这个变量的存储地址. “&”为“取地址运算符”.格式:&  变量名.功能:返回指定变量的存储地址. “*”为“取内容运算”.格式:* ...

  2. c语言程序设计案例教程(第2版)笔记(六)—字符串处理实例

    字符串处理 功能描述:从键盘输入一个文本行后,为用户提供菜单选择,实现字符串一些操作——显示文本行.查找并替换指定子串.删除指定子串.统计指定子串数目. 实现代码: #include<stdio ...

  3. c语言程序设计案例教程(第2版)笔记(五)-软件开发基础知识

    零散知识点: 软件的主要特征 软件是一种逻辑产品,而不是有型的物质: 软件需要设计.开发,但不是传统意义上的产品制造: 软件不会磨损,但软件需要维护,即:修改代码或增加模块: 虽然软件行业正在向基于组 ...

  4. c语言程序设计案例教程(第2版)笔记(三)—变量、结构体

    零散知识点: 变量        :C语言中,每个变量必须先定义后引用.所谓变量存在是指系统为这个变量分配一块存储空间,此时对变量的操作,就是对变量所对应的存储空间中存放的数据进行操作.人们将变量占据 ...

  5. c语言程序设计案例教程(第2版)笔记(一)—零散、输入输出、最小公倍数、选择排序、冒泡排序

    零散知识点: 非格式化输入输出:getchar().putchar() 格式化输入输出   :scanf().printf() 字符串输入输出   :gets() 或 scanf().puts() 或 ...

  6. 《zw版·Halcon-delphi系列原创教程》 zw版-Halcon常用函数Top100中文速查手册

    <zw版·Halcon-delphi系列原创教程> zw版-Halcon常用函数Top100中文速查手册 Halcon函数库非常庞大,v11版有1900多个算子(函数). 这个Top版,对 ...

  7. C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载

    下载地址:点我 C语言仍然是计算机领域的通用语言之一,但现在的C语言已经和当初的时候大不相同了.本书主要的一个目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化 ...

  8. 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词

    第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...

  9. 【C语言程序设计】小游戏之俄罗斯方块(二)!适合初学者上手、练手!

    第二篇,主要实现俄罗斯方块中的主体部分,包括容器的数据结构以及容器的相关操作,特别是大方块和容器之间的交互逻辑,包括碰撞检测,消除检测等等. 1. 容器的表示 大方块的实现涉及到位运算,而容器同样如此 ...

随机推荐

  1. <项目><day12>通讯录(视频)

    1 需求分析(需求分析师) 功能分析: 1)添加联系人 2)修改联系人 3)删除联系人 4)查询所有联系人 2 需求设计(系统分析师/架构师/资深开发人员) 2.1设计实体(抽象实体) 联系人实体: ...

  2. maven之发布项目到nexus【clean deploy命令】

    原文:http://m.blog.csdn.net/article/details?id=49667971 当我们的项目开发完成以后,可能要进行发布(如果是独立的项目,就不需要发布啦,如果是模块项目, ...

  3. 从头开始学Android之(一)——— Android架构

    从事Android开发已经两年多了,最近项目上特别清闲,刚开始时在闲暇的时候都不知道干嘛,整天混日子.有一天突然有个以前同学找到我,说要我帮忙做一个Android的需求,就是在后台截屏(涉及到服务以及 ...

  4. Meteor教程

    Meteor 是一个构建在 Node.js 之上的平台,用来开发实时网页程序.Meteor 程序位于数据库和用户界面之间,保持二者之间的数据同步更新. 因为 Meteor 是基于 Node.js 开发 ...

  5. Deepin-安装和卸载软件

    一般默认厂商源安装软件 安装软件: 示例:sudo apt-get install xx 实例:sudo apt-get install nodejs 卸载软件: 示例:sudo apt-get -- ...

  6. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  7. 实战c++中的string系列--指定浮点数有效数字并转为string

    上一篇博客讲了好几种方法进行number到string的转换,这里再单独说一下float或是double到string的转换. 还是处于控件显示的原因.比方说要显示文件的大小,我们从server能够获 ...

  8. eclipse中将web项目部署到tomcat

    eclipse中将web项目部署到tomcat. myeclipse部署WEB项目到tomcat比较方便,但eclipse貌似默认是不会替你将web自动部署到tomcat下的.你Run as该web项 ...

  9. set 去重 会 破坏 原有list 的元素相对位置

    feature_reduce_l = [i if re.search('\d', i) is None else i[0:re.search('\d', i).endpos - 1] for i in ...

  10. vc字符串转换处理:(绝对精华,收集所有的例子)

    vc字符串转换处理:(绝对精华,收集所有的例子) 1.头文件中要定义宏;   #define   UNICODE         #define   _UNICODE     //////////// ...