㈠ 急急急!!!會c語言編程的朋友 幫個忙啊
案例一 C++
#include <iostream>
using namespace std;
char num[16] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
int ToInt(char &n){
if (n<='9') return (int )(n-48);
else return (int )(n-'A'+10);
}
int main(){
int P = 10, Q; \\Q是要輸入的2 8 16進制
string N = "";
while (cin >> Q >> N){
if (N == "0"){
cout << 0 << endl;
return 0;
}
string OUT = "";
long long sum = 0, p = 1;
for (int i = 0; i<N.size(); i++){
sum += ToInt(N[N.size()-1-i])*p;
p*=P;
}
while (sum>0) OUT.insert(0, 1, num[sum%Q]), sum/=Q;
cout << OUT << endl;
}
return 0;
}
㈡ c語言編程問題
編程發現的最長的單詞在字元串中的一個已知的,它假定該字元串只包含字母和空格,空格用來分隔不同的話!
方法:
/ / VC + + 6.0編譯器
包括
無效的主要() BR /> {
字元STR [] =「世界你好我的名字是曹尋醫!」;
的char * p = STR,* P1;
MAX = 0,計數= 0,我
而(* P)
{
計數= 0;
而(* p =='')P + +;
(* P!='' && * p)
{/ /我們必須注意的判斷* P! = 0來判斷,或到最後一個字,它已被添加到背面直到滿足空間,所以將超級部門。
P + +;
計數+ +;
}
(MAX <計數)
{
最大計數;
P1 =對數;
}
}
printf的(「人數最多的是:%d條\ n」);,最大
printf的(「最大的一句話是:」);
(* P1 ='' && * P1)/ /這里要判斷* P1! ='\ 0',因為結尾的字元串中最長的單詞,如果你不判斷* P1! ='\ 0',也界。
{
的putchar(* P1);
P1 + +;
}
的putchar('\ n');
}
BR /> / *
在字元串中尋找最長的單詞。註:A B.如果在一個循環中循環,以確保不僅在環路B,數組但是行業。
而且裡面的數組A,但也是扇區,以確保循環。像上面的例子。現在提供一個更容易理解的例子。
而(* P)
{
而(* P!='' && * p)
{
P + +;
}
}
外循環和內循環的循環條件沒有必然的,但對於一個指針數組(如果變數標
訪問數組下標減法還要注意),加法和減法應該引起人們的注意,必須確保不流溢。
* /
方法:
/ / VC + + 6.0編譯通過。
#包括
包括中
無效的主要()
{
字元STR [] =「我我的學生「;
的char * p = str中,數組[10] [20] = {0};
INT I = 0,J = 0,最大值= 0;
而( * P)
{
而(* p =='')* p + +;
(* P && * p!='')
{
>陣列[I] [J + +] = * p;
P + +;
}
i + +; J = 0;
}
= 0;
最大= strlen的(陣列[I]);
P =陣列[I];
(strlen的(陣列[I]))
{
(最大的strlen(陣列[I]))
{
最大值= strlen的(ARRAY [I]);
P =陣列[I];
} <BR /我+ +;
}
printf的(「%e\ n%s的\ n」,最大,P);
}
/ *
>尋求中最長的單詞的字元串(不區分詞與詞之間包含非字母數字字元),法官的二維數組的形式。
定義了一個兩維數組,每個元素都用於存儲一個字元串(每個分離的字)。
然後判斷的時間最長。
比較第一種方法,這種方法更清楚地了解?一些。但缺點是,你要分配一個二維數組來存儲分離
字,佔用存儲空間。
* /
實現任何十進制將R十六進制數2-16(R)
轉換為二進制:
/ / VC + + 6.0編譯通過
#包括
包括
無效的主要()
{ />詮釋A,B [30],我
scanf的(「%d」,&A);
(i = 0;了!= 0;我+ +)
{
B?[我] = 2%;
= A / 2;
}
( - I I> = 0;我 - )
{
printf的(「%d」,B [I]);
}
的putchar('\ n');
}
/ /二進制的轉換,也可以使用位移運算符。一定的數量,如1相的二進制
系統的最低位按位「與」,得到的位移,然後得到的二進制最低位,等等。
轉換為八進制:
/ VC + + 6.0編譯器。
#包括
#,包括
無效的主要()
{
整數A,B [20]我
scanf的(「%d」,&A);
為(i = 0;了!= 0; i + +)
{
B [我] = 8%;
= A / 8;
}
( - I I> = 0; I - )
{
printf的(「% D「,B [I]);
}
的putchar('\ n');
}
/ *
8轉換到那裡沒有十六進制這么大的麻煩,它並不需要定義一個用於存儲
所有的基數十六進制的字元數組,但可以直接輸出。同時保存他和十六進制基數。從0到F
* /
轉換為16進制:
/ / VC + + 6.0編譯通過
stdio.h中>
#,包括
無效的主要()
{
整數A,B [20],我基礎= 16;
字元X [16] = {'0','1','2','3','4','5','6','7','8','9','A' ,'B','C','D','E','F'};
scanf的(「%d」,&A);
(i = 0;了! 0; i + +)
{
B [我] =%的基礎;
= A /基地;
}
( - ; = 0; I - )/ /開始 - 我
{
詮釋J = B [我];
printf的(「%c」的,X [J]); BR />}
printf的(「\ n」);
}
/ *
一般其他十六進制數轉換為十進制數更容易,准備乘法公式,我們使用。
十進制數轉換為十六進制數,則要使用除法。的想法?這個問題是明確的,應該是
典型的演算法來解決這些問題。
它的十進制數轉換成二進制數,在除了使用部門,但還帶著幾分算術。
主要的問題是值得理解這兩個詞:
B [我] =%的基礎;
= A /基地;
我們一般採用兩種循環使用,得到一個整數的數字,這也恰好說明我們得到了
整數位的方法,它是一個十進制數轉換為十進制數的演算法
,是,我們得到一個小數位數字的過程,實際上是尋找他的過程中,轉換為十進制
數字(雖然本身無需轉換本身的時候,就已經是一個十進制數)。事實可以預計相同
十進制數轉換成十六進制數的過程中,這是類似的。
然後在第一個輸出的結果,取余數的結果,年底的數字,在低位。
* /
解決方案:
#包括
包括的
>無效的主要()
{
詮釋一個[10] = {0,1,2,9,10,5,12,7,8,15};
(INT I = 9;我= 0; I - )
{
(A [I]> = 10)
開關([I])
{
10:printf的(「%c」的,'A');突破;
案例11:printf的(「C」,「B」);
情況下,12:printf(「請%C 「,'C');休息;
案例13:printf的(」C「,」D「);
情況下,14:printf的(」%c「的,'E');打破;
情況下,15:printf的(「%c」時,'F');休息;
}
其他
printf的(「%d」的,一個[i]);
}
}
/ *
事實上,二進制的轉換演算法,我們知道的是,我們希望將其轉換成16進制數(如果十六進制) />取余數,剩下的結果存儲在一個數組裡面四捨五入重新分配給他的,那就是扔掉的其餘部分,
相當於外商前面的步驟,然後採取余數,再取整。如此循環,直到0為止。
事實上,上述演算法,它提醒我們一個十進制數轉換成二進制數計算,是不難理解的,
是相通的。
現在的關鍵是,如果這些東西都是好的,那就是,其餘的被放置在一個數組中,現在要做的,
陣列反向輸出就OK了。二進制或八進制,只要它的直接輸出,但如果
十六進制,不能的情況下,也就是說,如果一個元素的數組裡面是14的話,我不能作為輸出/>,則必須輸出E,因為E是十六進制內底,但也有相應的十進制數14。
一個二進制或八進制,可以直接輸出,因為陣列的數量是0,1(二進制)
(0 .... 8),這些數字的二進制和八進制基地。
所面臨的問題在這里是輸出一個整數,這個整數滿足一定的條件下,輸出字
突破,例如:如果該整數等於14'E'字元的輸出。
當然,我們可以使用.. else語句,以確定特殊字元的十六進制數,它是唯一的A,B,C,D,E,F 6
以確定是否...否則太麻煩了。當然,我們也可以使用開關來確定這更有組織。代碼
更清晰。
當然,這是一個十六進制數,我們可以判斷,但如果在現實生活中遇到的問題,這一點
條件或交換機上太麻煩了類似的信件,代碼是不直觀,但也容易出錯。
在這個時候,我們可以定義一個字元數組,分別把字元,我們要輸出的對應關系如下:
10 A
11 B BR /> 12?
13e
14 -
15 F
16?
17 H
18我
19 J
>
該數組,把數字,裡面的字元數組b數組,一個裡面的數字是10,當輸入
'A',而不是輸出10,等等(見上面的對應)課程我上面的對應關系是連續的,其實
的數字和字元的順序可能不亂,當然,這取決於實際遇到的問題是什麼。
以上,如果...否則以確定它是否會過於繁瑣。因此,我們定義了一個字元數組來存儲
字元。因此,如何接觸數字和字元,如何讓一個[i],價值10時,但14失去
'E'輸出'A',我們可以定義b數組:
/>字元B [30] = {0};
B [10] ='A';
B [11] ='B';
B [12] ='C'
B [13] ='D';
B [14] ='E';
...
B [19] ='J';
因此,這意味著,當該元素的值一個[i] 10:00輸出[10] 11輸出[11];這和數字對應
。我們可以使用:
詮釋噸= [];
printf的(「%c」時,B [T]),[i]的值,我們輸出B [多少]
對於上面的例子中,它可以是:
如果(一個[i]> = 10 &&一個[i] <= 19)/ /對應關系是連續的,可以判斷
{
詮釋噸= [];
printf的(「%c」時,B [T]);
}
其他
{
printf的(「%d」,一個[i]);/ /如果你不屬於特殊字元的定義相應的輸出。
}
當然,上面是相應的連續十進制和二進制,八進制,十六進制的轉換,是連續的。
相應的連續,即如何做到這一點:
20'A'
25'B'
30'D'
50'G' /> 53「H」
58的'C'
100'Z'
200'W'
以上,沒有規律性,和數目,這些去定義一個數組的200個元素,
有點劃不來。因此,如果是上面這種情況下,有沒有更好的辦法。只有在判斷語句,當然,如果有超過20
字元的對應關系來確定語句是不恰當的,那麼有沒有更好的辦法。同時進一步探討......
* /
這是我的測試計算機等級考試主題碰到哦,演算法相當,一些書,一些擴展。還是自己嚴重的哦。 。 。
由於太多的文字提出的第三個問題不上來,哦。 。抱歉。 。 。
㈢ 有關C語言編程的題!急!!!
PWM軟體
PWM控制器會產生一連串脈沖。通常需要規定脈沖的周期和寬度。占空比被定義為脈沖寬度與周期的比值。PWM有著廣泛的應用,大多數情況下用於控制模擬電路。因為數字信號連續變化的速率相對較快(當然取決於信號周期),因此最終會形成一個用來控制模擬設備的平均電壓值。當PWM脈沖流應用於馬達時,馬達的轉速就能正比於占空比(從0%到100%)。如果占空比增加,馬達轉速就會提高,反之,如果占空比減小,馬達的轉速隨之也會降低。
用軟體編寫這樣一個PWM控制器是相對比較容易的任務,但它有助於我們簡明扼要地描述如何用Verilog設計硬體。清單1給出了PWM的C代碼。
清單1:完全用軟體實現的位脈沖PWM控制器。
void
pwmTask(uint32_t pulse_width, uint32_t period)
{
uint32_t time_on=pulse_width;
uint32_t time_off=period-pulse_width;
while (1)
{
pwm_output=1;
sleep(time_on);
pwm_output=0;
sleep(time_off);
}
}
根據脈寬(pulse_width)和周期(period)參數值,計算出輸出為高電平和低電平的時間。接下來將輸出引腳置為高電平,並等待time_on設定的時間值之後,將輸出變為低電平,並等待time_off參數設定的時間值。下個周期再重復這樣的過程,並無限循環下去。
Verilog模塊
清單2給出了一個簡單的Verilog模塊,實現帶非同步復位功能的8位寬寄存器。寄存器的輸入「in」在時鍾的上升沿被賦值到輸出「out」,直到clr_n復位信號的下降沿到來(此時輸出將被賦值為0)。
清單2:實現帶非同步復位功能8位寬寄存器的Verilog編寫模塊。
mole simple_register(in, out, clr_n, clk, a);
//埠聲明
input
input
input [7:0]
input
output [7:0]
clr_n;
clk;
in;
a;
out;
//信號聲明
reg [7:0]
wire
out;
a;
//實現帶非同步清除的寄存器
always @(posedge clk or negedge clr_n)
begin
if (clr_n==0) // could also be written if (!clr_n)
out<=0;
else
out<=in;
end
//連續賦值
assign a=!out[0];
endmole
粗略地看Verilog與C語言有許多相似之處。分號用於結束每個語句,注釋符也是相同的(/* ... */和// 都是熟悉的),運算符「==」也用來測試相等性。Verilog的if..then..else語法與C語言的也非常相似,只是Verilog用關鍵字begin和end代替了C的大括弧。事實上,關鍵字begin和end對於單語句塊來說是可有可無的,就與C中的大括弧用法一樣。Verilog和C都對大小寫敏感。
當然,硬體和軟體的一個重要區別是它們的「運行」方式。硬體設計中用到的許多單元都是並行工作的。一旦設備電源開啟,硬體的每個單元就會一直處於運行狀態。雖然根據具體的控制邏輯和數據輸入,設備的一些單元可能不會改變它們的輸出信號,但它們還是一直在「運行」中。
相反,在同一時刻整個軟體設計中只有一小部分(即使是多軟體任務也只有一個任務)在執行。如果只有一個處理器,同一時間點只能有一條指令在執行。軟體的其它部分可以被認為處於休眠狀態,這與硬體有很大的不同。變數可能以一個有效值而存在,但大多數時間里它們都不在使用狀態。
軟硬體的不同行為會直接導致硬體和軟體代碼編程方式的不同。軟體是串列執行的,每一行代碼的執行都要等到前一行代碼執行完畢後才能進行(中斷的非線性或操作系統的命令除外)。
一個Verilog模塊的開頭是關鍵字mole,緊跟其後的是模塊名稱和埠列表,埠列表列出了該模塊用到的所有輸入輸出名稱。接下來是埠聲明部分。注意:所有的輸入輸出既出現在模塊第一行的埠列表中,也會出現在埠聲明(declaration)部分中。
在Verilog中有二種類型的內部信號用得比較多,它們是reg和wire。它們具有不同的功能。所有埠都有一個名稱相同且聲明為wire的信號。因此連線line被聲明為wire不是必要的。reg會保持上次的賦值,因此不需要每次都進行驅動。wire型信號用於非同步邏輯,有時也用來連接信號。因為reg可以保持上次的值,因此輸入不能被聲明為reg類型。在Verilog模塊中可以在任何時候非同步地將輸入改變為任何事件。reg和wire的主要區別是,reg類型的信號只能在過程塊(後面會談到)中賦值,而wire類型的信號只能在過程塊外賦值。這兩種信號類型都可以出現在過程塊內部和外部的賦值運算符右邊。
使用關鍵字reg並不一定意味著編譯器會創建一個寄存器,理解這一點是非常重要的。清單2的代碼中有一個reg類型8位寬的內部信號out。該模塊使用寄存器源於always模塊(過程塊的一種)的編程方式。值得注意的是,信號a是一個wire類型,因此只能在連續賦值(continuous assignment)語句中賦值,而reg類型的out信號只能在always塊中賦值。
always塊是過程塊的一種,僅在某種變化發生時用於更新信號。always語句圓括弧里的表達式組被稱為敏感列表,格式是:(表達式or表達式…)
只要敏感列表中的任何一個表達式值為真,always塊中的代碼就會被執行。Verilog中用於上升沿和下降沿的關鍵字分別是posedge和negedge。這二個關鍵字經常被用於敏感列表。在本例中,如果clk信號的上升沿或clr_n的下降沿信號發生時,always塊內部的語句就會被執行。
為了用好寄存器,輸出必須在時鍾的上升沿得到更新(下降沿也可以,但上升沿更常見些)。增加negedge clr_n會使寄存器在clr_n信號的下降沿復位。但並不是所有的敏感列表都會包含關鍵字posedge或negedge,因此在實際硬體中並不總是存在真實的寄存器。
always塊內的第一條語句判斷clr_n信號的上升沿有沒有發生。如果有,下一行代碼把out置為0。這些代碼行實現了寄存器的非同步復位功能。如果條件語句是:if(negedge clr_n and clk==1),那麼該語句實現的就是基於時鍾的非同步復位。
讀者可能已經注意到,always塊中的賦值運算符與以關鍵字assign開頭的連續賦值語句中用到的運算符不一樣。"<="運算符用於非阻塞性(nonblocking)賦值,而"="運算符用於阻塞性(blocking)賦值。
在一組阻塞性賦值語句中,在下一個阻塞性賦值語句執行前需要計算並賦值第一個賦值語句。這一過程就象C語言中語句的順序執行。而非阻塞語句在執行時,所有賦值語句的右邊被同時計算和賦值。連續賦值語句必須使用阻塞賦值語句(否則編譯器會報錯)。
為了減少代碼出錯的概率,建議在順序邏輯(例如希望以寄存器方式實現的邏輯)always塊中的所有賦值語句使用非阻塞性賦值語句。大多數always塊應該使用非阻塞性賦值語句。如果always塊都是組合邏輯,那麼就需要使用阻塞性賦值語句。
PWM硬體
編寫存儲器映射硬體模塊的首要任務是以軟體方式決定寄存器映射圖。在PWM案例中,一般設計師希望能用軟體設置周期和脈寬。在硬體設計中用計數器統計系統時鍾周期數是非常容易的。因此要用到兩個寄存器,分別命名為pulse_width和period,並且都在時鍾周期內度量。表1給出了PWM的寄存器映射圖。
為了確定輸出信號,硬體可簡單地通過將period和pulse_width寄存器內容作為運行中的計數器保持的輸出。
接下來要為PWM選擇埠,大多數埠可以依據匯流排架構而定。表2提供了通用存儲器映射PWM的信號描述概要。通常為低電平有效的信號命名做法是在信號名上加「_n」,對於控制信號更是如此。表2中的write_n和clr_n信號就是低電平有效的信號(下降沿觸發)。
至此我們已經定義好了硬體模塊的介面,接下來就可以開始編寫Verilog代碼了。清單3給出了一個實現例子。
清單3:用Verilog實現的PWM硬體。
mole pwm (clk, write_data, cs, write_n, addr, clr_n, read_data, pwm_out);
input
input [31:0]
input
input
input
input
output [31:0]
output
clk;
write_data;
cs;
write_n;
addr;
clr_n;
read_data;
pwm_out;
reg [31:0]
reg [31:0]
reg [31:0]
reg
reg [31:0]
wire
period;
pulse_width;
counter;
off;
read_data;
period_en, pulse_width_en; //寫使能
// 定義period和pulse_width寄存器的內容
always @(posedge clk or negedge clr_n)
begin
if (clr_n==0)
begin
period<=32'h 00000000;
pulse_width<=32'h 00000000;
end
else
begin
if (period_en)
period<=write_data[31:0];
else
period<=period;
if (pulse_width_en)
pulse_width<=write_data[31:0];
else
pulse_width<=pulse_width;
end
end
// period和pulse_width寄存器的讀訪問
always @(addr or period or pulse_width)
if (addr == 0)
read_data=period;
else
read_data=pulse_width;
always @(posedge clk or negedge clr_n)
begin
if (clr_n==0)
counter<=0;
else
if (counter>=period-1)
counter<=0;
else
counter<=counter+1;
end
always @(posedge clk or negedge clr_n)
begin
if (clr_n==0)
off<=0;
else
if (counter>=pulse_width)
off <= 1;
else
if (counter==0)
off<=0;
else
off<=off;
end
assign period_en = cs & !write_n & !addr;
assign pulse_width_en = cs & !write_n & addr;
//PWM輸出
assign pwm_out=!off;
endmole
首先是埠說明,接著是內部信號說明。構成PWM軟體控制介面的存儲器映射型寄存器被聲明為reg。該代碼行只允許以32位的方式訪問這些存儲器映射型寄存器。如果需要8位或16位訪問,就必須將寄存器分割成4個8位寄存器,並增加位元組使能信號邏輯。用Verilog代碼實現這一功能是非常簡單的。always塊中已賦過值的所有信號都被聲明為reg類型。聲明為wire類型的信號是period和pulse_width寄存器寫入使能信號。這些信號使用連續賦值語句進行賦值。
㈣ C語言設計案例張傳學P82編寫如圖123聖誕樹
為了更方便的設計聖誕樹的形狀,我用的是設計遞歸函數的方法。程序如下:
#include <stdio.h>
#include <math.h>
void shu(int n)
{
int i;
for (i = 1; i <= 6 - n; i++)
{
printf(" ");
}
for (i = 1; i <= 2 * n - 1;i++)
{
printf("*");
}
printf(" ");
if (n != 6)
shu(n + 1);
}
void gen(int n)
{
int i;
for (i = 1; i <= n; i++)
{
printf(" ***** ");
}
}
void main()
{
shu(1);
shu(2);
gen(5);
}
模擬結果如圖1。