#include?stdio.h
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的合江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
//商不能超過(guò)最大的long型數(shù),小數(shù)部分最后一位四舍五入太難了,希望能給你參考?
void?func(double?m,double?n,double?k){
long?mi,i,ki;
int?s;
mi=(long)(m/n);
m=m-mi*n;
ki=(long)k;
printf("%lf/%lf=%ld.",m,n,mi);
for(i=1;i=ki;i++){
m=m*10;
s=(int)(m/n);
printf("%d",s);
m=m-s*n;
}
}
int?main(){
double?m,n,k;
printf("請(qǐng)輸入三個(gè)正數(shù):");
while(1){
scanf("%lf%lf%lf",m,n,k);
if?(m0??n0??k0)?break;
printf("不能有負(fù)數(shù)出現(xiàn)\n請(qǐng)重新輸入三個(gè)正數(shù):");
}
func(m,n,k);
}
第五行輸出,是6 11,21
第六行輸出5,6,11
第七行輸出8,21,42
你的fun函數(shù)沒(méi)有聲明或(放在主函數(shù)前面),是錯(cuò)誤的
第六行a=5,b=6,毫無(wú)疑問(wèn),c經(jīng)過(guò)fun函數(shù)加了10為11
第七行,第一次調(diào)用fun后a=6,c=11,b=21
因?yàn)閟tatic聲明,值不丟失,第二次調(diào)用后變?yōu)?,21,42
首先給出該程序的輸出結(jié)果:48
func()函數(shù)中的m為靜態(tài)變量,意味著m在程序開始時(shí)被初始化一次,并且在程序結(jié)束前一直存在。即不會(huì)在每次調(diào)用func()函數(shù)時(shí),都會(huì)創(chuàng)建新的m。
第一次調(diào)用func(k),m的初始值為0,m+=4,m的值為4,輸出結(jié)果為4.
func(k)運(yùn)行結(jié)束后m并沒(méi)有被銷毀。
第二次調(diào)用func(k),m的值為4,m+=4,m的值為8,輸出結(jié)果為8
第一題的知識(shí)點(diǎn)是,逗號(hào)表達(dá)式,逗號(hào)表達(dá)式的值是最右邊的那個(gè)值,這個(gè)要記住了。比如說(shuō),z=(2,3,4);z是被賦予4的。那又比如說(shuō),z=((2,3),4);z還是被賦予4的。順便說(shuō)一下,因?yàn)槎禾?hào)運(yùn)算符是C中優(yōu)先級(jí)最低的一個(gè),所以括號(hào)一定要寫的。比如說(shuō)z=2,3,4;這樣的話z是被賦值為2,而3和4在編譯的時(shí)候就會(huì)出現(xiàn)warnings,說(shuō)它們沒(méi)有no efforts。
所以說(shuō)r=func ((x--,y++,x+y),z--);實(shí)際上是r=func ((6,7,13),8);即是r=func (13,8); 所以答案應(yīng)該是21.
第二題的知識(shí)點(diǎn)是實(shí)參傳遞。我想說(shuō),如果這道題有正確的編譯結(jié)果的話就是奇異的。因?yàn)?,書上說(shuō)得很明確,實(shí)參在進(jìn)行函數(shù)調(diào)用的時(shí)候,必須有確定的值,這樣才能把這些值傳遞給形參。所以這道題編譯時(shí)不成功的,因?yàn)閏的值不確定。并且,這里并沒(méi)有return語(yǔ)句,所以就算c能夠算出來(lái)也輸出不了。(這是因?yàn)檫@里是傳值,形參的改變時(shí)改變不了實(shí)參的。)如果要成功,我認(rèn)為要這么寫。#include stdio.h
int fun(int a,int b,int c)
{c=a*b;
return c;}
main()
{int c;
c=fun (2,3);printf("%d\n",c);
} 結(jié)果為6。
第三題,首先,主函數(shù)i=0時(shí),i=0傳遞給子函數(shù)n,這時(shí)s=1.0不變;接著,主函數(shù)i=1時(shí),i=1傳遞給子函數(shù)n,這時(shí)s=1.0+1.0+1.0/1=3.0;接著,主函數(shù)i=2時(shí),i=2傳遞給子函數(shù)n,這時(shí)s=3.0+1.0+1.0/1+1.0/2=5.5,輸出的時(shí)候輸出%f,沒(méi)有精度控制的話就默認(rèn)保留6到7位數(shù)字。 結(jié)果是5.500000
第四題,嗯,我覺得你應(yīng)該先自己想想,unsigned是無(wú)符號(hào)整數(shù)的意思,就是沒(méi)有負(fù)數(shù)的。k*=num%10是k=k*(num%10),(num%10)是取余數(shù)的意思。do-while語(yǔ)句,while(num)num為0時(shí)候才跳出循環(huán)。首先,實(shí)參26傳遞過(guò)去,num為26,k=1*(26%10)=1*6=6;然后num=26/10=2.6,自動(dòng)取2.(因?yàn)閚um為unsigned型);然后循環(huán),繼續(xù),k=6*(2%10)=12;num=2/10=0.5,自動(dòng)取0;這時(shí)候跳出循環(huán),返回值為k=12,即是主函數(shù)顯示12. 結(jié)果是12
#include stdio.h
int main()
{
int k = 4, m = 1, p;
p = func (k, m);
printf("p = %d\n" , p);
p = func(k, m);
printf("p = %d\n" , p);
return 0;
}
int func(int a, int b)
{
static int m,i=2;
printf("m = %d, i = %d\n" , m, i);
i += m+1;
printf("i = %d," ,i);
m = i+a+b;
printf("m = %d\n" ,m);
return(m);
}
先說(shuō)兩件事
這兩張圖片治好了我的頸椎病
static int m, i=2;
?這里面m的值沒(méi)有初始化, 這應(yīng)該是不應(yīng)該的, 我敢說(shuō)題有問(wèn)題
根據(jù)上面的打印, 可以看出我的編譯器將m的初始值定為0
為了區(qū)別兩個(gè)m, 下面將main()里面定義的m寫為大寫M
第一次func, 輸入值a = k = 4, b = M = 1
i = ?i + m + 1 = 2 + 0 + 1 = 3
m = i + a + b = 3 + 4 + 1 = 8
第一次func, 輸入值a = k = 4, b = M = 1
i = ?i + m + 1 = 3 + 8 + 1 = 12
m = i + a + b = 12 + 4 + 1 = 17
這題主要考的就是全局變量局部變量區(qū)別, 靜態(tài)變量與非靜態(tài)變量的區(qū)別
在func里面定義的m作用域就在func函數(shù)里面,
在main()函數(shù)里面出現(xiàn)相同的變量m作用域是在main()函數(shù)里, 有區(qū)別
static類型的靜態(tài)變量有個(gè)特點(diǎn), 就是只初始化一次
第一次調(diào)用func() 將m, i 的數(shù)值初始化了,
并且經(jīng)過(guò)運(yùn)算最總 m =8, i = 3
第二次調(diào)用func()的時(shí)候m, i的數(shù)值不再次初始化, 依然是以前的數(shù)值 8, 3
該函數(shù)參數(shù)傳遞屬于值傳遞;
對(duì)于這個(gè)程序所謂值傳遞就是在func函數(shù)把x的地址上的值拷貝過(guò)去,函數(shù)只是對(duì)臨時(shí)分配的棧中內(nèi)容進(jìn)行操作,此時(shí)x內(nèi)存地址上的值是8,所以調(diào)用到func時(shí)就是8+8=16了;