簡單c語言程序例子
⑴ c語言編寫程序判斷迴文數
要判斷一個數n是否迴文數,可以利用一個簡單的循環就可以解決問題的。先保存好n的一個副本n1,初始化一個變數n2=0,然後每次取n1的末位數後添加到n2的末位,並把原n1的末位去掉。如此循環,當n1為0時循環結束,此時再判斷,若n2==n,則n就是一個「迴文數」了。
#include<stdio.h>
int main()
{ int n,n1,n2;
scanf("%d",&n);
n1=n;
for(n2=0;n1;n1/=10)
n2=n2*10+n1%10;
printf("%s\n",n2==n?"Yes":"No");
return 0;
}
⑵ 用C語言編寫一道程序計算100以內偶數的和
編寫程序計算100以內偶數的和是一個常見的編程練習,可以幫助初學者熟悉基本的循環結構。當我們包括100時,100以內偶數的總和為2550;如果不包括100,則總和為2450。以下是一個簡單的C語言程序實現,它利用for循環來完成計算任務:
#include
int main(){
int sum=0;
int i=0;
for (i=0;i<=100;i+=2){
sum+=i;
}
printf("100以內的偶數的和:%d\n",sum);
return 0;
}
在這個程序中,我們使用了for循環,它能夠精確地控制循環次數,並且能夠確保每次循環時i的值為偶數。for語句的結構包括初始化、條件判斷和迭代三部分。在這個例子中,初始化是將i設為0,條件判斷是i小於等於100,迭代是每次循環將i增加2。
for(表達式1;表達式2;表達式3)循環體語句,其中;不能省略。表達式1用於初始化循環變數,表達式2用於設定循環條件,表達式3用於更新循環變數。通過這種方式,可以有效地控制循環的執行。
在實際編程中,我們經常需要根據具體情況選擇合適的循環語句。對於已知循環次數的情況,for語句是首選,因為它能夠清晰地表達循環的開始、結束和每次迭代的變化。而對於未知循環次數的情況,可以使用while或do-while語句。
選擇循環語句時還應考慮循環體至少執行一次的情況。do-while語句在這方面更為靈活,因為它保證了循環體至少會執行一次,即使循環條件一開始就不滿足。而while語句則需要確保循環條件在第一次執行前為真,否則循環體將不會被執行。
C++/C語言中,for語句使用頻率最高,因為它的語法簡潔且功能強大。while語句也非常常見,適用於各種循環條件。do-while語句則較少使用,除非需要確保循環體至少執行一次。
三種循環語句for、while、do-while可以互相嵌套自由組合,但必須確保各循環完整,避免交叉。正確選擇和使用循環語句是編寫高效、清晰程序的關鍵。
⑶ 教你如何使用C語言編寫簡單小游戲
編寫程序,實現如下表所示的5-魔方陣。
17
24
1
8
15
23
5
7
14
16
4
6
13
20
22
10
12
19
21
3
11
18
25
2
9
5-魔方陣
問題分析
所謂「n-魔方陣」,指的是使用1〜n2共n2個自然數排列成一個n×n的方陣,其中n為奇數;該方陣的每行、每列及對角線元素之和都相等,並為一個只與n有關的常數,該常數為n×(n2+1)/2。
例如5-魔方陣,其第一行、第一列及主對角線上各元素之和如下:
第一行元素之和:17+24+1+8+15=65
第一列元素之和:17+23+4+10+11=65
主對角線上元素之和:17+5+13+21+9=65
而
n×(n2+1)/2=5×(52+1)/2=65
可以驗證,5-魔方陣中其餘各行、各列及副對角線上的元素之和也都為65。
假定陣列的行列下標都從0開始,則魔方陣的生成方法為:在第0行中間置1,對從2開始的其餘n2-1個數依次按下列規則存放:
(1)
假定當前數的下標為(i,j),則下一個數的放置位置為當前位置的右上方,即下標為(i-1,j+1)的位置。
(2)
如果當前數在第0行,即i-1小於0,則將下一個數放在最後一行的下一列上,即下標為(n-1,j+1)的位置。
(3)
如果當前數在最後一列上,即j+1大於n-1,則將下一個數放在上一行的第一列上,即下標為(i-1,0)的位置。
(4)
如果當前數是n的倍數,則將下一個數直接放在當前位置的正下方,即下標為(i+1,j)的位置。
演算法設計
在設計演算法時釆用了下面一些方法:
定義array()函數,array()函數的根據輸入的n值,生成並顯示一個魔方陣,當發現n不是奇數時,就加1使之成為奇數。
使用動態內存分配與釋放函數malloc()與free(),在程序執行過程中動態分配與釋放內存,這樣做的好處是使代碼具有通用性,同時提高內存的使用率。
在分配內存時還要注意,由於一個整型數要佔用兩個內存,因此,如果魔方陣中要存放的數有max個,則分配內存時要分配2*max個單元,從而有malloc(max+max)。在malloc()函數中使用max+max而不是2*max是考慮了程序運行的性能。
顯然應該使用二維數組來表示魔方陣,但雖然數組是二維形式的,而由於內存是一維線性的,因此在存取數組元素時,要將雙下標轉換為單個索引編號。在程序中直接定義了指針變數來指向數組空間,即使用malloc()函數分配的內存。
⑷ 大家幫忙找一些51單片機的基本C語言程序例子,最好帶說明,謝啦
中斷控製程序:
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED介面
//將計數器的二進制值用8個LED顯示出來
uchar count;//計數器(存儲中斷次數)
void main(void)
{
count=0; //清零計數器
port_count=~count;//清零P2口
IT0=1; //INT0設為邊沿觸發方式�IT0=0則為電平觸發方式
EX0=1; //開INT0中斷
EA=1; //開系統中斷
while(1); //等待中斷處理
}
//INT0中斷處理函數
void int0_interrupt() interrupt 0 //INT0中斷號0
{
count++;
port_count=~count; //當達到255時,溢出,又從0開始
}
I/O控製程序:
#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判斷移動方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水燈左移到第八位又移回來 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水燈右移到第1位又移回來 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}
串口通信程序:
主機程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的節點地址
#define COUNT 10 //發送緩沖區buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定義buffer
int pt; //設置指針
main()//////////////////////////////////////////發送程序
{
//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率發生器)/////////PCON預設為0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
///////////////發送地址幀
TB8=1; //地址幀標志
SBUF=NODE_ADDR; //發送目的節點地址
while(pt<COUNT); //等待發送完全部數據
while(1);//不執行任何操作
} //end main
/////發送完中斷函數
void send()interrupt 4
{
TI=0; //清發送中斷標志
if(pt<COUNT)
{
//發送一幀數據
TB8=0;//數據幀標志
SBUF=buffer[pt]; //啟動發送
pt++;//指針指向下一單元
}
else
{
ES=0; //關串口中斷
EA=0; //關系統中斷
return; //若發送完則停止發送並返回
}
}
接收程序:
#include<reg52.h>
#define uchar unsigned char
#define NODE_ADDR 3 //本機節點地址
#define COUNT 10 //定義接收緩沖區buffer大小
uchar buffer[COUNT]; //定義buffer
int pt; //當前位置指針
void send_char_com(unsigned char ch); //向串口發送一個字元的函數聲明
void delay(void);
main() ////////////////串列非同步從機接收程序
{
PCON=0X00; //初始化串口和T1(波特率發生器)/////////PCON預設為0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允許接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
while(pt<COUNT); //等待接收地址幀和全部數據幀
delay() ;
//接收完後返回數據
SCON=0XC0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);
}
while(1);
} //end main
///////////串口接收中斷函數
void receive()interrupt 4 using 3
{
RI=0; //清除接收中斷標志
if(RB8==1) //地址幀
{//若為本機地址,則置SM2=0,以便接收數據
if(SBUF==NODE_ADDR)
{
SM2=0;
}
}
/////RB8=0,數據幀
else if(RB8==0)
{buffer[pt]=SBUF; //數據幀送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部數據幀,則通信結束;置SM2=1,准備下一次通信
}
}
//向串口發送一個字元
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
///////////////////////////////////////////////////////////////////////////////////
void delay(void)
{uchar i=100;
while(i--);
}
⑸ 用C語言編寫一個簡單程序,有哪些步驟,可以舉一個例子詳細講解下嗎
//以Helloworld示例
//先使用編輯工具如windows的記事本或vc++環境,或linux的vim編輯器創建一個hello.c文件
//打開文件後,如下 步驟寫程序
#include <stdio.h>//首先要引入c語言的標准輸入輸出庫文件,因為這個文件里有已經定義好的可以使用的函數
//接下來需要寫一個main函數,這也是c語言程序里必不可少的一個函數,叫主函數,他是整個程序的入口函數,程序所有的功能實現都要在這個函數中體現。但是這個函數有且僅有一個
int main()
{
//這是main函數的函數體,要實現什麼功能,就把實現功能的語句寫到這裡面
//比如我要實現列印HelloWorld字元,那麼我就調用printf()標准輸出語句
printf("Hello World!\n");//這個語句表示原樣輸出引號內的字元,『\n』表示換行
return 0;//最後,因為main函數有一個int的返回類型限定,那麼我們使用return語句返回一個int類型的值 0.
}
//這樣就結束了。一個簡單的但又完整的C程序就有了,
//下一步就是使用編譯器編譯成目標的可執行文件:
//如果是windows下的vc++,那麼需要分別點擊編譯,鏈接兩個按鈕生成hello.exe可執行文件
//如果是linux下直接在shell中使用gcc hello.c就可以編譯成可執行文件a.out
//最後就是運行了,windows下直接點擊vc++的運行或雙擊hello.exe可以出現dos窗口運行,並顯示結果,linux下使用「./a.out」可以直接運行,運行結果會顯示在shell中。
//這就是整個完整的流程,包括每一步。如果幫助到你,請你採納為答案。謝謝。
⑹ C語言程序設計,比較數字大小的實例
下面是一個比較三個數的例子:
#include <stdio.h>
int main()
{
int t,a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a<b)
{
t=a,a=b,b=t;
}
if(a<c)
{
t=a,a=c,c=t;
}
if(b<c)
{
t=b, b=c, c=t;
}
printf("%d %d %d\n",c,b,a);
return 0;
}
原理就是運用冒泡演算法,把最大的數浮在最上面,而小的數就下沉,最後就輸出。
⑺ 用c語言編寫一個程序
應該多給幾個例子,n=10的時候如何處理?得到10,110,210,1210等等?
若是這樣的,試試下面程序:
/*
用c語言編寫一個程序:對於一個自然數n(n<=50),統計具有下列數字的個數,
並輸出所有符合條件的數字:自然數n,在n的左邊加上一個自然數,
但該自然數不能超過原數的一半;繼續按此規則進行處理,直到不能加自然數為止。
例如當n=6時,符合條件條件的是:6,16,26,36,126,136共6個;
當n=5時,符合條件的是:5,15,25,125.(0也是自然數,所以要加上本身)。。。
*/
#include
<stdio.h>
#include
<stdlib.h>
int
g_count=0;
void
fun(int
n,int
d,int
b)
{
int
i;
printf("%8d
",d);
g_count++;
if(g_count%8==0)
printf("\n");
for(i=1;i<=n/2;i++)
{
fun(i,i*b+d,b*10);
}
}
void
result(int
n)
{
int
t=n,d=n,b=10;
printf("result:\n");
g_count=0;
while(t>=10)
{
t/=10;
b*=10;
}
fun(n,d,b);
printf("\ntotal
%d
numbers\n\n",g_count);
}
int
main()
{
int
n;
printf("input
n(n<=50):\n");
while(scanf("%d",&n)!=EOF)
{
if(n>=0&&n<=50)
result(n);
printf("input
n(n<=50):\n");
}
return
0;
}
我這,若是放開n的限制,n=200的時候,計算花掉20多秒吧,總共205658個。
n=300的話,算了幾分鍾都沒結束。估計也得使用long
long數據類型了。使用遞歸不是最快的,重復計算多。
網路推薦也不求真相?有誤導了吧。
對於樓主新補充的提升,我的程序是這樣做的,滿足你的要求。