bwc語言
#include<stdio.h>
void main()
{
int a;
int b,c,d;//記錄各個位上的數
printf("輸入一個3位正整數\n");
scanf("%d",&a);
b=a/100;
c=(a-b*100)/10;
d=a%10;
printf("%d\n%d\n%d\n",b,c,d);
printf("%5d,%5d,%5d\n",100*b+10*c+d,c*100+10*d+b,d*100+10*c+b);
}
在vc++中編譯通過
Ⅱ C語言問題
喂,sqrt是math.h里的函數。
你還沒有引入啊~
加一句#include <math.h>
就搞定了~
O(∩_∩)O~
---------------------------------------
#include <stdio.h>
#include <math.h>
int jsValue(int bb[])
{
int i,k=0;
printf("k=%d\n", k);
double j;
for(i=100;i<999;i++)
{
int bw=i/100;
int sw=i%100/10;
int gw=i%10;
j=(sqrt(i)*sqrt(i));
if((int)j!=i)
continue;
if(bw==sw||bw==gw||sw==gw)
bb[k++]=i;
}
printf("k=%d\n", k);
return k;
}
void writeDat(int num, int b[])
{
FILE *out;
int i;
out = fopen("out.dat", "w");
printf("%d\n", num);
fprintf(out, "%d\n", num);
for (i=0; i<num; i++)
{
printf("%d\n", b[i]);
fprintf(out, "%d\n", b[i]);
}
fclose(out);
}
void main()
{
int b[1000], num;
num = jsValue(b);
writeDat(num, b);
}
試試這個?你是只給了20個位置,存了幾百個數。
Ⅲ c語言中的語句if ((qw<=gw)&&(bw<=sw))與if (qw<=gw&&bw<=sw)有區別嗎
沒區別,&&優先順序低
Ⅳ C語言的程序錯誤簡單的很
switch case 的用法錯了,等等我給你寫個正確的。
寫好了,另外你判斷閏年的函數也有邏輯錯誤,我給你改過來了。
我把你的錯誤大概總結一下:
1.你對函數實參和形參的理解有誤,這個還是應該好好看看,就是說你在main函數里定義的yue和在ww里定義的yue不是一個,你這樣直接引用的話,改了一個,另一個不會改。
2.你對函數的理解有誤,函數只是返回一個值,而不是替換語句,主函數里沒有的語句,你在ww函數里寫了,主函數里仍然沒有,這點你把函數和宏弄混了。
3.再看看switch case的用法吧,要是一定要用這個結構,你留言,我再寫一個。
#include <stdio.h>
int bw( int );
int ww( int , int , int );
void main()
{
int nian, yue , ri ;
int wb =0 ;
printf("輸入你需要的日期,使用-分割");
scanf ("%d-%d-%d",&nian ,&yue ,&ri);
wb = ww( nian , yue , ri );
printf("今天是今年的第%d天\n", wb );
}
int bw(int nian)
{
int pingrunnian;
pingrunnian=(nian%4 == 0 && (nian %100 != 0 || nian % 400 == 0));
return pingrunnian;
}
int ww(int nian , int yue , int ri )
{
int i;
int ret = 0;
int yuefentianshu[13] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
if( bw(nian) )
{
yuefentianshu[2] = 29;
}
for( i = 1; i < yue ; i++ )
{
ret += yuefentianshu[i];
}
ret += ri;
return ret;
}
////////////////////////////////////////////////////
//以下是用switch case結構寫的,兩者只能用1個 //
////////////////////////////////////////////////////
#include <stdio.h>
int bw( int );
int ww( int , int , int );
void main()
{
int nian, yue , ri ;
int wb =0 ;
printf("輸入你需要的日期,使用-分割");
scanf ("%d-%d-%d",&nian ,&yue ,&ri);
wb = ww( nian , yue , ri );
printf("今天是今年的第%d天\n", wb );
}
int bw(int nian)
{
int pingrunnian;
pingrunnian=(nian%4 == 0 && (nian %100 != 0 || nian % 400 == 0));
return pingrunnian;
}
int ww(int nian , int yue , int ri )
{
int ret = 0;
int yuefentianshu[13] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
if( bw(nian) )
{
yuefentianshu[2] = 29;
}
switch( yue)
{
case 12:
ret += yuefentianshu[11];
case 11:
ret += yuefentianshu[10];
case 10:
ret += yuefentianshu[9];
case 9:
ret += yuefentianshu[8];
case 8:
ret += yuefentianshu[7];
case 7:
ret += yuefentianshu[6];
case 6:
ret += yuefentianshu[5];
case 5:
ret += yuefentianshu[4];
case 4:
ret += yuefentianshu[3];
case 3:
ret += yuefentianshu[2];
case 2:
ret += yuefentianshu[1];
case 1:
;
}
ret += ri;
return ret;
}
Ⅳ bw.sw.gw.nw表示什麼,c語言編程里的
bw結構體裡面的有sw結構體 sw結構體裡面有gw結構體 gw結構體裡面有nw成員,現在需要調用nw成員變數,這種方式調用
Ⅵ c語言問題,高手進
#include <stdio.h>
int wb(int);
int bw(int);
int ww(int,int,int);
void main()
{
int nian, yue , ri ;
int wb =0 ;
printf("輸入你需要的日期,使用-分割");
scanf ("%d-%d-%d",&nian ,&yue ,&ri);
wb=ww( nian ,yue , ri );
printf("這天是這年的第%d天\n", wb);
}
int bw(int nian)
{
int pingrunnian;
pingrunnian=(nian%4 == 0 && (nian %100 != 0 || nian % 400 == 0));
return pingrunnian;
}
int ww(int nian , int yue , int ri )
{
int i;
int wbws = 0;
int yuefentianshu[13] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
if( bw(nian) )
{
yuefentianshu[2] = 29;
}
for( i = 1; i < yue ; i++ )
{
wbws += yuefentianshu[i];
}
wbws += ri;
return wbws;
}
Ⅶ C語言問題簡單的很,菜鳥送分,在線等
#include <stdio.h>
int wb(int);//WB為最終演算法
int bw(int); //BW為主演算法
int ww(int,int,int); //WW為判斷潤年的演算法
void main()
{
int nian, yue , ri ;
int wb =0 ;
printf("輸入你需要的日期,使用-分割");
scanf ("%d-%d-%d",&nian ,&yue ,&ri);
wb=ww( nian ,yue , ri );
printf("這天是這年的第%d天\n", wb);
}
int ww(int nian , int yue , int ri )
{
int i;
int wbws = 0,pingrunnian;
int yuefentianshu[13] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
pingrunnian=(nian%4 == 0 && (nian %100 != 0 || nian % 400 == 0));
if( pingrunnian )
{
yuefentianshu[2] = 29;
}
for( i = 1; i < yue ; i++ )
{
wbws += yuefentianshu[i];
}
wbws += ri;
return wbws;
}
//你的這個注釋不是所有的環境都能用的。
比如tc就不行 vc可以
Ⅷ C語言中有哪些實用的編程技巧
這篇文章主要介紹了C語言高效編程的幾招小技巧,本文講解了以空間換時間、用數學方法解決問題以及使用位操作等編輯技巧,並給出若干方法和代碼實例,需要的朋友可以參考下
引言:
編寫高效簡潔的C語言代碼,是許多軟體工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述,不對的地方請各位指教。
第1招:以空間換時間
計算機程序中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招——以空間換時間。
例如:字元串的賦值。
方法A,通常的辦法:
代碼如下:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,「This is a example!!」);
方法B:
代碼如下:
const char string2[LEN] =「This is a example!」;
char * cp;
cp = string2 ;
(使用的時候可以直接用指針來操作。)
從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲空間下,B直接使用指針就可以操作了,而A需要調用兩個字元函數才能完成。B的缺點在於靈 活性沒有A好。在需要頻繁更改一個字元串內容的時候,A具有更好的靈活性;如果採用方法B,則需要預存許多字元串,雖然佔用了大量的內存,但是獲得了程序 執行的高效率。
如果系統的實時性要求很高,內存還有一些,那我推薦你使用該招數。
該招數的變招——使用宏函數而不是函數。舉例如下:
方法C:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
方法D:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))
#define SET_BITS(__dst, __bf, __val) /
((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
函數和宏函數的區別就在於,宏函數佔用了大量的空間,而函數佔用了時間。大家要知道的是,函數調用是要使用系統的棧來保存數據的,如果編譯器里有棧檢查 選項,一般在函數的頭會嵌入一些匯編語句對當前棧進行檢查;同時,CPU也要在函數調用時保存和恢復當前的現場,進行壓棧和彈棧操作,所以,函數調用需要 一些CPU時間。而宏函數不存在這個問題。宏函數僅僅作為預先寫好的代碼嵌入到當前程序,不會產生函數調用,所以僅僅是佔用了空間,在頻繁調用同一個宏函 數的時候,該現象尤其突出。
D方法是我看到的最好的置位操作函數,是ARM公司源碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細體會。
第2招:數學方法解決問題
現在我們演繹高效C語言編寫的第二招——採用數學方法來解決問題。
數學是計算機之母,沒有數學的依據和基礎,就沒有計算機的發展,所以在編寫程序的時候,採用一些數學方法會對程序的執行效率有數量級的提高。
舉例如下,求 1~100的和。
方法E
代碼如下:
int I , j;
for (I = 1 ;I<=100; I ++){
j += I;
}
方法F
代碼如下:
int I;
I = (100 * (1+100)) / 2
這個例子是我印象最深的一個數學用例,是我的計算機啟蒙老師考我的。當時我只有小學三年級,可惜我當時不知道用公式 N×(N+1)/ 2 來解決這個問題。方法E循環了100次才解決問題,也就是說最少用了100個賦值,100個判斷,200個加法(I和j);而方法F僅僅用了1個加法,1 次乘法,1次除法。效果自然不言而喻。所以,現在我在編程序的時候,更多的是動腦筋找規律,最大限度地發揮數學的威力來提高程序運行的效率。
第3招:使用位操作
實現高效的C語言編寫的第三招——使用位操作,減少除法和取模的運算。
在計算機程序中,數據的位是可以操作的最小數據單位,理論上可以用「位運算」來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做數據變換使用,但是,靈活的位操作可以有效地提高程序運行的效率。舉例如下:
方法G
代碼如下:
int I,J;
I = 257 /8;
J = 456 % 32;
方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
在字面上好像H比G麻煩了好多,但是,仔細查看產生的匯編代碼就會明白,方法G調用了基本的取模函數和除法函數,既有函數調用,還有很多匯編代碼和寄存 器參與運算;而方法H則僅僅是幾句相關的匯編,代碼更簡潔,效率更高。當然,由於編譯器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 來看,效率的差距還是不小。相關匯編代碼就不在這里列舉了。
運用這招需要注意的是,因為CPU的不同而產生的問題。比如說,在PC上用這招編寫的程序,並在PC上調試通過,在移植到一個16位機平台上的時候,可能會產生代碼隱患。所以只有在一定技術進階的基礎下才可以使用這招。
第4招:匯編嵌入
高效C語言編程的必殺技,第四招——嵌入匯編。
「在熟悉匯編語言的人眼裡,C語言編寫的程序都是垃圾」。這種說法雖然偏激了一些,但是卻有它的道理。匯編語言是效率最高的計算機語言,但是,不可能靠著它來寫一個操作系統吧?所以,為了獲得程序的高效率,我們只好採用變通的方法 ——嵌入匯編,混合編程。
舉例如下,將數組一賦值給數組二,要求每一位元組都相符。
代碼如下:
char string1[1024],string2[1024];
方法I
代碼如下:
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
代碼如下:
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
方法I是最常見的方法,使用了1024次循環;方法J則根據平台不同做了區分,在ARM平台下,用嵌入匯編僅用128次循環就完成了同樣的操作。這里有 朋友會說,為什麼不用標準的內存拷貝函數呢?這是因為在源數據里可能含有數據為0的位元組,這樣的話,標准庫函數會提前結束而不會完成我們要求的操作。這個 常式典型應用於LCD數據的拷貝過程。根據不同的CPU,熟練使用相應的嵌入匯編,可以大大提高程序執行的效率。
雖然是必殺技,但是如果輕易使用會付出慘重的代價。這是因為,使用了嵌入匯編,便限制了程序的可移植性,使程序在不同平台移植的過程中,卧虎藏龍,險象環生!同時該招數也與現代軟體工程的思想相違背,只有在迫不得已的情況下才可以採用。切記,切記。
Ⅸ c語言中可不可以將if(qw-bw<0)寫成if(qw<bw)
如果qw和bw是基本類型的話是可以的
如果qw和bw是類對象的話,可能只重載了-而沒有重載<,所以不太一樣
Ⅹ 簡單的C語言
#include<stdio.h>
intmain()
{
intsum=0,n;
scanf("%d",&n);
while(n>0)
{
sum+=n%10;
n/=10;
}
printf("%d ",sum);
return0;
}