2014年3月

C 使输入的大写英文字母变成小写

实际上,在<ctype.h>头中已经有相关函数的集成tolower()(小写变成大写是toupper()),这里我们要自己写一个也很容易,利用acsii码的差值(很常用的方法)。

#include <stdio.h>

#define DIF ('a' - 'A')

int main(void)
{
    char input;

    while ((input = getchar()) != EOF) {
        if (input >= 'A' && input <= 'Z') {
            printf("%c", input + DIF);
        } else {
            putchar(input);
        }
    }
    return 0;
}

这里我们用的常量,显得更加正规一点,并且也验证了printf()putchar()可以混合使用。

C 输入三位数,使之变成逆序输出

如题,刚开始没看到三位数,被这道题的难度吓尿了,因为那题我还有地方没搞懂,怎么才上课两周就变成同学的作业了……结果发现是三位整数,难度骤减。如果是负数再加一个判断就好了,只是我不知道= =负数逆是怎么逆的意思(毕竟不是反转字符串)

关于逆序输出,反转字符串,可见:C 编写函数实现函数字符串字符颠倒

- 阅读剩余部分 -

C 不用第三个变量,交换两个整数的值

题目如题,这道题,在PHP里做到过类似的,想来也是经典题目之一,不过,这里把难度降低了(说实在的字符串的话我还真不知道怎么反),变成了整数,因为在PHP里是有现成的list()函数,加上创建数组array()就可以了,所以比较简单(见此

实际上,在查的时候看到过这个方法,当时觉得list()不是更方便吗,所以就把这个方法忘了,这次来mark一下,主要考的是数学功底吧(( ̄▽ ̄"))

- 阅读剩余部分 -

C 斐波那契数列题目两则

师匠考我,说要写斐波那契数列,刚开始给了一道题,后来变成两道,作为算法入门题,虽然简单,但似乎确实很有教育意义,想折腾算法的不妨试试。

1、输入两个数,输出两个数间的斐波那契数列的数:如输入1 6,输出 1 1 2 3 5,输入4 4, 输出NONE
2、写一个斐波那契函数,列出第N个斐波那契数列的数,如输入0 输出0 输入3 输出2。

递归总是可以用的,但递归的效率很低,这种时候我们想到的就是“最优”,我写的不一定就是最优的,只是:有办法解决,仅此而已。

- 阅读剩余部分 -

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>

- 阅读剩余部分 -

C printf()和scanf()的*修饰符

关于printf()scanf()有个神奇的*修饰符,他和通配其实没什么关系,而且printfscanf的作用不一样,所以一个个来看吧。

#include <stdio.h>

int main(void)
{
    unsigned width, precision;
    int number = 256;
    double weight = 242.5;

    printf("What field width?\n");
    scanf("%d", &width);
    printf("The number is: %*d: \n", width, number);
    printf("Now enter a width and a precision: \n");
    scanf("%d %d", &width, &precision);
    printf("Weight = %*.*f\n", width, precision, weight);
    return 0;
}

- 阅读剩余部分 -

C 总结一下 类型与格式说明符对应表

可能会有错吧,因为光一张基本类型表感觉还是一团糟。

int %d
double/float %f
long %ld
long long %lld
char %c
short %hd
unsigned int %d
unsigned short %hu
八进制short %ho
unsigned long %lu
long double %Lf
十六进制long double %la (最后p10 表示2^10 p 表示2的指数)
指数计数法 %e (E10 表示10^10)
浮点型%g http://codesky.me/archives/c-percentg.wind

八进制 %0
十六进制 %x
前面加#如%#0则会输出如0111 %#x 如 0x2f

C 回车符\r的效果

\r叫回车符,一直没明白,回车和换行有什么区别,从理解上,回车按下去,不就换行了吗。不过亲自尝试一下,会发现截然不同。

#include <stdio.h>

int main(void)
{
    float salary;

    printf("\aEnter your desired monthly salary: ");
    printf("$_______\b\b\b\b\b\b\b");
    scanf("%f", &salary);
    printf("\n\t$%.2f a month is $%.2f a year.", salary, salary * 12.0);
    printf("\rGee!\n");
    return 0;
}

- 阅读剩余部分 -