标签 知识 下的文章

C 关于递归

经过一道杨辉三角的题,总算差不多知道了关于递归的几个问题。

  1. 递归里怎么看return
  2. 为什么说递归效率低,能不用就不用

方便阅读期间,我们直接在这里再次贴出代码:

#include <stdio.h>

int Yang(int row, int col)
{
    int len = row;
    if (row == 1 || col == 1 || col == len)
        return 1;
    if (col > len)
        return 0;
    return Yang(row - 1, col - 1) + Yang(row - 1, col);
}

int main(void)
{
    int row, i;

    scanf("%d", &row);

    for (i = 1; i <= row; ++i)
        printf("%d ", Yang(row, i));
    printf("\n");

    return 0;
}

- 阅读剩余部分 -

C 逗号运算符

逗号运算符 其实就是从左到右依次执行。

百度百科:

(1) 逗号表达式的运算过程为:从左往右逐个计算表达式。
(2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。
(3) 逗号运算符的优先级别在所有运算符中最低。

比如:

x = (y = 3, (z = ++y + 2) + 5);

首先y赋值为3,递增到4后加了2赋值给z,再加5,最后赋值11给x。
结果y为4 z为6 x为11

比如这个

printf("%d ", (num /= i, i));

最终输出的就是i的值。

说说循环

一个脑残竟然有点搞不清for循环是怎么进行的了,故mark一下。

for (initialize; test; update)首先先赋个初值,然后循环前先过一遍test,满足条件则循环,循环完再执行update,当然,可以选择性的写initialize,testupdate,可以用for( ; ; )把条件全变为空,这样也就可以不赋初值。不设置跳出循环的条件(如果写的不好就是死循环了),不累加。

还有两个循环都是whilefor常用于数字递增的话,while则运用于条件,do whilewhile的差别在于do while至少执行一次,一般whilefor更常用。

在我所接触的语言中,都是如此。

C 关于素数的两道题和相关算法

这道题目有点意思。

1.如果一个数是素数,则指出是素数,否则写出因数。
2.输入一个整数,显示所有小于等于该数的素数。

首先明确什么是素数再说,实际上概念我忘得差不多了:

質數,又称素数,指在大於1的自然数中,除了1和此整数自身外,無法被其他自然数整除的数(也可定義為只有1和本身两个因数的数)。

- 阅读剩余部分 -

C 谈谈switch

没学C的时候谈了一下break的作用Switch-Case中break的作用

这次来说说与if else的区别。

我时常在纠结switch case到底能不能加表达式,实际上,如果加了表达式,将会是一件异常方便的事,遗憾的是,switch只能是常量或者由常量组成的表达式(并且必须是整型值,包括char),否则的话就要用if else了(比如你需要一个范围),可见switch虽然结构清晰,条件确实坑爹。

C continue与break

continue时表示结束这次循环开始下一次循环(不运行接下来的语句),而break表示跳出循环结构。

但是continuebreak的使用根本是让循环简单化,如果复杂化了,还不如不用。

C 反向打印第三弹-反向打印单词

一个单词读入一个字符数组,然后反向打印出这个值。提示:使用strlen()计算数组中最后一个字符的索引。

关于strlen()在以下两篇中略有提及:
http://codesky.me/archives/c-strlen-v2.wind
http://codesky.me/archives/c-variable-const-type.wind
前者编写了等功能的函数,后者则是更加泛泛而谈了。

关于前两个反向打印:
C 编写函数实现函数字符串字符颠倒
C 输入三位数,使之变成逆序输出

这次的为什么是单词,与前两个有什么不同,当然是大有不同的了,这里我们用到了scanf()的特性——遇到空白字符就会停止读取,这是他与getchar()明显的不同,所以用getchar()写出来的其实是最有用的,而那个三位数,局限性太大,不提也罢。

- 阅读剩余部分 -

C 一个程序说说scanf()判断

一道实例引起了关于scanf()的一点特性的思考:

#include <stdio.h>

int main(void)
{
    long num;
    long sum = 0L;
    int status;

    printf("Please enter an integer to be summed. ");
    printf("(q to quit): ");
    status = scanf("%ld", &num);
    while (status == 1)
    {
        sum = sum + num;
        printf("Please enter next integer (q to quit):");
        status = scanf("%ld", &num);
    }
    printf("Those integers sum to %ld.\n", sum);
    return 0;
}

这里用到了:

    status = scanf("%ld", &num);
    while (status == 1)

很明显赋值是给num的,那么status拿来何用?看起来似乎如果输入字符与格式符号不符(不能用%ld说明符读取),就会返回0,符合则返回1,这样就可以判断输入的是否是指定的格式了。

C 输出10°到20°的正弦值

这里我们用到了<math.h>中的M_PI常量(π的值),以及sin()函数,so easy。

sin()接受的是弧度制的值,所以我们要用这个常量来转换一下,剩下的,没什么难度了。

#include <stdio.h>
#include <math.h>

int main(void)
{
    int degree;
    double radian;

    for (degree = 10; degree <= 20; degree++) {
        radian = M_PI * degree / 180;
        printf("%d   %f\n", degree, sin(radian));
    }
    return 0;
}

PHP 代码行数倒计时 说说两个文件函数

前两天看到交大平均4年10W行,然后就跃跃欲试写了一个简单的统计,其实还是表单输入而已,想了想用数据库未免太过浪费,文件函数正好不熟,故用之。

因为很简陋,没有过滤什么的,所以不演示了,自己跑下便知:

<!DOCTYPE html>
<html>
<head>
    <title>Count Code</title>
</head>
<body>
    离10W代码量还有:
    <?php
        $file = fopen('count.txt', 'r');
        $num = fgets($file);

        echo number_format($num);
        fclose($file);
    ?>
    <br/>
    <form action="index.php" method="post">
        <input type="text" placeholder="输入这次的代码行数" name="line" />
        <input type="submit" value="提交" />
    </form>
    <?php
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $line = $_POST['line'];
            $now = $num - $line;
            file_put_contents('count.txt', $now);
        }
    ?>

</body>
</html>

- 阅读剩余部分 -