FaGe's Blog

吹啊吹啊。

标签:return

共 14 篇文章

练习21.函数的返回值

练习21.函数的返回值 你已经学过使用=给变量命名,将变量定义为某个数字或者字符串。接下来我们将让你见证更多奇迹。我们要给你演示如何使用=以及一个新的Python关键字return来将变量设置为“一个函数的值”。有一点你需要极其注意,不过我们先来编写下面的脚本吧: def add(a, b): print "ADDING %d + %d" % (a, b) return a + b def subtract(a, b): print "SUBTRACTING %d - %d" % (a, b) return a - b def multiply(a, b): print "MULTIPLYING %d * %d" % (a, b) return a * b def divide(a, b): print "DIVIDIN...

阅读全文

练习47:一个快速的URL路由

练习47:一个快速的URL路由 原文:Exercise 47: A Fast URL Router 译者:飞龙 我现在打算向你展示使用TSTree来创建服务器中的快速URL路由。它适用于应用中的简单的URL匹配,而不是在许多Web应用框架中的更复杂(一些情况下也不必要)的路由发现功能。 我打算编程一个小型命令行工具和路由交互,他叫做urlor,读取简单的路由文件,之后提示用户输入要检索的URL。 #include <lcthw/tstree.h> #include <lcthw/bstrlib.h> TSTree *add_route_data(TSTree *routes, bstring line) { struct bstrList *data = bsplit(line, ' '); check(data-...

阅读全文

练习42:栈和队列

练习42:栈和队列 原文:Exercise 42: Stacks and Queues 译者:飞龙 到现在为止,你已经知道了大多数用于构建其它数据结构的数据结构。如果你拥有一些List、DArray、Hashmap 和 Tree,你就能用他们构造出大多数其它的任何结构。你碰到的其它任何结构要么可以用它们实现,要么是它们的变体。如果不是的话,它可能是外来的数据结构,你可能不需要它。 Stack和Queue是非常简单的数据结构,它们是List的变体。它们是List的弱化或者转换形式,因为你只需要在List的一端放置元素。对于Stack,你只能能够在一段压入和弹出元素。而对于Queue,你只能够在...

阅读全文

练习35:排序和搜索

练习35:排序和搜索 原文:Exercise 35: Sorting And Searching 译者:飞龙 这个练习中我打算涉及到四个排序算法和一个搜索算法。排序算法是快速排序、堆排序、归并排序和基数排序。之后在你完成基数排序之后,我打算想你展示二分搜索。 然而,我是一个懒人,大多数C标准库都实现了堆排序、快速排序和归并排序算法,你可以直接使用它们: #include <lcthw/darray_algos.h> #include <stdlib.h> int DArray_qsort(DArray *array, DArray_compare cmp) { qsort(array->contents, DArray_count(array), sizeof(void *), cmp); return 0; } ...

阅读全文

练习30:自动化测试

练习30:自动化测试 原文:Exercise 30: Automated Testing 译者:飞龙 自动化测试经常用于例如Python和Ruby的其它语言,但是很少用于C。一部分原因是自动化加载和测试C的代码片段具有较高的难度。这一章中,我们会创建一个非常小型的测试“框架”,并且使用你的框架目录构建测试用例的示例。 我接下来打算使用,并且你会包含进框架目录的框架,叫做“minunit”,它以Jera Design所编写的一小段代码作为开始,之后我扩展了它,就像这样: #undef NDEBUG #ifndef _minunit_h #define _minunit_h #include <stdio.h> #include <dbg.h> #include <st...

阅读全文

练习25:变参函数

练习25:变参函数 原文:Exercise 25: Variable Argument Functions 译者:飞龙 在C语言中,你可以通过创建“变参函数”来创建你自己的printf或者scanf版本。这些函数使用stdarg.h头,它们可以让你为你的库创建更加便利的接口。它们对于创建特定类型的“构建”函数、格式化函数和任何用到可变参数的函数都非常实用。 理解“变参函数”对于C语言编程并不必要,我在编程生涯中也只有大约20次用到它。但是,理解变参函数如何工作有助于你对它的调试,并且让你更加了解计算机。 /** WARNING: This code is fresh and potentially isn't correct yet. *...

阅读全文

练习23:认识达夫设备

练习23:认识达夫设备 原文:Exercise 23: Meet Duff's Device 译者:飞龙 这个练习是一个脑筋急转弯,我会向你介绍最著名的C语言黑魔法之一,叫做“达夫设备”,以“发明者”汤姆·达夫的名字命名。这一强大(或邪恶?)的代码中,几乎你学过的任何东西都被包装在一个小的结构中。弄清它的工作机制也是一个好玩的谜题。 注 C的一部分乐趣来源于这种神奇的黑魔法,但这也是使C难以使用的地方。你最好能够了解这些技巧,因为他会带给你关于C语言和你计算机的深入理解。但是,你应该永远都不要使用它们,并总是追求简单易读的代码。 达夫设备由汤...

阅读全文

练习16:结构体和指向它们的指针

练习16:结构体和指向它们的指针 原文:Exercise 16: Structs And Pointers To Them 译者:飞龙 在这个练习中你将会学到如何创建struct,将一个指针指向它们,以及使用它们来理解内存的内部结构。我也会借助上一节课中的指针知识,并且让你使用malloc从原始内存中构造这些结构体。 像往常一样,下面是我们将要讨论的程序,你应该把它打下来并且使它正常工作: #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h> struct Person { char *name; int age; int height; int weight; }; struct Person...

阅读全文

练习14:编写并使用函数

练习14:编写并使用函数 原文:Exercise 14: Writing And Using Functions 译者:飞龙 到现在为止,你只使用了作为stdio.h头文件一部分的函数。在这个练习中你将要编写并使用自己的函数。 #include <stdio.h> #include <ctype.h> // forward declarations int can_print_it(char ch); void print_letters(char arg[]); void print_arguments(int argc, char *argv[]) { int i = 0; for(i = 0; i < argc; i++) { print_letters(argv[i]); } } void print_letters(char arg[]) { int i = 0; for(i = 0; arg[i] != ...

阅读全文

练习13:Switch语句

练习13:Switch语句 原文:Exercise 13: Switch Statement 译者:飞龙 在其它类似Ruby的语言中,switch语句可以处理任意类型的表达式。一些语言比如Python没有switch语句,因为带有布尔表达式的if语句可以做相同的事情。对于这些语言,switch语句比if语句更加灵活,然而内部的机制是一样的。 C中的switch语句与它们不同,实际上是一个“跳转表”。你只能够放置结果为整数的表达式,而不是一些随机的布尔表达式,这些整数用于计算从swicth顶部到匹配部分的跳转。下面有一段代码,我要分解它来让你理解“跳转表”的概念: #include <stdio.h> int m...

阅读全文