标签 源码 下的文章

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 回车符\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;
}

- 阅读剩余部分 -

C 不用与或改一个循环语句 小解枚举型变量

题目:

for (i = 0;i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i)
    s[i] = c;
不用&&和||的条件下编写一个与上面的for循环语句等价的循环语句

题目看着不难,我当时就想着用whileif的结合就OK了吧,结果思路方向错了,我想先ifwhile可是这样就跳过了两个条件的重复利用,先whileif才是正解,正好答案中还有枚举型的出现,就码来研究了一下。

- 阅读剩余部分 -

C 将字符串s转换为相应的整数型

将字符串s(实际上是数字)转换为相应的整数型。

来看一下这个:

int atoi(char s[])
{
    int i, n;

    n = 0;
    for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
        n = 10 * n + (s[i] - '0');

    return n;
}

刚开始的时候没看懂为什么n = 10 * n + (s[i] - '0');,然后就试着运行了一下,发现确实,如果输入56的话,输出就是56(但肯定改变了类型)

虽然还没有学到数组那个章节,可是根据前面所说的,字符串其实是字符分开储存成数组(最后有\0[当然可以忽略NULL]),他字符一格格储存的,换句话说s[0] = 5; s[1] = 6;差不多类似于这种,然后就好理解了。

关于'0'可见:http://codesky.me/archives/c-variable-const-type.wind

C 编写程序确定各种类型变量取值范围

题目:

编写一个程序以确定分别由signed和unsigned限定的char、short、int与long类型变量的取值范围。

书中说用两种,暂时只会一种,另一种说是用位运算符,难度系数就略高了……

我的输出是:

signed char min:-128
signed char max:127
int max:2147483647
int min:-2147483648
long max:2147483647l
long min:-2147483648l
short max:32767
short min:-32768
unsigned char max:255
unsigned int max:4294967295
unsigned long max:4294967295l
unsigned short max:65535

具体是要取决于你的编译器的,这里以code::blocks为例而已。关于这点,见C 变量与常量 数据类型

- 阅读剩余部分 -