当前位置:首页 » 编程语言 » 编写高质量c语言代码

编写高质量c语言代码

发布时间: 2022-09-06 15:17:31

① 用c程序编程,求两个正整数的最小公倍数。

#include<stdio.h>

intmain()

{

inta,b;

scanf("%d%d",&a,&b);

inttemp;

if(a>b){temp=a;a=b;b=temp;}//保证a是较小的那个数

for(inti=a;i>=0;i--)

if(a%i==0&&b%i==0)//求最大公约数

{

temp=i;

break;

}

printf("%d ",a*b/temp);//输出最小公倍数

}

c语言题目:输出所有的“水仙花数”,并输出其总个数。所谓“水仙花数”是指一个3位数,其各位数字的立...

具体程序如下:

#include<stdio.h>

voidmain()

{

inti,a,b,c,count=0;//count是计数器

printf("水仙花数有 ");

for(i=100;i<=999;i++)

{

a=i/100;//取百位数字

b=(i-a*100)/10;//取十位数字

c=i%10;//取个位数字

if(a*a*a+b*b*b+c*c*c==i)//如果是水仙花数

{

printf("%d ",i);

count++;//如果是水仙花数计数器就加1

}

}

printf(" 水仙花数的个数为 %d",count);

printf(" ");

}

运行结果如下

③ 用c语言编写程序求汉诺塔的移动步骤

#include<stdio.h>
void move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void f(int n,char a,char b,char c)
{
if(n==1) move(a,c);
else
{
f(n-1,a,c,b);
move(a,c);
f(n-1,b,a,c);
}
}
void main()
{
int n;
scanf("%d",&n);
f(n,'a','b','c');
}
这是我的代码 前面的是定义一个函数 这里递归体现在函数里面还有函数 于是会一次又一次的计算 直到最后把N-1以前的都移到B,最下面的移到C,再把其他的从B移到C。。 无返回的话 应该是这里用void 没有return返回数值

④ 51行代码的matlab脚本,改成可以运行的C语言,高质量完成另有高分悬赏

啦啦啦啦啦啦啦

⑤ 如何编写高质量的代码!

载选<编程思想>

非程序员 编 着

代码永远会有BUG,在这方面没有最好只有更好。高效是程序员必须作到的事情,无错是程序员一生的追求。复用、分而治之、折衷是代码哲学的基本思想。模块化与面向对象是实现高效无错代码的方法。高效无错代码需要思想与实践的不断反复。
1.2.1 命名约定
命令规范基本上采用了微软推荐的匈牙利命名法,略有简化。
1. 常量
常量由大写字母和数字组成,中间可以下划线分隔,如 CPU_8051。
2. 变量
变量由小写(变量类型)字母开头,中间以大写字母分隔,可以添加变量域前缀(变量活动域前缀以下划线分隔)。如: v_nAcVolMin(交流电压最小值)。
变量域前缀见下表
局部变量,如果变量名的含义十分明显,则不加前缀,避免烦琐。如用于循环的int型变量 i,j,k ;float 型的三维坐标(x,y,z)等。
3. 函数名一般由大写字母开头,中间以大写字母分隔,如SetSystemPara。函数命名采用动宾形式。如果函数为最底层,可以考虑用全部小写,单词间采用带下划线的形式。如底层图形函数:pixel、lineto以及读键盘函数get_key 等。
4. 符号名应该通用或者有具体含义,可读性强。尤其是全局变量,静态变量含义必须清晰。C++中的一些关键词不能作为符号名使用,如class、new、friend等。符号名长度小于31个,与ANSI C 保持一致。命名只能用26个字母,10个数字,以及下划线‘_’来组成,不要使用‘$’‘@’等符号。下划线‘_’使用应该醒目,不能出现在符号的头尾,只能出现在符号中间,且不要连续出现两个。
5. 程序中少出现无意义的数字,常量尽量用宏替代。
1.2.2 使用断言
程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。
断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。
//复制不重叠的内存块
void memcpy(void *pvTo, void *pvFrom, size_t size)
{
void *pbTo = (byte *) pvTo;
void *pbFrom = (byte *) pvFrom;
assert( pvTo != NULL && pvFrom != NULL );
while(size - - > 0 )
*pbTo + + = *pbFrom + + ;
return (pvTo);
}
assert不是一个仓促拼凑起来的宏,为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。
以下是使用断言的几个原则:
1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
2)使用断言对函数的参数进行确认。
3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。
1.2.3 优化/效率
规则一:对于在中断函数/线程和外部函数中均使用的全局变量应用volatile定义。例如:
volatile int ticks;
void timer(void) interrupt 1 //中断处理函数
{
ticks++
}
void wait(int interval)
{
tick=0;
while(tick<interval);
}
如果未用volatile,由于while循环是一个空循环,编译器优化后(编译器并不知道此变量在中断中使用)将会把循环优化为空操作!这就显然不对了。
规则二:不要编写一条过分复杂的语句,紧凑的C++/C代码并不见到能得到高效率的机器代码,却会降低程序的可理解性,程序出错误的几率也会提高。
规则三:变量类型编程中应用原则:尽量采用小的类型(如果能够不用“Float”就尽量不要去用)以及无符号Unsigned类型,因为符号运算耗费时间较长;同时函数返回值也尽量采用Unsigned类型,由此带来另外一个好处:避免不同类型数据比较运算带来的隐性错误。

1.2.4 其他
规则一:不要编写集多种功能于一身的函数,在函数的返回值中,不要将正常值和错误标志混在一起。
规则二:不要将BOOL值TRUE和FALSE对应于1和0进行编程。大多数编程语言将FALSE定义为0,任何非0值都是TRUE。Visual C++将TRUE定义为1,而Visual Basic则将TRUE定义为-1。例如:
BOOL flag;

if(flag) { // do something } // 正确的用法
if(flag==TRUE) { // do something } // 危险的用法
if(flag==1) { // do something } // 危险的用法
if(!flag) { // do something } // 正确的用法
if(flag==FALSE) { // do something } // 不合理的用法
if(flag==0) { // do something } // 不合理的用法
规则三:小心不要将“= =”写成“=”,编译器不会自动发现这种错误。
规则四:建议统一函数返回值为无符号整形,0代表无错误,其他代表错误类型。

1.3 模块化的C编程

C语言虽然不具备C++的面向对象的成分,但仍应该吸收面向对象的思想,采用模块化编程思路。面向对象的思想与面向对象的语言是两个概念。非面向对象的语言依然可以完成面向对象的编程,想想C++的诞生吧!
C++没有理由对C存在傲慢与偏见,不是任何场合C++方法都是解决问题的良药,譬如面对嵌入式系统效率和空间的双重需求。注意我们谈的是方法,而不是指编译器。
C在软件开发上存在的首要问题是缺乏对数据存取的控制(封装),C编程者乐而不疲的使用着大量extern形式的全局变量在各模块间交换着数据,“多方便啊”编程者乐曰,并传授给下一个编程者。这样多个变量出现在多个模块中,剪不断理还乱,直到有一天终于发现找一个“人”好难。一个东西好吃,智者浅尝之改进之,而愚者只会直至撑死。
这世上本没有什么救世主,应在C上多下功夫,程序员和C缔造者早就有过思考,相信野百合也有春天,还是看看C语言如何实现模块化编程方法,在部分程度上具备了OO特性封装与多态。
在具体阐述之前,需要明确生存期与可见性的概念。生存期指的是变量在内存的生存周期,可见性指的是变量在当前位置是否可用。两者有紧密联系,但不能混为一谈。一个人存在但不可见只能解释成上帝或灵魂,一个变量存在但不可见却并非咄咄怪事,模块化方法正是利用了静态函数、静态变量这些“精灵”们特殊的生存期与可见性。
最后需要明确一点的是这里的模块是以一个.C文件为单位。
规则一:利用函数命名规则和静态函数
模块中不被其他模块调用的内部函数采用以下命名规则:用全部小写,单词间采用带下划线的形式。如底层图形函数:pixel、lineto以及读键盘函数get_key等。这些函数应定义为static静态函数,这样在其他模块错误地调用这些函数时编译器能给出错误(如BC编译器)。(注意:有些编译器不能报告错误,但为了代码风格一致和函数层次清晰,仍建议这样作)。
规则二:利用静态变量
模块中不能被其他模块读写的全局变量应采用static声明,这样在其他模块错误地读写这些变量时编译器能给出警告(C51编译器)或错误(BC编译器)。
规则三:引入OO接口概念和指针传参
模块间的数据接口(也就是函数)应该事先较充分考虑,需要哪些接口,通过接口需要操作哪些数据,尽量作到接口的不变性。
模块间地数据交换尽量通过接口完成,方法是通过函数传参数,为了保证程序高效和减少堆栈空间,传大量参数(如结构)应采用传址的方式,通过指针作为函数参数或函数返回指针,尽量杜绝extern形式的全局变量,请注意是extern形式的全局变量,模块内部的全局变量是允许和必须的。
传指针参数增加的开销主要是作参数的指针和局部指针的数据空间(嵌入式系统(如C51)往往由于堆栈空间有限,函数参数会放到外部RAM的堆栈中),增加的代码开销仅是函数的调用,带来的是良好的模块化结构,而且使用接口函数会比在代码中多处直接使用全局变量大大节约代码空间。
需注意一点的事物总有他的两面性,水能载舟,也能覆舟。对于需要频繁访问的变量如果仍采用接口传递,函数调用的开销是巨大的,这时应考虑仍采用extern全局变量。
以下演示了两个C模块交换数据:
//Mole1.C
OneStruct* void GetOneStruct(void); //获取模块1数据接口
void SetOneStruct(OneStruct* pOneStruct); //写模块1数据接口

struct OneStruct
{
int m¬_imember;
//……
}t1; //模块1的数据

//t1初始化代码…..

OneStruct* void GetOneStruct(void)
{
OneStruct* pt1; //只需定义一个局部变量
t1.imember=15;
pt1=&t1;
return pt1;
}

void SetOneStruct(OneStruct* pOneStruct)
{
t1.imember=pOneStruct->imember;
//…….
}

//Mole2.C
void OperateOneStruct(void); //模块2通过模块1提供的接口操作模块1的数据
OneStruct* void GetOneStruct(void);
void SetOneStruct(OneStruct* pOneStruct);

void OperateOneStruct(void)
{
OneStruct* pt2; //只需定义一个局部变量
pt2=GetOneStruct(); //读取数据
SetOneStruct(pt2); //改写数据
}
采用接口访问数据可以避免一些错误,因为函数返回值只能作右值,全局变量则不然。
例如 cOneChar == 4; 可能被误为cOneChar = 4;
规则四:有限的封装与多态
不要忘记C++的class源于C的struct,C++的虚函数机制实质是函数指针。为了使数据、方法能够封装在一起,提高代码的重用度,如对于一些与硬件相关的数据结构,建议采用在数据结构中将访问该数据结构的函数定义为结构内部的函数指针。这样当硬件变化,需要重写访问该硬件的函数,只要将重写的函数地址赋给该函数指针,高层代码由于使用的是函数指针,所以完全不用动,实现代码重用。而且该函数指针可以通过传参数或全局变量的方式传给高层代码,比较方便。例如:
struct OneStruct
{
int m¬_imember;
int (*func)(int,int);
//……
}t2;

⑥ 如果我不做底层 需要深入学习c语言吗 怎么写出不很占用资源的好代码

兄弟,编译原理现在不懂没关系,以后学就行。。高质量的代码不一定懂编译原理。去看算法,与数据结构把,,因为高层语言将编译封闭了。。然后工作时,也可以不懂,真正懂编译原理的我想10个中只有1个不到。。

⑦ 编写一个C程序,运行时输入a,b,c三个值,输出其中值最大者

#include<stdio.h>

int main()

{

int a,b,c,max;

printf("请输入三个数: ");

scanf("%d%d%d",&a,&b,&c);

if(a>b)

max=a;

if(c>max)

max = c;

printf("三个数中最大的数为:%d",max);

return 0;

}

(7)编写高质量c语言代码扩展阅读:

主要特点:

1,简洁的语言

C语言包含有各种控制语句仅有9种,关键字也只有32 个,程序的编写要求不严格且多以小写字母为主,对许多不必要的部分进行了精简。

2,具有结构化的控制语句

C语言是一种结构化的语言,提供的控制语句具有结构化特征,如for语句、if⋯else语句和switch语句等。可以用于实现函数的逻辑控制,方便面向过程的程序设计。

3,丰富的数据类型

C语言包含的数据类型广泛,不仅包含有传统的字符型、整型、浮点型、数组类型等数据类型,还具有其他编程语言所不具备的数据类型,其中以指针类型数据使用最为灵活,可以通过编程对各种数据结构进行计算。

4,丰富的运算符

c语言包含34个运算符,它将赋值、括号等均视作运算符来操作,使C程序的表达式类型和运算符类型均非常丰富。

5,可对物理地址进行直接操作

C语言允许对硬件内存地址进行直接读写,以此可以实现汇编语言的主要功能,并可直接操作硬件。

6,代码具有较好的可移植性

c语言是面向过程的编程语言,用户只需要关注所被解决问题的本身,而不需要花费过多的精力去了解相关硬件,且针对不同的硬件环境。

7,可生成的高质量目标代码,高执行效率的程序

与其他高级语言相比,C语言可以生成高质量和高效率的目标代码,故通常应用于对代码质量和执行效率要求较高的嵌入式系统程序的编写。



⑧ 如何使用C语言来编写MSP430的高质量代码

微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑,一般都要求尽量节省使用资源,并且,由于微处理器硬件一般都不支持有符号数、浮点数的运算,且运算位有限,因此,分配变量时必须仔细。另外要说明的是,速度和存储器的消耗经常是2个不可兼顾的目标,在多数情况下,编程者必须根据实际情况作出权衡和取舍。

需要注意的事项如下:
1) 通常在满足运算需求的前提下,尽量选择为变量定义字节少的数据类型。
比如最常用的int和char,int是16位的,char是8位的,如果没有必要,不要使用int,而且使用char也最好使用unsigned char。运行时,可以在变量窗口看到,使用类型为unsigned char的变量是16进制的格式,而使用int的是十进制格式,如果char没有定义为unsigned,会出现负号,如果没有必要的话,在430中是不需要负数的。
2) 尽量不用过长的数据类型,如long、long long和double
3) MSP430的C编译器不支持位寻址,所以运算中尽量减少位操作,对于只有“是”和“否”的变量,如果RAM容量允许,则可分配为unsigned char类型,可提高运算速度。如果分配为某字节的某个位,可以减少存储器的消耗,但是会降低运算速度
4) 避免使用浮点数,尽量使用定点数进行小数运算。如果必须使用浮点数,则尽量用32位的float,而不是64位的double
5) 尽量将变量分配为无符号数据类型
6) 对于指针变量,如果声明后其值不再改变,则声明为const类型,这样编译器编译时能更好的优化生成的代码
7) 尽可能的使用局部变量而非全局变量或者静态变量(static)。这样有利于编译器编译时更好的优化生成的代码
8)避免对局部变量使用 &取地址符。因为这样会使编译器无法把此变量放在CPU的寄存器中,而是放在RAM中,从而失去了优化的机会
9) 仅在模块内使用的变量声明为static,有利于优化代码
10) 如果堆栈空间有限,尽量减少函数调用的层次和递归调用

11) 如果传送参数过多,可将参数组成一个数组或者结构体,然后用指针传递
12) 某些变量在中断程序和普通级别程序中都会被用到,所以必须加以保护。
将变量声明为volatile类型,编译器优化时就不会移动它,对它的访问不会被延迟。
为保证对volatile的变量不被打断,为此,可以在访问它的部分(即访问它的函数)前面加上__moniter的声明

热点内容
oicq服务器地址 发布:2025-01-13 17:34:19 浏览:928
默认管理密码是什么 发布:2025-01-13 17:33:33 浏览:443
系列影视广告文案脚本 发布:2025-01-13 17:31:57 浏览:792
防盗器编程 发布:2025-01-13 17:24:39 浏览:899
联通电信服务器怎么不卡顿 发布:2025-01-13 17:21:30 浏览:821
科沃兹低配可以升级哪些配置 发布:2025-01-13 17:09:26 浏览:330
android判断数据库是否存在 发布:2025-01-13 17:08:17 浏览:334
ie脚本运行错误 发布:2025-01-13 17:08:05 浏览:623
python中或者怎么表示 发布:2025-01-13 16:32:33 浏览:291
易达加密锁 发布:2025-01-13 16:27:23 浏览:517