当前位置:首页 » 编程语言 » 无人机c语言编程案例
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

无人机c语言编程案例

发布时间: 2023-07-20 22:02:16

㈠ 急急急!!!会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。