当前位置:首页 » 编程软件 » 连线编程题

连线编程题

发布时间: 2022-07-10 05:48:26

Ⅰ 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("* ");
}

热点内容
linux进程的退出 发布:2025-02-09 03:00:22 浏览:813
淘宝上传时间 发布:2025-02-09 02:42:13 浏览:637
ios缓存数据 发布:2025-02-09 02:32:06 浏览:253
苹果手机如何存储word 发布:2025-02-09 02:23:02 浏览:780
安卓手机如何有苹果的emoji 发布:2025-02-09 02:11:02 浏览:808
编译原理已知语言求文法习题 发布:2025-02-09 02:05:15 浏览:132
中国首个具有世界影响力的编译器 发布:2025-02-09 01:56:21 浏览:720
tomcat上传超时 发布:2025-02-09 01:41:42 浏览:484
androidactivity竖屏 发布:2025-02-09 01:41:40 浏览:378
家庭配置怎么合理 发布:2025-02-09 01:36:14 浏览:808