查看: 1039|回复: 18
|
一个基本的数学程式!!!
[复制链接]
|
|
发表于 18-5-2006 01:53 PM
|
显示全部楼层
还米有测试过
#include <stdio.h>
int main ()
{
int max=0,sec=0,num,counter=1;
printf ("Enter 10 integer number:");
while (counter<=10)
{
scanf ("%d",&num);
if(num>max)
{
sec=max;
max=num;
}
counter++;
}
printf ("The two largest number are %d and %d\n",max,sec);
return 0;
} |
|
|
|
|
|
|
|
发表于 18-5-2006 01:55 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 18-5-2006 04:30 PM
|
显示全部楼层
我的 C 已经忘到一干二净... 所以我用 Java 来写, 基本上是一样, 只要你把所有的 scanf 收录成一个 array 再来做以下的 code 即可.
int[] number_array = {100,67, 88, 41, 21, 32, 43, 99, 67, 82, 100, 32}; // 例子
int max = 0, sec = 0;
for (int x = 0; x < number_array.length; x++) {
if (number_array[x] > max) {
sec = max;
max = number_array[x];
}
if ((sec == 0 || number_array[x] > sec) && number_array[x] < max)
sec = number_array[x];
}
[ 本帖最后由 goatstudio 于 18-5-2006 04:32 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 18-5-2006 04:45 PM
|
显示全部楼层
原帖由 ahjing 于 18-5-2006 11:57 AM 发表
#include <stdio.h>
int main ()
{
int max,sec,num,counter=1;
//你的max和sec没有给一个initial value,就去做比较,有可能会出错
printf ("Enter 10 integer number:";
while (counter<=10)
{
scanf ("%d",&num);
if (counter==1)
{if (num>max) //刚开始的时候,max = 什么?
sec=max;//刚开始的时候,max = 什么?
max=num;
if (num<=max)
sec=num;
counter++;}
else
{if (num>max)
sec=max;
max=num;/*这个max=num你是不是要放在if(num>max)里的?因为你没有括号{ },所以无论num>max or num<=max,他都会执行max=num;这样就有问题了*/
counter++;}
}
printf ("The two largest number are %d and %d\n",max,sec);
return 0;
}
#include <stdio.h>
int main ()
{
int max,sec,num,counter=1;
printf ("Enter 10 integer number:");
while (counter<=10)
{
scanf ("%d",&num);
if (counter == 1)
{
max=num;
}
else if (counter == 2)
{
if (num>max)
{
sec=max;
max=num;
}
else
sec=num;
}
else
{
if (num>max)
{
sec=max;
max=num;
}
else if (num>sec)
sec=num;
}
counter++;
}
printf ("The two largest number are %d and %d\n",max,sec);
return 0;
}
应该没问题了,但还没优化,应该把counter == 1和counter == 2 放在后面来比较,整体会快很多。 |
|
|
|
|
|
|
|
发表于 18-5-2006 08:38 PM
|
显示全部楼层
原帖由 goatstudio 于 18-5-2006 04:30 PM 发表
我的 C 已经忘到一干二净... 所以我用 Java 来写, 基本上是一样, 只要你把所有的 scanf 收录成一个 array 再来做以下的 code 即可.
int[] number_array = {100,67, 88, 41, 21, ...
may be can change this:
- if (number_array[x] > max) {
- sec = max;
- max = number_array[x];
- }
-
- if ((sec == 0 || number_array[x] > sec) && number_array[x] < max)
- sec = number_array[x];
复制代码
to
- if( number_array[x] > sec) {
- sec = number_array[x];
-
- if( sec > max) {
- sec = sec ^ max;
- max = sec ^ max;
- sec = sec ^ max;
- }
- }
复制代码
[ 本帖最后由 astral 于 18-5-2006 08:42 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 18-5-2006 11:30 PM
|
显示全部楼层
谢谢qiyan 兄的相助!!!可是你写的程式有点复杂,有点看不明白!! |
|
|
|
|
|
|
|
发表于 18-5-2006 11:51 PM
|
显示全部楼层
回复 #7 ahjing 的帖子
其实你只要把第一个数值assign去max~
然后拿第二个来比,当第二个大过第一个就把第一个assign去 sec
然后再把第二个assign去max一直做到最后就可以了!! |
|
|
|
|
|
|
|
发表于 19-5-2006 12:22 AM
|
显示全部楼层
ahjing,
这是你写的:
#include <stdio.h>
int main ()
{
int max,sec,num,counter=1;
printf ("Enter 10 integer number: " );
while (counter<=10)
{
scanf ("%d",&num);
if (counter==1)
{
if (num>max)
//这里漏掉 “{”
sec=max;
max=num;
//这里漏掉 “}”
if (num<=max)
//这里漏掉 “{”
sec=num;
counter++;
//这里漏掉 “}”
}
else
{
if (num>max)
//这里漏掉 “{”
sec=max;
max=num;
//这里漏掉 “}”
这里应该再加以下几行
else
{
if (num>sec)
{
sec = num;
}
}
counter++; //这行不应该在这里
}
上面黑色 counter ++; 应该放在这里
}
printf ("The two largest number are %d and %d\n",max,sec);
return 0;
} |
|
|
|
|
|
|
|
发表于 19-5-2006 07:36 PM
|
显示全部楼层
if (number_array[x] > max) {
sec = max;
max = number_array[x];
}
if ((sec == 0 || number_array[x] > sec) && number_array[x] < max)
sec = number_array[x];
看起來有點亂.
原帖由 疯牛 于 18-5-2006 11:51 PM 发表
其实你只要把第一个数值assign去max~
然后拿第二个来比,当第二个大过第一个就把第一个assign去 sec
然后再把第二个assign去max一直做到最后就可以了!!
可以直接在一開始把 max 和 sec 設定為 0
max = 0;
sec = 0;
while (...) {
if( number_array[x] >= max) {
sec = max;
max = number_array[x];
}
} |
|
|
|
|
|
|
|
发表于 19-5-2006 08:32 PM
|
显示全部楼层
原帖由 flashang 于 19-5-2006 07:36 PM 发表
看起來有點亂.
可以直接在一開始把 max 和 sec 設定為 0
max = 0;
sec = 0;
while (...) {
if( number_array >= max) {
sec = max;
max = number_array;
}
}
这样可能会拿不到两个最大值
eg:16, 2, 8, 9, 13, 1
本来应该是16,13
结果变成了0, 16
我想暂时羊兄的方法比较好。。。只是compare的次数比较多,所以我把那部分换成swap...
1. if max > array[index] then max = array[index]
2. if max > sec then swap <---- *
[ 本帖最后由 astral 于 19-5-2006 08:38 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 20-5-2006 09:55 AM
|
显示全部楼层
原帖由 astral 于 19-5-2006 08:32 PM 发表
这样可能会拿不到两个最大值
eg:16, 2, 8, 9, 13, 1
本来应该是16,13
结果变成了0, 16
我想暂时羊兄的方法比较好。。。只是compare的次数比较多,所以我把那部分换成swap...
1. if max > array t ...
oops, 忘了第二大的比較
修改後 :
max = 0;
sec = 0;
while (...) {
if( number_array[n] >= sec) {
sec = number_array[n];
}
if( number_array[n] >= max) {
sec = max;
max = number_array[n];
}
}
[ 本帖最后由 flashang 于 20-5-2006 09:58 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 21-5-2006 02:56 AM
|
显示全部楼层
回复 #11 astral 的帖子
那里有羊兄??
其实大家都忘记了~
楼主只是需要到一个简单的program
大家的解答都太复杂化了~
大家只需要给予他简单的概念就可以了~
而且大家给的答案都太复杂化的话,对于programming的初学者会造成一定的障碍! |
|
|
|
|
|
|
|
发表于 21-5-2006 09:22 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 22-5-2006 08:43 AM
|
显示全部楼层
原帖由 疯牛 于 21-5-2006 02:56 AM 发表
那里有羊兄??
其实大家都忘记了~
楼主只是需要到一个简单的program
大家的解答都太复杂化了~
大家只需要给予他简单的概念就可以了~
而且大家给的答案都太复杂化的话,对于programming的初学者会造成一定的障碍!
没有复杂啊,都很直接明了,要花点心思看。
你#2楼post的,有点问题:
1。有负数的话就错。
2。第一个input如果是最大的话,sec永远 = 0。eg. 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 |
|
|
|
|
|
|
|
发表于 22-5-2006 08:49 AM
|
显示全部楼层
原帖由 flashang 于 20-5-2006 09:55 AM 发表
oops, 忘了第二大的比較
修改後 :
max = 0;
sec = 0;
while (...) {
if( number_array >= sec) {
sec = number_array;
}
if( number_array >= max) {
sec ...
嗯,如果是 -10,-9,-8,-7,-6,-5,-4,-3...就不行了 |
|
|
|
|
|
|
|
发表于 22-5-2006 10:39 AM
|
显示全部楼层
原帖由 qiyan 于 22-5-2006 08:49 AM 发表
嗯,如果是 -10,-9,-8,-7,-6,-5,-4,-3...就不行了
max = −32768;
sec = −32768;
其實任何程式都有最大以及最小的限制
就看設計時考慮的因素 |
|
|
|
|
|
|
|
发表于 22-5-2006 10:56 AM
|
显示全部楼层
關于 #5 的例子
if (counter == 1)
{
max=num;
}
else if (counter == 2)
{
if (num>max)
{
sec=max;
max=num;
}
else
sec=num;
}
else
{
if (num>max)
{
sec=max;
max=num;
}
else if (num>sec)
sec=num;
}
counter++;
可以寫成
switch( counter ) {
1:
max=num;
break;
2:
if (num>max) {
sec=max;
max=num;
} else
sec=num;
break;
default:
if (num>max) {
sec=max;
max=num;
} else if (num>sec)
sec=num;
break;
}
但是
只有輸入 第一個數字時才會執行 1: 第二個數字時才會執行 2:
第三開始全部執行 default
而如果預先設定 max, sec, 那麼 default 裡面的可以代替 1; 以及 2: |
|
|
|
|
|
|
|
发表于 22-5-2006 02:24 PM
|
显示全部楼层
原帖由 flashang 于 22-5-2006 10:56 AM 发表
關于 #5 的例子
可以寫成
switch( counter ) {
1:
max=num;
break;
2:
if (num>max) {
sec=max;
max=num;
} else
...
楼主没说int是2 bytes。visual C++上, gnu上就不是2 bytes了。预先设定的话程序就有依赖了,写程序就要写generic的,通用的。能够就是用precompiler来define int下限,但在这里这样用又好像太复杂了。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|