标签 题目 下的文章

C 一道题再来说说关于scanf输入

题目如下:

一份计算机市场调查报告显示,市场上PC机的售价不同:6500,4990,5500,7200,6810,5700,5660,6900,5850,6250。编写程序,计算平均售价以及最大差价(最大差价=最高售价-最低售价)。

当然那题目给出的输入方式是不断空格的,那么难道因为这个我们就需要使用%d %d %d直到10吗?实际上并不需要,直接输入就可以了,缓冲区这个概念应该还记得,当scanf()读到空白字符(包括enter和space),剩下的并不是直接丢弃,而是存在缓冲区,而读取的时候从第一个非空白字符开始读取,所以,我们使用循环结构,一路用空格就行了,直到清空了缓冲区。

我们来看看这个程序的源码吧

#include <stdio.h>

#define NUM 10

int main(void)
{
    int i;
    float sales[NUM];
    float sum = 0, max = 0, min = 0;

    printf("Please input %d sales: \n", NUM);
    for (i = 0; i < NUM; i++) {
        scanf("%f", &sales[i]);
        sum += sales[i];
        if (i == 0) {   /* min max 初始化 */
            max = sales[i];
            min = sales[i];
        }
        if (sales[i] > max)
            max = sales[i];
        if (sales[i] < min)
            min = sales[i];
    }

    printf("ave = %f  range = %g\n", sum / NUM, max - min);

    return 0;
}

关于%g这是一个很好的新东西,在C 转换说明符%g已有介绍
扩展阅读:C 一个程序说说scanf()判断

C 说说折半查找(二分法)

学校的一道上机题:

编写程序,在整数数组中设置10个值(例如学生年龄),然后从键盘输入一个要查找的年龄,并输出查找结果。
[提示]可以利用标志变量表示查找的结果。

因为无聊,所以就用了折半查找,上次说【两分法】被鄙视了,所以这真的是二分法啦。

首先二分法需要先排序,排序可以用各种函数,也可以用冒泡排序,以前我写过关于冒泡排序(PHP实现冒泡排序),因此这里对冒泡排序是什么不多做解释,直接上代码。

- 阅读剩余部分 -

C 转换说明符%g

题目:

编写一个函数,返回一个double数组中最大的和最小的数之间的差值,并在一个简单的程序中测试这个函数。
对于题目无感,很容易,只是有一点疑惑,因为答案写的时候是
printf("The gap between  max and min is: %g\n",gap( array, WIDTH));

感觉很神奇,%g是什么?在我的笔记-说明符中并没有记录,然后翻到书上的章节里,也没有详细介绍,只是把它归类为解释成浮点型。

结果输出:

2.6
9.2
The dif between max and min is : 6.6

没有多余的0,看着很舒服。

- 阅读剩余部分 -

C define与const的不同

其实这个是困惑了我好久的问题,没想到在上机课做到的题里找到了答案——我的困惑是:#defineconst到底有什么区别。

题目:

#define N 2 
#define M N+1 
#define NUM 2*M+1 
int main(void) 
{  int i; 
   for(i=1;i<=NUM;i++)  printf(“%d\n”,i); 
} 
该程序中的for循环执行的次数是( )
A) 5 B) 6 C) 7 D) 8

答案是6,跑过以后怎么都不理解,这是因为忽略了#define的重大不同。

- 阅读剩余部分 -

C 循环与递归实现整数幂函数

题目:

函数power()的功能是返回一个double类型数的某个正整数次幂。现在改进该函数,使其能正确地计算负幂。同时,用该函数实现0的任何次幂为0,并且任何数值的0次幂为1。使用循环的方法编写该函数并在一个程序中测试它。

递归在C 关于递归中讲过了一些知识,但是在写的时候我还是遇到了一些麻烦,而普通的循环却比较好想。

- 阅读剩余部分 -

C 输入[0,100]的数,分区间统计数字个数

题目:

输入不知道多少个 [0, 100] 间的整数(直到 -1 结束)[100独立成一段]
以每 10 分为一段([0, 10), [10, 20)...),输出每一区间内整数的个数

很简单的题目……感动哭了(然后自己作死就得到了杨辉三角和分解素因数→不作死就不会死系列)

#include <stdio.h>

int main(void)
{
    int num, i, count[11];

    for (i = 0; i <= 10; i++)
        count[i] = 0;

    printf("请输入[0,100]的数\n");
    scanf("%d", &num);
    while (num != -1) {
        if(num >= 0 && num <=100)
            count[num / 10]++;
        else
            printf("请输入正确范围的数字\n");
        printf("请输入[0,100]的数\n");
        scanf("%d", &num);
    }

    for (i = 0; i <= 10; i++)
        printf("%5d", count[i]);

    return 0;
}

- 阅读剩余部分 -

C 分解素因数

比如 输入120,输出120 = 2 2 2 3 5

当然结果还是没有完全按照这个来输出,基本思路是实现了的。
可是最终我用的是递归,递归么……咳咳

#include <stdio.h>

int Prime(int num);

int main(void)
{
    int num, array[50];

    printf("请输入一个数: ");
    scanf("%d", &num);
    printf("%d = ", num);
    Prime(num);

    return 0;
}

int Prime(int num)
{
    int i;

    for (i = 2; i <= num; i++)
        if (num % i == 0) {
            printf("% d", i);
            return (Prime(num / i));
        }
}

- 阅读剩余部分 -

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

这道题目有点意思。

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

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

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

- 阅读剩余部分 -