連線編程題
Ⅰ C語言的幾道編程題~~跪謝了~~
/*1編程輸出下圖:(行數有鍵盤輸入)
****....****
***....***
.......
***
* */
#include<stdio.h>
void main()
{
int j,i,n;
printf("Enter A number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=2*n-2*i+1;j>=1;j--)
printf("*");
printf("\n");
}
}
2.//列印ASCII碼值為32--255的符號,要求每行五個數據,
//沒屏20行,一屏滿後,按任意鍵繼續.如 32(2OH) 33(21H)" 34(22H) #
#include<stdio.h>
void main()
{
int i,n=1;
for(i=32;i<=255;i++,n++)
{
printf("%c\t",i);
if(n==5)
{printf("\n");n=0;}
}
}
3.//按下面的近似公式計算:e=1+1/1!+1/2!+1/3!+...+1/n!+...
//[基本要求]:使誤差小於給定的值0.00001
#include<stdio.h>
void main()
{
int i=1;
float e1=0,e2=1;
long m=1;
while((e2-e1)>0.00001)
{
e1=e2;
m*=i;
i++;
e2=e1+1/m;
}
printf("%f",e2);
}
4.//輸入一個年份,判斷其是否為閏年.
#include<stdio.h>
void main()
{
int y;
scanf("%d",&y);
if(y%4==0&&y%100!=0||y%400==0)
printf("Yes,it is.");
else printf("No,it isn't.") ;
}
Ⅱ 極難!!求助數學幾何連線智力題(傳說2000人中無人做出)【求助編程】
我想我能從形式上證明出來他是無解的:
一共五個長方形如圖所示,紅色標記邊僅僅被一個長方形佔有,它的權重是1;藍色標記的被兩個矩形佔有,它的權重是1/2。
這個權重就是說對應邊如果是某個矩形單獨佔有,那它所起的作用就是1條邊的作用,如果是在兩個矩形交界的地方,那麼這條邊是在兩個矩形當中都起作用,如果所求線穿過他,相當於兩個矩形同時用掉一條邊,而對於每個矩形來講,它所起的作用就是半條邊的作用。
這樣可以看出來,總的權重(需要穿過的邊數)加和應該是9+7/2=25/2,也就是12.5,它並不是一個整數邊,而所謂的那條線每過一條邊,其他需要穿過的邊數就需要減一,而現在這並不是一個整數邊,換句話說也就是不可能正好減為0,無論如何最後總會剩下一個藍色標記的邊無法畫到。
不知道我這么說清楚表達我的意思了么。
-----------------------------
後邊有人說得很對,也不用懷疑,這個題在平面上可以轉化成16橋問題,只是他的圖中說出了三個奇點,三個5、5、5,而實際上還有第四個奇點,就是整個外圍,如果把整個矩形外圍算作一個點,那麼它也是個奇點,因為一共有9個邊和它相接,也就是這個點有9條線相連。奇點絕對是偶數個。
這樣就好說了,一共4個奇點,那麼就想辦法把它消滅2個就可以了。
這個題在平面中確實而且絕對無解,但是在空間中就不一定了。就說消滅2個奇點,如果在空間范圍來做,那完全可以假設那上側左右兩個矩形之間相連,你可以折起來把這兩個矩形中的某個點貼住,這樣那條線在進入這個左邊或者右邊的矩形後,可以選擇繼續從所在矩形穿出去往別的地方,也可以選擇進入貼住的另一個矩形來從那個矩形中穿出,這樣無形中就把左右矩形中所形象化的奇點給消失掉了,這樣就剩下三個矩形中的中間那個矩形和整個外圍形象化的點——這兩個奇點,完全可以說從這兩個奇點出發,一定可以完成題目的要求。
Ⅲ 在線等,急求一道C語言的編程題!!!正確答案直接發20元微信紅包
凸包問題。計算幾何。
#include<stdio.h>
#include<string.h>
structnode
{
longlongx,y;
}a[100005],b[100005];
longlongmul(nodep1,nodep2,nodep3)
{
return(p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
}
intmain()
{
intn,m,i,low,high,mid,flag;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%lld%lld",&a[i].x,&a[i].y);
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%lld%lld",&b[i].x,&b[i].y);
flag=0;
for(i=0;i<m;i++)
{
if(mul(a[0],a[1],b[i])>=0||mul(a[0],a[n-1],b[i])<=0)
{
flag=1;
gotoloop;
}
low=2;high=n-1;
while(low<high)
{
mid=(low+high)>>1;
if(mul(a[0],a[mid],b[i])>0)
high=mid;
elselow=mid+1;
}
if(mul(a[low],a[low-1],b[i])<=0)
{
flag=1;
gotoloop;
}
}
loop:if(flag)
printf("NO ");
elseprintf("YES ");
}
return0;
}
轉自http://www.cnblogs.com/dream-wind/archive/2012/05/23/2514694.html
演算法描述裡面也有。
Ⅳ C語言編程題4道,簡單
答案如下:
/*----------------------------------------------------------------*/
/*第一題:*/
#include <stdio.h>
main()
{
int y;
printf("Enter the year:");
scanf("%d",&y);
if(y%4==0 && y%100!=0 || y%400==0)
{
printf("%d is a leap year.",y);
getch();
}
else
{
printf("%d is not a leap year.",y);
getch();
}
}
/*----------------------------------------------------------*/
/*第二題:*/
int main()
{
char str[] = "ABCD1234efgh";
int length = strlen(str);
char * p1 = str;
char * p2 = str + length - 1;
while(p1 < p2)
{
char c = *p1;
*p1 = *p2;
*p2 = c;
++p1;
--p2;
}
printf("str now is %s\n",str);
getch();
return 0;
}
/*-------------------------------------------------------*/
/*第三題:*/
int main()
{
int n, number = 20;
float s = 0, a = 2;
for(n=1; n<=number; n++)
{
s = s + 1 / a;
a += 2;
}
printf("sum is %9.6f\n", s);
getch();
return 0;
}
/*-----------------------------------------------------*/
/*第四題:*/
main()
{
int i, j, k, n;
printf( "'water flower'number is:" );
for (n = 100; n < 1000; n++)
{
i = n / 100; /* 分解出百位 */
j = n / 10 % 10; /* 分解出十位 */
k = n % 10; /* 分解出個位 */
if (i * 100 + j * 10 + k == i * i * i + j * j * j + k * k * k)
{
printf( "%-5d" , n);
}
}
printf( "\n" );
getch();
}
Ⅳ 兩道C語言的編程題,大家幫幫忙。謝謝~~
第二題的程序代碼:
#include "stdio.h"
#include "string.h"
struct student
{
char name[8];
char num[10];
char telNum[15];
char addr[15];
};
main()
{
FILE *fp;
struct student one;
if((fp=fopen("information.txt","w"))==NULL)
{
printf("Cannot open file.");
return;
}
fprintf(fp,"%-8s%-10s%-15s%-15s\n","姓名","學號","電話號碼","家族住址");
printf("Please enter a student's name,number,telephone number \n andaddress(enter 0 to end):\n");
scanf("%s",one.name);
while(strcmp(one.name,"0")!=0)
{
scanf("%s%s%s",one.num,one.telNum,one.addr);
fprintf(fp,"%-8s%-10s%-15s%-15s\n",one.name,one.num,one.telNum,one.addr);
printf("Please enter a student's name,number,telephone number \n and address(enter 0 to end):\n");
scanf("%s",one.name);
}
fclose(fp);
if((fp=fopen("information.txt","r"))==NULL)
{
printf("Cannot open file.");
return;
}
printf("The information of the students:\n");
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s\n",one.name,one.num,one.telNum,one.addr);
printf("%-8s%-10s%-15s%-15s\n",one.name,one.num,one.telNum,one.addr);
}
getch();
fclose(fp);
}
Ⅵ 大一C語言編程題
車票根據題意兩兩站點連線生成,金額和數量分別用隨機數。
數據存儲:站點,車票,用戶分別為3個結構體,用於對應資料庫。
購買流程:檢查輸入數值有效性->檢查車票庫存->購買成功同步修改用戶購買流水及車票庫存。(這里題目需求不明確,沒有指明用戶購買方式),我的代碼允許一個用戶同時購買多種票,每種票可分批購買多張。購買流水記錄自動增加和更新。
退票流程:檢查輸入和用戶購買記錄,同步更新用戶及車票信息。
刪除流程:選擇刪除沒有被用戶購買的票(函數檢查所有用戶,雖然本題只要一個用戶,實際傳參用戶數組首地址)。
PS: 這個題目涉及到增刪改,用鏈表來寫更好,但考慮你學習范圍,沒有使用鏈表而是動態數組,動態數組刪除,考慮內存佔用,不僅要需循環移位還要釋放多餘地址。
另外整體程序,異常的處理我只是單純返回0或者1或者-1區分基本的成功與失敗。你如想對個別異常進行特殊處理,自行修改返回值,接收判斷。
下面是代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <conio.h>
#define MS 5//最大站點數
typedef struct station
{
char sid[10];
char sName[20];
}STN;
typedef struct ticket
{
int tid;//票編號
STN *ssP;//起始站
STN *tsP;//終點站
int value;//票價
int number;//數量
}TKT;
typedef struct userInfo//用戶
{
char uid[20];//身份證號
int cnt;//購買的票種類數量
int *btids;//購買的所有票id數組
int *btNum;//購買的所有票數量數組
}UIFO;
int init(STN stns[MS],TKT **tkts);//初始化車站、票數據
int disAllTickets(TKT *tkts);
int buyTicket(UIFO *uifo,TKT *tkts);//異常返回0
int reTicket(UIFO *uifo,TKT *tkts);//異常返回0
int showMenu(UIFO *uifo,TKT *tkts);
int delIntByIndex(int *nums,int len,int index);//通過下標index刪除動態整型數組nums對應元素,並釋放多餘地址,返回刪除後的數組長度,異常返回-1
int delTkts(UIFO *uifos,int len,TKT *tkts);//刪除指定票(檢查用戶組,只要有一個用戶購買,無法刪除)
int cnt;//票種類數量
int main()
{
STN stns[MS];
TKT *tkts=NULL;
UIFO uifo={"321002199902050614",0,NULL,NULL};
srand(time(NULL));
cnt=init(stns,&tkts);
printf("共生成%d組票(每組往返兩種票,共%d種票) ",cnt/2,cnt);
printf("按任意鍵繼續。。。。 "),getch();
system("cls");
showMenu(&uifo,tkts);
return 0;
}
int showMenu(UIFO *uifo,TKT *tkts)
{
int n=5;
printf("(1) Buy ticket ");
printf("(2) Refund ticket ");
printf("(3) Remove ticket ");
printf("(4) Display all tickets ");
printf("(0) Exit ");
while(n<0 || n>4)
scanf("%d",&n);
switch(n)
{
case 0: return 0;
case 1: if(!buyTicket(uifo,tkts)) return 0;break;
case 2: if(!reTicket(uifo,tkts)) return 0;break;
case 3: if(!delTkts(uifo,1,tkts)) return 0;break;
//這里刪除功能,用戶多名,要傳數組首地址,由於演示只有一個用戶(len=對應用戶數),所以只傳該用戶地址(len=1)
case 4: disAllTickets(tkts);break;
}
showMenu(uifo,tkts);
return 1;
}
int disAllTickets(TKT *tkts)
{
int i;
for(i=0;i<cnt;i++)
printf("編號:%2d 路程:%s-%s 票價:%3d 剩餘票數:%d ",tkts[i].tid,tkts[i].ssP->sName,tkts[i].tsP->sName,tkts[i].value,tkts[i].number);
printf("按任意鍵繼續。。。。 "),getch();
system("cls");
return 1;
}
int delIntByIndex(int *nums,int len,int index)
{
int i,*temp=NULL;
if(index>len-1) return -1;
for(i=index;i<len-1;i++)
nums[i]=nums[i+1];
len--;
if(len)
{
temp=(int *)realloc(nums,sizeof(int)*len);
if(!temp) return -1;
nums=temp;
}
else
free(nums);
return len;
}
int reTicket(UIFO *uifo,TKT *tkts)
{
int i,j,tid,n,index,len,flag=0;
printf("當前用戶購買記錄: ");
for(i=0;i<uifo->cnt;i++)
{
for(j=0;j<cnt;j++)
if(tkts[j].tid==uifo->btids[i]) index=j;
printf("--車票編號:%d,起末站:%s-%s,購買票數:%d ",uifo->btids[i],tkts[index].ssP->sName,tkts[index].tsP->sName,uifo->btNum[i]);
}
printf("請輸入要退票的車票id及票數:"),scanf("%d%d",&tid,&n);
for(i=0;i<uifo->cnt;i++)
if(uifo->btids[i]==tid && uifo->btNum[i]>=n)
{
for(j=0;j<cnt;j++)
if(tkts[j].tid==uifo->btids[i]) tkts[j].number+=n;//同步修改對應車票剩餘票數
uifo->btNum[i]-=n;//用戶購買記錄修改
if(uifo->btNum[i]==0)//某種車票全部退完,刪除該條記錄
{
len=delIntByIndex(uifo->btNum,uifo->cnt,i);
if(len==-1) return 0;
len=delIntByIndex(uifo->btids,uifo->cnt,i);
if(len==-1) return 0;
uifo->cnt=len;
}
flag=1;
break;
}
if(flag)
printf("退票成功! ");
else
printf("無此購買記錄或輸入數量不符合 ");
printf("按任意鍵繼續。。。。 "),getch();
system("cls");
return 1;
}
int buyTicket(UIFO *uifo,TKT *tkts)
{
char spn[20],tpn[20];
int i,n=-1,index=-1,*temp=NULL;
for(i=0;i<cnt;i++)
printf("編號:%2d 路程:%s-%s 票價:%3d 剩餘票數:%d ",tkts[i].tid,tkts[i].ssP->sName,tkts[i].tsP->sName,tkts[i].value,tkts[i].number);
printf("請輸入始發站站名和終點站站名:"),scanf("%s%s",spn,tpn);
for(i=0;i<cnt;i++)
if(strcmp(tkts[i].ssP->sName,spn)==0 && strcmp(tkts[i].tsP->sName,tpn)==0)
{
printf("車票%s-%s 票價:%3d 剩餘票數:%d ",tkts[i].ssP->sName,tkts[i].tsP->sName,tkts[i].value,tkts[i].number);
index=i;
break;
}
if(index==-1)
printf("購買失敗!無此路程的車票 ");
else
{
while(n<=0)
{
printf("請輸入要購買的數量(大於0):"),scanf("%d",&n);
if(tkts[index].number<n)
printf("錯誤:車票數量不足或者輸入數值超出范圍!請重新輸入! "),n=-1;
}
for(i=0;i<uifo->cnt;i++)//檢查用戶購買記錄,重復票累加購買數量,不同票新增記錄
{
if(uifo->btids[i]==tkts[index].tid)
{
printf("該票已購買了%d張,現再次購買%d張,累計購買了%d張 ",uifo->btNum[i],n,uifo->btNum[i]+n);
uifo->btNum[i]+=n;
tkts[index].number-=n;
break;
}
}
if(i==uifo->cnt)//未檢查到重復記錄,新增
{
if(!uifo->btids)
{
uifo->btids=(int *)malloc(sizeof(int));
if(!uifo->btids) return 0;
uifo->btNum=(int *)malloc(sizeof(int));
if(!uifo->btNum) return 0;
}
else
{
temp=(int *)realloc(uifo->btids,sizeof(int)*(uifo->cnt+1));
if(!temp) return 0;
uifo->btids=temp;
temp=(int *)realloc(uifo->btNum,sizeof(int)*(uifo->cnt+1));
if(!temp) return 0;
uifo->btNum=temp;
}
uifo->btids[uifo->cnt]=tkts[index].tid;
printf("該票購買了%d張 ",(uifo->btNum[uifo->cnt]=n));
tkts[index].number-=n;
uifo->cnt++;
printf("用戶購買記錄: ");
for(i=0;i<uifo->cnt;i++)
printf("--車票編號:%d,購買票數:%d ",uifo->btids[i],uifo->btNum[i]);
}
printf("本次成功購買了%s-%s的票%d張! ",tkts[index].ssP->sName,tkts[index].tsP->sName,n);
}
printf("按任意鍵繼續。。。。 "),getch();
system("cls");
return 1;
}
int delTkts(UIFO *uifos,int len,TKT *tkts)//len:所有購買的用戶數量
{
int i,j,k,tid,flag=0,index;
for(i=0;i<cnt;i++)
printf("編號:%2d 路程:%s-%s 票價:%3d 剩餘票數:%d ",tkts[i].tid,tkts[i].ssP->sName,tkts[i].tsP->sName,tkts[i].value,tkts[i].number);
printf("請輸入要刪除的車票編號:"),scanf("%d",&tid);
for(i=0;i<cnt;i++)
if(tid==tkts[i].tid)
{
index=i;
flag=1;
for(j=0;j<len;j++)//檢查所有用戶購買記錄
{
for(k=0;k<uifos[j].cnt;k++)
if(uifos[j].btids[k]==tid)
{
flag=0;
printf("該票已被用戶購買,無法刪除,需先完成退票! ");
break;
}
if(!flag)
break;
}
break;
}
if(!flag) printf(" 刪除失敗,輸入數值超出范圍或不可刪除! ");
else
{
cnt--;
if(cnt==0)
{
free(tkts[index].ssP);
free(tkts[index].tsP);
free(&tkts[index]);
}
else
{
free(tkts[index].ssP);
free(tkts[index].tsP);
for(i=index;i<cnt;i++)
tkts[i]=tkts[i+1];
tkts[cnt].ssP=NULL;
tkts[cnt].tsP=NULL;
free(&tkts[cnt]);
}
printf(" 刪除成功! ");
}
printf("按任意鍵繼續。。。。 "),getch();
system("cls");
return 1;
}
int init(STN stns[MS],TKT **tkts)
{
TKT *tTemp=NULL;
int i,j,n,v,cnt=2;
static int id=1;
printf("生成站點: ");
for(i=0;i<MS;i++,id++)
{
sprintf(stns[i].sid,"車站%03d",id);
sprintf(stns[i].sName,"SN%03d",id);
printf("----站點名:%s。站點ID:%s ",stns[i].sid,stns[i].sName);
}
printf("計算所有站點連線,生成車票(票是往返,所以一次生成往返兩組票): ");
for(i=0;i<MS;i++)
for(j=i+1;j<MS;j++)
{
if(!(*tkts))
{
*tkts=(TKT *)malloc(sizeof(TKT)*2);
if(!(*tkts)) return -1;
}
else
{
tTemp=(TKT *)realloc((*tkts),sizeof(TKT)*cnt);
if(!tTemp) return -1;
*tkts=tTemp;
}
n=rand()%4+2;//每種票隨機2~5張(保證總數大於20)
v=rand()%201+50;//隨機生成票價50~250
(*tkts)[cnt-1].tid=cnt;
(*tkts)[cnt-1].ssP=&stns[i];
(*tkts)[cnt-1].tsP=&stns[j];
(*tkts)[cnt-1].value=v;
(*tkts)[cnt-1].number=n;
(*tkts)[cnt-2].tid=cnt-1;
(*tkts)[cnt-2].ssP=&stns[j];
(*tkts)[cnt-2].tsP=&stns[i];
(*tkts)[cnt-2].value=v;
(*tkts)[cnt-2].number=n;
printf("----%s和%s的之間往返票各生成%d張,票價為%d(隨機) ",stns[i].sName,stns[j].sName,n,v);
cnt+=2;
}
return cnt-2;
}
//答題不易,如採納的,請不要無故刪除問題。
Ⅶ 有關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寄存器寫入使能信號。這些信號使用連續賦值語句進行賦值。
Ⅷ 一個簡單的編程題。
將人們排成一列,有錢找也就是說這個隊列里邊任意一個人前邊(包括自己)手拿50元錢的人總是不比100元的少。遞歸一下就可以求解了。a代表50元的人的數量,b代表100元的人的數量。
#include <iostream>
using namespace std;
int solve(int a,int b){
if(a<0 || b<0 || b>a) return 0;
if(a==0 || b==0) return 1;
return solve(a-1,b) + solve(a,b-1);
}
int main() {
cout<<solve(20,10)<<endl;
return 0;
}
Ⅸ 電子設計問題。幫忙呀,要考試啦
好吧,為了分我回答你。不過你這孩子該好好學習了啊
EDA是電子設計自動化(ElectronicDesignAutomation)的縮寫
VHDL的英文全寫是:VHSIC()HardwareDescriptiongLanguage.翻譯成中文就是超高速集成電路硬體描述語言
CPLD()復雜可編程邏輯器件
FPGA是英文Field-ProgrammableGateArray的縮寫,即現場可編程門陣列
非同步復位:它是指無論時鍾沿是否到來,只要復位信號有效,就對系統進行復位
(1)與其他的硬體描述語言相比,VHDL具有更強的行為描述能力
(2)VHDL豐富的模擬語句和庫函數,使得在任何大系統的設計早期就能查驗設計系統的功能可行性,隨時可對設計進行模擬模擬。
(3)VHDL語句的行為描述能力和程序結構決定了他具有支持大規模設計的分解和已有設計的再利用功能。
4)對於用VHDL完成的一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,並自動的把VHDL描述設計轉變成門級網表。
1.查找表(Look-Up-Table)簡稱為LUT,LUT本質上就是一個RAM。目前FPGA中多使用4輸入的LUT,所以每一個LUT可以看成一個有4位地址線的16x1的RAM。當用戶通過原理圖或HDL語言描述了一個邏輯電路以後,PLD/FPGA開發軟體會自動計算邏輯電路的所有可能的結果,並把結果事先寫入RAM,這樣,每輸入一個信號進行邏輯運算就等於輸入一個地址進行查表,找出地址對應的內容,然後輸出即可。2.①CPLD更適合完成各種演算法和組合邏輯,FPGA更適合於完成時序邏輯。換句話說,FPGA更適合於觸發器豐富的結構,而CPLD更適合於觸發器有限而乘積項豐富的結構。②CPLD的連續式布線結構決定了它的時序延遲是均勻的和可預測的,而FPGA的分段式布線結構決定了其延遲的不可預測性。③在編程上FPGA比CPLD具有更大的靈活性。CPLD通過修改具有固定內連電路的邏輯功能來編程,FPGA主要通過改變內部連線的布線來編程;FPGA可在邏輯門下編程,而CPLD是在邏輯塊下編程。④FPGA的集成度比CPLD高,具有更復雜的布線結構和邏輯實現。⑤CPLD比FPGA使用起來更方便。CPLD的編程採用E2PROM或FASTFLASH技術,無需外部存儲器晶元,使用簡單。而FPGA的編程信息需存放在外部存儲器上,使用方法復雜。⑥CPLD的速度比FPGA快,並且具有較大的時間可預測性。這是由於FPGA是門級編程,並且CLB之間採用分布式互聯,而CPLD是邏輯塊級編程,並且其邏輯塊之間的互聯是集總式的。⑦在編程方式上,CPLD主要是基於E2PROM或FLASH存儲器編程,編程次數可達1萬次,優點是系統斷電時編程信息也不丟失。CPLD又可分為在編程器上編程和在系統編程兩類。FPGA大部分是基於SRAM編程,編程信息在系統斷電時丟失,每次上電時,需從器件外部將編程數據重新寫入SRAM中。其優點是可以編程任意次,可在工作中快速編程,從而實現板級和系統級的動態配置。
4題見圖
5題1,輸出加D觸發器這是一種比較傳統的去除毛刺的方法。原理就是用一個D觸發器去讀帶毛刺的信號,利用D觸發器對輸入信號的毛刺不敏感的特點,去除信號中的毛刺
2,信號同步法,做到真正的"同步"就是去除毛刺信號的關鍵問題。我認為這里同步的關鍵就是保證在時鍾的跳變沿讀取的數據是穩定的數據而不是毛刺數據
3,編程題,自己做吧,看看書,等你找工作時你就會發現這些知識真的很有用
haha,你也太懶了,對不起我也很忙,不過我真的建議你好好看看書,將來可是掙錢的資本啊
Ⅹ C語言編程題完全不會
第一題
main()
{
char ch[10];
int i=0,n;
gets(ch);
while(ch[i])
{
if(ch[i]>='a'&&ch[i]<='z')
printf("%c",ch[i]-(7+2*(ch[i]-'a')));
else if(ch[i]>='A'&&ch[i]<='Z')
printf("%c",ch[i]*3/2+1);
else if(ch[i]>='0'&&ch[i]<='9')
{
n=(int)ch[i];
printf("%c",ch[i]+(n/10)%10);
}
else
printf("%c",ch[i]);
i++;
}
}
第二題
main()
{
int m,n,s=0,i,flag=1;
scanf("%d %d",&m,&n);
for(i=m;i<=m+n;i++)
{
s=s+i*flag;
flag = -flag;
}
printf("s = %d",s);
}
第四題
main()
{
int i,N;
scanf("%d",&N);
for(i=1;i<=N;i++)
printf("* ");
}