使用函數輸出水仙花數 (void的用法)


6-11 使用函數輸出水仙花數 (20 分)

水仙花數是指一個N位正整數(N3),它的每個位上的數字的N次冪之和等於它本身。例如:153=13​​+53​​+33​​。 本題要求編寫兩個函數,一個判斷給定整數是否水仙花數,另一個按從小到大的順序打印出給定區間(m,n)內所有的水仙花數。

函數接口定義:

int narcissistic( int number );
void PrintN( int m, int n );

函數narcissistic判斷number是否為水仙花數,是則返回1,否則返回0。

函數PrintN則打印開區間(m, n)內所有的水仙花數,每個數字占一行。題目保證100mn≤10000。

輸入樣例:

153 400

輸出樣例:

153 is a narcissistic number
370
371
1)實驗代碼
#include <stdio.h>

int narcissistic( int number );
void PrintN( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
    PrintN(m, n);
    if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);

    return 0;
}

int narcissistic( int number )

 int x,count=0,i,sum=1,a,b=0; 
 x=number;
 while(x!=0)
 { 
  x=x/10;
  count++; //這里求n的位數
 } 
 x=number; //初始化x的值 進過while函數后x變化
 while(x!=0)
 { 
  a=x%10;  //求余
  for(i=1;i<=count;i++)
  {
   sum=sum*a;  //余數累乘
  }
  b=sum+b;   //累加
  x=x/10;   //位數減1
  sum=1; //初始化i sum 的值,發現循環里面套循環 end的值會變的很大 sum也是
 } 
 if(b==number)
 { 
  return 1;
 }else
 {
  return 0; 
 }
}
 
void PrintN( int m, int n )

 int i;  //從m+1位開始
 for(i=m+1;i<n;i++)
 {                               //前面之所以使用x=number 是因為后面需要重置number的值;這里不需要重置
  if(narcissistic( i )==1)    //滿足條件為真
   printf("%d\n",i);
 }
}
 

void真正發揮的作用在於: (1) 對函數返回的限定; (2) 對函數參數的限定。

1、void的含義:

void的字面意思是“無類型”,void *則為“無類型指針”,void *可以指向任何類型的數據。void幾乎只有“注釋”和限制程序的作用,因為從來沒有人會定義一個void變量,讓我們試着來定義:

void a;

這行語句編譯時會出錯,提示“illegal use of type 'void'”。不過,即使void a的編譯不會出錯,它也沒有任何實際意義。

2、void的使用規則:

規則一:如果函數沒有返回值,那么應聲明為void類型

在C語言中,凡不加返回值類型限定的函數,就會被編譯器作為返回整型值處理。但是許多程序員卻誤以為其為void類型。例如:add ( int a, int b ){return a + b;}int main(int argc, char* argv[]){printf ( "2 + 3 = %d", add ( 2, 3) );}

程序運行的結果為輸出:2 + 3 = 5,這說明不加返回值說明的函數的確為int函數。 

規則二:如果函數無參數,那么應聲明其參數為void。

在C++語言中聲明一個這樣的函數:

int function(void)

{

return 1;

}

則進行下面的調用是不合法的:

function(2);

因為在C++中,函數參數為void的意思是這個函數不接受任何參數。在Turbo C 2.0中編譯:

#include "stdio.h"

fun()

{

return 1;

}

main()

{

printf("%d",fun(2));

getchar();

}

編譯正確且輸出1,這說明,在C語言中,可以給無參數的函數傳送任意類型的參數,但是在C++編譯器中編譯同樣的代碼則會出錯。在C++中,不能向無參數的函數傳送任何參數,出錯提示“'fun' : function does not take 1 parameters”。

所以,無論在C還是C++中,若函數不接受任何參數,一定要指明參數為void。

3、void具體使用例子:

定義函數返回值 函數名(參數1,參數2,參數3,.......){內容}int  sum(int a,int b){int c;return c;}

其中第一個int是返回值 就是別的函數調用此函數時這個函數給他的一個值。

如果調用時不需要返回值,則函數寫為void sum(int a,int b){....}  此時函數沒有返回值如果不需要參數  則int sum(void){...}此時void的意義為空,就是沒有參數的意思如果都不要  則為void sum(void);

擴展資料:

void不能代表一個真實的變量。下面代碼都企圖讓void代表一個真實的變量,因此都是錯誤的代碼:

void a; //錯誤

function(void a); //錯誤

void體現了一種抽象,這個世界上的變量都是“有類型”。

void的出現只是為了一種抽象的需要,如果你正確地理解了面向對象中“抽象基類”的概念,也很容易理解void數據類型。正如不能給抽象基類定義一個實例,我們也不能定義一個void(讓我們類比的稱void為“抽象數據類型”)變量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM