我有一些C的基本知识(以及更多的C++).我得到了K&R的副本,我想用它来帮助我深入挖掘语言.什么是一个好主意,将涉及使用大多数C的功能和标准库?另外,我应该注意C89和C99之间的重要区别?
编辑:忘了提,这对于初学者来说应该是可行的.我不是要求编程教程; 相反,中等规模的东西.我知道操作系统的东西是C的主要目的之一,但这不会太复杂吗?
此外,阅读和回答问题总是一个好主意,但我想得到一些实际的练习,制作一个可以做事的程序.
我找到了一个有一些复杂的C拼图的网站.现在我正在处理这个问题:
以下是一段C代码,其目的是打印减号20次.但你可以注意到,它不起作用.
Run Code Online (Sandbox Code Playgroud)#include <stdio.h> int main() { int i; int n = 20; for( i = 0; i < n; i-- ) printf("-"); return 0; }
修好上面的代码很简单.要使问题变得有趣,您必须通过更改一个字符来修复上述代码.有三种已知的解决方案.看看你能不能得到这三个.
我无法弄清楚如何解决.我知道它可以通过改变--
来修复++
,但我无法弄清楚要改变哪个单个字符才能使它工作.
函数
f
由f(n) = n
ifn < 3
和f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3)
if 的规则定义n > 3
.编写一个f
通过递归过程计算的过程.编写一个f
通过迭代过程计算的过程.
递归地实现它很简单.但我无法弄清楚如何迭代地做到这一点.我尝试与给出的Fibonacci示例进行比较,但我不知道如何将其用作类比.所以我放弃了(羞辱我)并用Google搜索解释,我发现了这个:
(define (f n)
(if (< n 3)
n
(f-iter 2 1 0 n)))
(define (f-iter a b c count)
(if (< count 3)
a
(f-iter (+ a (* 2 b) (* 3 c))
a
b
(- count 1))))
Run Code Online (Sandbox Code Playgroud)
阅读之后,我理解代码及其工作原理.但我不明白的是从函数的递归定义到此需要的过程.我不明白代码是如何在某个人的头脑中形成的.
你能解释一下解决方案所需的思考过程吗?
似乎这个问题之前应该问过,但搜索一无所获.
我一直想知道让我们把所有代码放在类或接口中的重点是什么.我似乎记得要求main()
像C这样的函数有一些优点,但对于类没什么.从某种程度上说,像Python这样的语言比Java更具面向对象,因为它们没有原语,但你可以将代码放在任何你想要的地方.
这是对OOP的某种"误解"吗?毕竟,您可以像在C中一样编写过程代码并将其放在类中,但它不会面向对象.
我没有动态语言中数组/字典之外的哈希表的经验,所以我最近发现内部它们是通过创建键的哈希并使用它来存储值来实现的.我不明白的是,为什么不将值与键(字符串,数字等)一起存储为键,而不是存储它的哈希并存储它.
在阅读Joel的文章Back to Basics并在SO上看到许多类似的问题之后,我开始想知道什么是具体的例子,知道像C这样的东西可以让你成为更好的高级程序员.
我想知道的是,有很多例子.很多时候,这个问题的答案就像" 了解C让你更好地了解幕后发生的事情 "或" 你需要为你的计划奠定坚实的基础 ",这些答案没有多大意义.我想了解您从了解低级概念中获益的不同具体方式,
Joel给出了几个例子:二进制数据库与XML和字符串.但是有两个例子并不能证明学习C和/或汇编是正确的.所以我的问题是:知道C让你成为更好的高级程序员的具体例子是什么?
我正在写一个待办事项列表程序.它使每行保存一个文件,并允许用户添加或删除项目.问题是,由于某种原因,即使正确删除了项目,我最终会在文件的开头有很多零字节.我会告诉你一些截图,以确保我清楚自己.
在运行程序之前,这是Notepad ++中的文件:
普通待办事项列表http://img683.imageshack.us/img683/2812/beforew.png
这是删除第3项后的文件(从1开始计算):
第3项已经消失,但有NUL字节http://img190.imageshack.us/img190/9387/afterj.png
这是相关的代码.实际程序更大,但只运行此部分会触发错误.
import os
TODO_FILE = r"E:\javi\code\Python\todo-list\src\todo.txt"
def del_elems(f, delete):
"""Takes an open file and either a number or a list of numbers, and deletes the
lines corresponding to those numbers (counting from 1)."""
if isinstance(delete, int):
delete = [delete]
lines = f.readlines()
f.truncate(0)
counter = 1
for line in lines:
if counter not in delete:
f.write(line)
counter += 1
f = open(TODO_FILE, "r+")
del_elems(f, 3)
f.close()
Run Code Online (Sandbox Code Playgroud)
你能指出哪里出错了吗?
我正在编写一个小程序来进行一些数字运算,它需要在函数之间传递数组.函数应该接受并返回指针,对吧?
例如,这(我知道它可能不是最有效的):
int* reverse(int* l, int len) {
int* reversed = malloc(sizeof(*reversed)*len);
int i, j;
for (i = 0, j = len-1; i < len; i++, j--) {
reversed[j] = l[i];
}
return reversed;
}
Run Code Online (Sandbox Code Playgroud)
我使用指针吗?
让我解释.假设我想向只讲西班牙语的人教Python.如您所知,在大多数编程语言中,所有关键字都是英文的.创建一个程序可以找到给定源代码中的所有关键字并进行翻译,这有多复杂?我是否需要使用解析器和东西,或者几个正则表达式和字符串函数是否足够?
如果它依赖于源编程语言,那么Python和Javascript将是最重要的.
我的意思是"它有多复杂"是否足以拥有一个关键字列表,并解析源代码以找到不在引号中的关键字?或者是否有足够的语法怪异,需要更复杂的东西?