首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
js
request
timestamp
python2
python3
web3
loops
settings
match
random
callback
plugins
const
java
golang
instance
char
header
filter
integer
flutter
split
default
c语言
version
utf-8
runtime
int
heap
metadata
grid
emoji
netty
dagger
eval
rsa
join
command
install
client
audio
export
hash
frameworks
ip
less
node.js
httpclient
go
function
case
solr
actionscrip
foreach
stream
import
controller
object
hook
range
post
bytecode
expression
search
list
input
php
byte
include
chat
future
heatmap
php7
web
nodejs
schema
php5
md5
require
当前位置:
开发笔记
>
编程语言
> 正文
《C程序设计语言》第四章函数和程序结构
作者:yolo_bean | 来源:互联网 | 2023-05-18 16:21
4.1函数的基本知识如果函数定义中省略了返回值类型,则默认为int类型。练习4-1编写函数strindex(s,t),它返回字符串t在s中最右边出现的位置。如果s中不包含t
4.1 函数的基本知识
如果函数定义中省略了返回值类型,则默认为int类型。
练习4-1 编写函数strindex(s, t),它返回字符串t在s中最右边出现的位置。
如果s中不包含t,则返回-1。
答:
#include
int strindex(char s[], char t[])
{
int i, j, k;
for (i = 0; s[i] != '\0'; i++) // to end of s
;
for (i = i - 1; i >= 0; i--) {
for (j = 0; t[j] != '\0'; j++) // to end of t
;
// compare s and t in reverse order
for (j = j - 1, k = i; j >= 0 && k >= 0; j--, k--)
if (s[k] != t[j])
break;
if (j == -1)
return k + 1;
}
return -1;
}
main()
{
char s[] = "thisiscdaiandrachel";
char t1[] = "cdai";
char t2[] = "xyz";
char t3[] = "this";
char t4[] = "elx";
printf("%d\n", strindex(s, t1));
printf("%d\n", strindex(s, t2));
printf("%d\n", strindex(s, t3));
printf("%d\n", strindex(s, t4));
}
4.2 返回非整型值的函数
由于atof函数的返回值类型不是int,因此该函数必须声明返回值的类型。
其次,调用函数必须知道atof函数返回的是非整型值。可以在调用函数中显示声明atof函数。
#include
#define MAXLINE 100
main()
{
double sum, atof(char []);
char line[MAXLINE];
int getline(char line[], int max);
sum = 0;
while (getline(line, MAXLINE) > 0)
printf("\t%g\n", sum += atof(line));
return 0;
}
函数atof的声明与定义必须一致。如果atof函数与调用它的main函数放在同一源文件中,
并且类型不一致,编译器会检测到该错误。如果atof函数式单独编译的,这种不匹配的
错误就无法检测出来。
如果没有函数原型,则函数将在第一次出现的表达式中被隐式声明。函数的返回值将被
假定为int类型,但上下文并不对其参数作任何假设。
练习4-2 对atof函数进行扩充,使它可以处理形如123.45e-6的科学表示法。其中,浮点数
后面可能会紧跟一个e或E以及一个指数(可能有正负号)。
答:
#include
#include
/* atof: convert string s to double */
double atof(char s[])
{
double val, power, epow;
int i, sign, j, esign;
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
// 1. Sign
sign = (s[i] == '-') ? -1 : 1;
if (s[i] == '+' || s[i] == '-')
i++;
// 2. Integer part
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
// 3. Float part
if (s[i] == '.')
i++;
for (power = 1.0; isdigit(s[i]); i++, power *= 10)
val = 10.0 * val + (s[i] - '0');
// 4. E part
if (s[i] == 'e' || s[i] == 'E')
i++;
esign = (s[i] == '-') ? -1 : 1;
if (s[i] == '+' || s[i] == '-')
i++;
for (j = 0; isdigit(s[i]); i++) {
j = 10 * j + (s[i] - '0');
}
for (epow = 1.0; j > 0; j--) {
if (esign == -1)
epow /= 10;
else
epow *= 10;
}
return sign * val / power * epow;
}
main()
{
printf("%.2lf\n", atof("4.85E3"));
printf("%.2lf\n", atof("3.6"));
printf("%.2lf\n", atof("3.6e5"));
printf("%.2lf\n", atof("-3.6e5"));
printf("%.8lf\n", atof("-3.6e-5"));
printf("%.2lf\n", atof("3.6e12"));
}
4.3 外部变量
外部变量定义在函数之外,可以在许多函数中使用。
自动变量在其所在函数退出时消失,而外部变量是永久存在的。
C语言不允许在一个函数中定义其他函数,因此函数本身是外部的。
通过同一名字对外部变量的所有引用(即使这种引用来自于单独编译的不同函数)实际上都是引用同一个对象。
4.4 作用域
名字的作用域指的是程序中可以使用该名字的部分。
外部变量或函数的作用域从声明它的地方开始,到其所在文件的末尾结束。
例如:
main() { ... }
int sp = 0;
double val[MAXVAL];
void push(double f) { ... }
double pop(void) { ... }
在push与pop中不需进行任何声明就可以访问变量sp与val,但是这两个变量名不能用在main函数中,
push与pop函数也不能用在main函数中。
如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件中,
则必须在相应的变量声明中强制性地使用关键字extern。将外部变量的声明与定义严格区分开来很重要。
变量声明
用于说明变量的类型,而
变量定义
除此之外还将引起存储器的分配。
上面外部变量sp和val[]的定义int sp = 0; double val[MAXVAL];将会分配存储单元;而声明extern int sp;
extern double val[];则不会。定义中必须制定数组的长度,但extern声明则不一定要指定。
在一个源程序的所有源文件中,一个外部变量只能在某个文件中定义一次,而其他文件可以通过extern
声明来访问它。
4.5 头文件
首先分割文件:
主函数main单独放在main.c中;
push与pop函数放在stack.c;
getop放在getop.c
将getch与ungetch函数放在getch.c中。
之所以分割成多个文件,主要是考虑在实际的程序中,它们分别来自于单独编译的库。
此外,必须考虑定义和声明在这些文件之间的共享问题。尽可能把共享的部分集中在一起,放在
头文件calc.h中。
对于某些中等规模的程序,最好只用一个头文件存放程序中各部分共享的对象。
较大的程序需要使用更多的头文件,我们需要精心地组织它们。
4.6 静态变量
文件stack.c中定义的变量sp与val以及文件getch.c中定义的变量buf与bufp,它们仅供其所在的
源文件中的函数使用,其他函数不能访问。用static限定外部变量与函数,可以将其后声明的对象
的作用域限定为被编译源文件的剩余部分,达到隐藏外部对象的目的。
static char buf[BUFSIZE];
static int bufp = 0;
int getch(void) { ... }
void ungetch(int c) { ... }
其他函数就不能访问变量buf与bufp,因此这两个名字不会和同一程序中的其他文件中的相同名字
相冲突。
static也可用于声明函数,则该函数名除了对该函数声明所在的文件可见外,其他文件都无法访问。
static也可用于声明内部变量。static类型的内部变量是一种只能在某个特定函数中使用但一直占据
存储空间的变量。
练习4-11 修改getop函数,使其不必使用ungetch函数。
4.7 寄存器变量
register声明告诉编译器,将register变量放在机器的寄存器中。但编译器可以忽略此选项。
register int x;
f(register unsigned m)
4.8 程序块结构
变量i与程序块外声明的i无关。
if (n > 0) {
int i;
}
自动变量(包括形参)可以隐藏同名的外部变量与函数。
int x;
int y;
f(double x)
{
double y;
}
4.9 初始化
在不进行显式初始化的情况下,外部变量和静态变量都将被初始化为0;
而自动变量和寄存器变量的初值为无用的信息。
对于外部变量与静态变量来说,初始化表达式必须是常量表达式,且只初始化一次;
对于自动变量与寄存器变量,则在每次进入函数或程序块时都将被初始化。
对于自动变量与寄存器变量,初始化表达式可以不是常量表达式,表达式可以包含任意
在此表达式之前已经定义的值,包括函数调用。
数组的初始化可以在声明的后面紧跟一个初始化表达式列表。
int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
当省略数组的长度时,编译器将把花括号中初始化表达式的个数作为数组的长度。
如果初始化表达式的个数比数组元素少,则没有初始化的元素将被初始化为0。
如果初始化表达式的个数比数组元素多,则是错误的。
字符数组的初始化比较特殊:可以用一个字符串来代替初始化表达式序列。
char pattern[] = "ould"; 等价于 char pattern[] = { 'o', 'u', 'l', 'd' };
4.10 递归
将一个数作为字符串打印的情况。数字是低位先于高位生成的,但必须以与此相反的次序打印。
#include
/* printd: print n in decimal */
void printd(int n)
{
if (n <0) {
puchar('-');
n = -n;
}
if (n / 10)
printd(n / 10);
putchar(n % 10 + '0');
}
递归并不节省存储器的开销,因为递归调用过程中必须在某个地方维护一个存储处理值的栈。
递归的执行速度并不快,但递归代码比较紧凑,并且比相应的非递归代码更易于编写和理解。
在描述树等递归定义的数据结构时使用递归尤为方便。
练习4-12 运用printd函数的设计思想编写一个递归版本的itoa函数,即通过递归调用把整数
转换为字符串。
答:
#include
#include
void itoa(int n, char s[])
{
static int i;
if (n / 10)
itoa(n / 10, s);
else {
i = 0;
if (n <0)
s[i++] = '-';
}
s[i++] = abs(n) % 10 + '0';
s[i] = '\0';
}
main()
{
char s[10];
itoa(189271, s);
printf("%s\n", s);
itoa(-9012398, s);
printf("%s\n", s);
}
练习4-13 编写一个递归版本的reverse(s)函数,以将字符串s倒置。
答:
void reverser(char s[], int i, int len)
{
int c, j;
j = len - (i + 1);
if (i
c = s[i];
s[i] = s[j];
s[j] = c;
reverser(s, ++i, len);
}
}
本题不适合用递归方法来解决。
4.11 C预处理器
预处理器是编译过程中单独执行的第一个步骤。两个最常用指令:#include和#define指令。
以及其他的一些,如条件编译与带参数的宏。
文件包含
#include "文件名":在源文件所在位置查找文件
#include <文件名>
在大的程序中,#include指令是将声明捆绑在一起的较好的方法。保证了所有的源文件都具有
相同的定义和变量声明。
宏替换
#define 名字 替换文本
这是一种最简单的宏替换,后续所有出现名字记号的地方都将被替换为替换文本。
替换只对记号进行,对括在引号中的字符串不起作用。
替换文本可以是任意的,如:#define forever for(;;)
宏定义也可以带参数,这样可以对不同的宏调用使用不同的替换文本。
如#define max(A, B) ((A) > (B) ? (A) : (B))
则x = max(p+q, r+s)将被替换为x = ((p+q) + (r+s)) ? (p+q) : (r+s));
integer
int
编译
include
io
char
main
sum
get
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
int
在类中定义数组时出错 - Error on defining arrays in class
Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ...
[详细]
蜡笔小新 2023-12-14 17:38:12
int
Open judge C16H: Magical Balls 快速幂+逆元问题解析
本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ...
[详细]
蜡笔小新 2023-12-14 12:03:27
int
关于cuowu类的错误提示和使用AdjustmentListener的问题
本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ...
[详细]
蜡笔小新 2023-12-13 22:09:56
int
Java太阳系小游戏分析和源码详解
本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ...
[详细]
蜡笔小新 2023-12-14 19:53:34
int
向QTextEdit拖放文件的方法及实现步骤
本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ...
[详细]
蜡笔小新 2023-12-14 16:06:38
int
HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ...
[详细]
蜡笔小新 2023-12-14 15:08:18
int
求解hdu 1003 java题目的动态规划优化方法
本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ...
[详细]
蜡笔小新 2023-12-14 13:11:00
version
阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性
阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ...
[详细]
蜡笔小新 2023-12-14 12:40:20
int
C++省略号类型和参数个数不确定函数参数范例
本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ...
[详细]
蜡笔小新 2023-12-14 12:36:28
int
JavaSE笔试题-接口、抽象类、多态等问题解答
本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ...
[详细]
蜡笔小新 2023-12-14 10:01:13
int
Linux环境变量函数getenv、putenv、setenv和unsetenv详解
本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ...
[详细]
蜡笔小新 2023-12-13 12:01:03
int
[大整数乘法] java代码实现
本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ...
[详细]
蜡笔小新 2023-12-13 11:21:32
int
Android源码深入理解JNI技术的概述和应用
本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ...
[详细]
蜡笔小新 2023-12-13 10:00:57
filter
关于Linq to sql 实现 模糊查询 string数组
前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ...
[详细]
蜡笔小新 2023-12-13 09:34:59
int
Kotlin中扩展函数的惯用用法及其合理性
本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ...
[详细]
蜡笔小新 2023-12-12 19:17:21
yolo_bean
这个家伙很懒,什么也没留下!
Tags | 热门标签
js
request
timestamp
python2
python3
web3
loops
settings
match
random
callback
plugins
const
java
golang
instance
char
header
filter
integer
flutter
split
default
c语言
version
utf-8
runtime
int
heap
metadata
RankList | 热门文章
1
OpenGL实现中点划线法
2
C语言实现推箱子小游戏
3
VS2019使用Windows桌面应用程序模块创建Win32窗口
4
C# WinForm窗口最小化到系统托盘
5
c# 委托和事件实例学习
6
C# 系统热键注册实现代码
7
C#程序最小化到托盘图标操作步骤与实现代码
8
c#根据文件类型获取相关类型图标的方法代码
9
基于反射解决类复制的实现方法
10
C#中无边框窗体移动的简单实例
11
C#异常处理详解
12
c#打印预览控件中实现用鼠标移动页面功能代码分享
13
c#唯一值渲染实例代码
14
c#使用热键实现程序窗口隐藏示例
15
c#使用filesystemwatcher实时监控文件目录的添加和删除
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有