史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   急....這程式我寫不出來 (http://forum.slime.com.tw/thread174263.html)

leowang 2006-05-11 10:22 AM

急....這程式我寫不出來
 
這c語言程式我寫不出來
http://home.pchome.com.tw/web/itaxd/01.bmp

mini 2006-05-11 11:45 AM

<第一算式>
x的k次方 就是
int i;

for(i=1; i<k; i++) x=x*x;
return x;

<第二算式>
k! 就是
int i, k_sum=1; //k_sum表示k! 的和

for(i=1; i<=k; i++) k_sum=k_sum*i;
return k_sum;


那Σ ,n , k=1
就是表示
累加 n 次 <第一算式> 除以 <第二算式>
double sum=0;

for(i=0; i<n; i++) /* sum= sum + <第一算式> 除以 <第二算式> */;

mini 2006-05-11 12:05 PM

試寫了一下
不知對不對

語法:

#include <stdio.h>
#include <stdlib.h>

/* x的k次方 */
double xx(double x, int k)
{
int i;

  for(i=1; i<k; i++) x=x*x;
  return x;
}

/* k! */
int kk(int k)
{
int i, k_sum=1; //k_sum表示k! 的和

  for(i=1; i<=k; i++) k_sum=k_sum*i;
  return k_sum;
}

/*函式 my_fun */
double my_fun(double x, int n)
{
  double sum=0;
  int i, k=1;

  for(i=k; i<=n; i++){
    sum=sum+(xx(x,i) / kk(i));
  }
 
  return sum;
}

int main(int argc, char *argv[])
{

  printf("%f", my_fun(0.1, 8));
   
  system("PAUSE");       
  return 0;
}


getter 2006-05-11 12:32 PM

語法:

/*
數學式︰
 n  x^k  x^1  k^2        k^n
Σ ═--─═--- + --- + ... + ---
 k=1  k!    1!    2!          n!
 
let x = 0.1 ; n = 8
*/
#include <stdio.h>
#include <stdlib.h>

double my_fun(double x,int n) /* 數學運算式 */
{
int i,j;
double sum = 0;
for(i=j=1; i<=n; i++)
  {
    j*=i; /* 計算 n! 是多少階乘,既 1×2×..n */
    sum += pow(x,i)/j ; /* 計算 x次方 ÷n! 的加總 */
    /* pow(x值,i次方)函式 */
  }
return sum;
}

display_00() /* 顯示畫面 */
{
system("cls");
puts("數學公式:");
puts(" n  x^k  x^1  k^2        k^n");
puts("Σ = --- = --- + --- + ... + ---");
puts(" k=1  k!    1!    2!          n!");
puts("\n let x = 0.1 ; n = 8");
}

main() /* 主程式 */
{
display_00();
printf("\nSUM = %0.16f \n\n",my_fun(0.1,8) );
system("pause");
}

原來 mini 大已經寫好啦 ...
應該是對的 ... 答案跟 mini 大的一樣

這種 運算式算是有規律性值得,如 p(n,r)
可以用 for/while loop 或 遞回函式去寫

PS. 遞回函式,某些程式碼可能變的很簡單,也時有變的更複雜 ...。

getter 2006-05-11 03:33 PM

這是遞回函式的寫法 ... 因為... 所以... 用到了 2 個遞回函式

1. n! 求階乘的遞回函式
2. 運算加總的遞回函式,用 switch() 的方法。

供參考

檔案下載 (原始碼+執行檔)
http://rapidshare.de/files/20164379/SUMS.rar.html


語法:

/*
遞回函式06-1
數學式︰
 n  x^k  x^1  k^2        k^n
Σ ═---═--- + --- + ... + ---
 k=1  k!    1!    2!          n!
 
let x = 0.1 ; n = 8
*/
#include <stdio.h>
#include <stdlib.h>

fact(int n) /* 遞回函式,求 n! 階乘 */
{
int sum = 1;
if (n==0 || n==1)
  { return 1; }
else
  {
    sum = n * fact(n-1);  /* 自己呼叫自己做連乘到 n  */
    return sum;
  }
}

double my_fun(double x,int n) /* 遞回函式,數學式加總 */
{
int i=1;
switch (n)
      {
        case 0:  /* n 為 0 的狀況 */
        return pow(x,0)/i;  /* 可以用 return 1; 取代 */
               
        case 1:  /* n 為 1 的狀況 */
        i = fact(n);       
          return pow(x,1)/i;
               
            default: /* n > 1 的狀況 */
        i = fact(n);
        return my_fun(x,n-1)+pow(x,n)/i;  /* 自己呼叫自己加總到 n */
      }
}

display_00() /* 顯示畫面 */
{
system("cls");
puts("數學公式:");
puts(" n  x^k  x^1  k^2        k^n");
puts("Σ = --- = --- + --- + ... + ---");
puts(" k=1  k!    1!    2!          n!");
puts("\n let x = 0.1 ; n = 8");
}

main() /* 主程式 */
{
int x;
 
display_00();

for(x=0; x<=8; x++) /* 依序顯示 n = 0 ~ 8 的值 */ 
  {
    printf("\n n=%d,SUM = %0.16f",x,my_fun(0.1,x));
  }
puts("\n");
system("pause");
}

1. n! 求階乘的遞回函式
2. 運算加總的遞回函式,用 if - else if - else 的方法 。

語法:

/*
遞回函式06-2
數學式︰
 n  x^k  x^1  k^2        k^n
Σ ═---═--- + --- + ... + ---
 k=1  k!    1!    2!          n!
 
let x = 0.1 ; n = 8
*/
#include <stdio.h>
#include <stdlib.h>

fact(int n) /* 遞回函式,求 n! 階乘 */
{
int sum = 1;
if (n==0 || n==1)
  { return 1; }
else
  {
    sum = n * fact(n-1);
    return sum;
  }
}

double my_fun(double x,int n) /* 遞回函式,數學式加總 */
{
int i=1;
if (n==0)  /* n 為 0 的狀況 */
    return pow(x,0)/i; /* 可以用 return 1; 取代 */
       
else if ( n==1 ) /* n 為 1 的狀況 */
        return x;

else  /* n > 1 的狀況 */
    {
    i = fact(n);
    return my_fun(x,n-1)+pow(x,n)/i; 
    }
}

display_00() /* 顯示畫面 */
{
system("cls");
puts("數學公式:");
puts(" n  x^k  x^1  k^2        k^n");
puts("Σ = --- = --- + --- + ... + ---");
puts(" k=1  k!    1!    2!          n!");
puts("\n let x = 0.1 ; n = 8");
}

main() /* 主程式 */
{
int x;

display_00();

for(x=0; x<=8; x++) /* 依序顯示 n = 0 ~ 8 的值 */
  {
    printf("\n n=%d,SUM = %0.16f",x,my_fun(0.1,x));
  }
puts("\n");
system("pause");
}


leowang 2006-05-11 06:43 PM

語法:

#include <stdio.h>
#include <stdlib.h>

void my_fun(double,int);
int pow(double,int);
int factorial(int);
int main(void)
{
    double x=0.1;
    int n=8;
    my_fun(x,n);
    system("pause");
    return 0;
}
void my_fun(double x, int n)
{
    double result=0;
    int i;
    for (i=1;i<=n;i++)
    result=result+(pow(x,i)/factorial(i));
    printf("%f\n",result);
 }
int pow(double x, int k)
{
  int i;

  for(i=1; i<k; i++) x=x*x;
 
}

     
int factorial (int n)
{
    if (n==1)
    return 1;
    else
    return n * factorial(n-1);
}

這是我寫的~~有錯誤耶
但不知道該怎麼改~~請大大幫幫忙

getter 2006-05-11 10:46 PM

引用:

作者: leowang
[code]
#include <stdio.h>
#include <stdlib.h>

void my_fun(double,int);
int pow(double,int);
int factorial(int);
int main(void)
{
...


int pow(double,int);


int pow(double x, int k)
{
int i;

for(i=1; i<k; i++) x=x*x;
}

直接刪掉就好啦

因為 pow(x,y); 是 C 語言內建的函數指令 ... 不需要自己寫副函式

就能直接用,好像是包在 stdlib.h 裏面 ...

改好的...程式
語法:

#include <stdio.h>
#include <stdlib.h>

void my_fun(double,int);

int factorial(int);
int main(void)
{
    double x=0.1;
    int n=8;
    my_fun(x,n);
    system("pause");
    return 0;
}
void my_fun(double x, int n)
{
    double result=0;
    int i;
    for (i=1;i<=n;i++)
    result=result+(pow(x,i)/factorial(i));
    printf("%0.16f\n",result);
 }
     
int factorial (int n)
{
    if (n==1)
    return 1;
    else
    return n * factorial(n-1);
}

再來是有關 %f 的部份 ...

%-xn.mf
- 從強制從最左邊開始印(預設是從右邊,沒有減號時)。
x 要不要將空未補零值
n 指的是小數點左邊顯示幾位數
m 指的是右邊顯示幾位數。

ex 1: printf("%10.3f",12.123456);
顯示 10.123

ex 2: printf("%010.3f",12.123456);
顯示 0000000010.123

ex 2: printf("%-10.3f",12.123456);
顯示 10.123

%-xnd
- 從強制從最左邊開始印(預設是從右邊,沒有減號時)。
x 要不要將空未補零值
n 指的是小數點左邊顯示幾位數

mini 2006-05-13 08:24 PM

引用:

作者: tom7797835
突然覺得mini大程式語言好強...
C語言和vb都會寫...
真強...
不曉得MINI大大是如何將程式語言學得那麼好呢?!

沒這麼厲害啦~
每個人有適合自己的東西及學習方法

離開學校後有4~5年沒碰程式語言
但只要手上能查到語法(舊書及WWW)
剩下的就是 想像力及一點點的邏輯+微弱的程式語言基礎

.寫作期間的"熱衷"是 學習的基礎 及 完成度的助力
.看別人程式要找重點 (要完全看的懂他人的寫作,不可能...起碼對個人來說~)
.將功能、能想到的抽象東西 及 有助力 的東西畫出來 (管他畫出什麼,自己喜歡就好)
.可以的話寫程式語言盡量模組化,打個比方:
要寫一個紅綠燈程式
語法:

main()
{
  do{
    亮燈副程式(哪一個燈參數)
    跳出條件之輸入
  loop until(是否為跳出條件)
}

※以上不是什麼語言,要寫成C的話 語法不記得就上WWW查,想像力及模組化(函式化)才是重點

當然 語法的基礎是不可缺少的東西
只是可靠上WWW來補足
相形之下
此時關鍵字的搜尋經驗就影響到順利度
最後久而久之累積經驗...


所有時間均為台北時間。現在的時間是 06:28 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1