| 
| 
查看: 1208|回复: 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下限,但在这里这样用又好像太复杂了。
 | 
 |  |  |  |
 
|  |  |  
|  |  |  |  | 
            本周最热论坛帖子 |