C 返回数组?No!
其实早前的文章已经说过函数和数组和指针了,那么现在再来说一下归根结底还是又忘了的缘故,加上再给原来的多些扩展和补充,尽量达成互补的效果:C 几个程序,我们来聊聊数组,函数和指针
问题来源于今天三班一个学霸问我,他的程序没法运行,什么情况?
其实早前的文章已经说过函数和数组和指针了,那么现在再来说一下归根结底还是又忘了的缘故,加上再给原来的多些扩展和补充,尽量达成互补的效果:C 几个程序,我们来聊聊数组,函数和指针
问题来源于今天三班一个学霸问我,他的程序没法运行,什么情况?
题目如下:
一份计算机市场调查报告显示,市场上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()判断
学校的一道上机题:
编写程序,在整数数组中设置10个值(例如学生年龄),然后从键盘输入一个要查找的年龄,并输出查找结果。
[提示]可以利用标志变量表示查找的结果。
因为无聊,所以就用了折半查找,上次说【两分法】被鄙视了,所以这真的是二分法啦。
首先二分法需要先排序,排序可以用各种函数,也可以用冒泡排序,以前我写过关于冒泡排序(PHP实现冒泡排序),因此这里对冒泡排序是什么不多做解释,直接上代码。
题目:
编写一个函数,返回一个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,看着很舒服。
其实这个是困惑了我好久的问题,没想到在上机课做到的题里找到了答案——我的困惑是:#define
与const
到底有什么区别。
题目:
#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
的重大不同。
题目:
函数power()的功能是返回一个double类型数的某个正整数次幂。现在改进该函数,使其能正确地计算负幂。同时,用该函数实现0的任何次幂为0,并且任何数值的0次幂为1。使用循环的方法编写该函数并在一个程序中测试它。
递归在C 关于递归中讲过了一些知识,但是在写的时候我还是遇到了一些麻烦,而普通的循环却比较好想。
题目:
输入不知道多少个 [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;
}
比如 输入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));
}
}
题干:
输入一个数,输出对应层数的杨辉三角。
什么是杨辉三角:http://zh.wikipedia.org/wiki/%E6%9D%A8%E8%BE%89%E4%B8%89%E8%A7%92%E5%BD%A2
作为一个逗逼……不小心让上次的斐波那契数列题的former
和later
走错片场于是……不用在意这些细节。
这道题目有点意思。
1.如果一个数是素数,则指出是素数,否则写出因数。
2.输入一个整数,显示所有小于等于该数的素数。
首先明确什么是素数再说,实际上概念我忘得差不多了:
質數,又称素数,指在大於1的自然数中,除了1和此整数自身外,無法被其他自然数整除的数(也可定義為只有1和本身两个因数的数)。