C总结_编程

时间:2024.4.20

C程序设计的

赋值

浮点型 赋值给 整形 小数部分被舍弃

整形 复制给 浮点型 以浮点型保存,小数部分为0

字符型 赋值给 整形 字符型数据赋值给整形的低位,高位为0 整形 赋值给 字符型 低位赋值给字符型,高位舍去 排版:

一》:

最好用TAB键来空行(4个pace)

二》:

如果程序很长的话就用 \ 来做多行写, 比如

uncrc=calcCRC16(Packet.p,unlen);

if((UINT8) uncrc != Packet.down_ser.mCrc[0] \

||(UINT8)(uncrc>>8)!= Packet.down_ser.mCrc[1]) {

BELL(ON);

}

三》:

如果参数过多的话可以分多行来写,

void UARTSendAndRecv(UINT8 *ucSendBuf,

UINT8 ucSendLength,

UINT8 *ucRecvBuf,

UINT8 ucRecvLength)

{

……

}

四》:

If,for,do,while,switch,case,defaule等关键字后面必须加{} if(bSendEnd)

{

BELL(ON);

}

else

{

BELL(OFF);

}

//--------------------------

for(i=0; i< ucRecvLength; i++)

{

ucRecvBuf[i]=i;

}

//--------------------------

switch(ucintStatus)

{

case USB_INT_EP2_OUT:

{

USBCiEP2Send(USBMainBuf,ucrecvLen);

USBCiEP1Send(USBMainBuf,ucrecvLen);

}

break;

case USB_INT_EP2_IN:

{

USBCiWriteSingleCmd (CMD_UNLOCK_USB);

}

break;

……

}

注释:

一》:

边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有

用的注释要删除。

注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。 尽量避免在注释中使用缩写,特别是不常用缩写。

注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。

二》:

说明性文件必选在文件头着重说明,例如*.c、

/*******************************************

* 定时器+计数器测频

*

* 文 件: frequency.c

* 作 者: 小瓶盖

* 说 明:定时器+计数机测频率

* 编写时间: 2010.3.17

* 版 本:1.0

* 修改日期: 无

注: 本程序定义6个数码管,经过实测,在200HZ~50KHZ时结果较准确,误差小于0.4%, * 50KHZ以上频率未进行测量.据资料表明,可以测量到120KHZ,本程序未证明. ********************************************************************/ #include <xx

void func(vo

{ }

三》: 函数头应该进行注释,例如函数名称、输入参数、返回值、功能说明。 /**************将所有参数写入 AT24C64,共 4字节*******

*说明:将表号和用户电量共四字节数据写入AT24C64中

*入口参数:

* 1.数据间接寻址地址-buf

* 2.写入到 AT24C64的地址字-addh,addrl

* 3.写入字节数-count

*出口参数:1表示写成功,0表示写失败

****************************************************

bit write_byte(unsigned char * buf,

unsigned char addrh,

unsigned char addrl,

unsigned char count)

{

……

}

四》: 全局变量要注释其功能,若为关键的局部变量同样需要注释其功能。 volatile UINT8 __ucSysMsg=SYS_IDLE;

void SYSSetMsgPriority(void)

{

SYSMSG Msgt;//临时存储消息

UINT8 i;

}

5》:

复杂的宏定义同样要加上注释。

/* SYS_MSG_MAP 建立一个消息映射

宏参数NAME:消息映射表的名字

宏参数NUM_OF_MSG:消息映射的个数

*/

#define SYS_MSG_MAP(NAME,NUM_OF_MSG) do\ {\

DEFINE_MSG_NAME((NAME));\

UINT8 i;\

for(i=0;i< NUM_OF_MSG;i++)\

{\

ININ_CUR_MSG(i)\

}\

}while(0)

6》:

复杂的结构体同样要加上注释。

/* 奇偶校验结构体*/

typedef struct _ PKT_PARITY

{

UINT8 m_ucHead1; //首部1

UINT8 m_ucHead2; //首部2

UINT8 m_ucOptCode; //操作码

UINT8 m_ucDataLength; //数据长度

UINT8 m_szDataBuf[16];//数据

UINT8 m_ucParity; //奇偶校验值

}PKT_PARITY;

7》:

相对独立的语句组注释。对这一组语句做特别说明,写在语句组上侧,和此语句组之间

不留空行,与当前语句组的缩进一致。注意,说明语句组的注释一定要写在语句组上面,不

能写在语句组下面。

标识符:

1》:

变量的命明

方法一:采用匈牙利命名法。命名规则的主要思想是“在变量中加入前缀以增进人们对程序

的理解”。

例如平时声明32位整型变量Length对应使用匈牙利命名法为unLength。现在列出经常用到

的变量类型。

变量类型 示例

char cLength

unsigned char ucLength

short int sLength

unsigned short int usLength

int nLength

unsigned int unLength

char * szBuf

unsigned char * uszBuf

volatile unsigned char __ucLength

方法二:

? 局部变量以小写字母命名;

? 全局变量以首字母大写方式命名(骆驼式);

? 定义类型和宏定义常数以大写字母命名;

? 变量的作用域越大,它的名字所带有的信息就应该越多。 ? 局部变量: int student_age;

? 全局变量: int StudentAge;

? 宏定义常数:#define STUDENT_NUM 10

? 类型定义: typedef INT16S int;

二》:

变量命名要注意缩写而且让人简单易懂,若是特别缩写要详细说明。 经常用到的缩写如:

Count 可缩写为Cnt

Message 可缩写为Msg

Packet 可缩写为Pkt

Temp 可缩写为Tmp

平时不经常用到的缩写,要注释:

SerialCommunication 可缩写为SrlComm //串口通信变量

SerialCommunicationStatus 可缩写为SrlCommStat //串口通信状态变量

三》:

全局变量和全局函数的命名一定要详细,不惜多用几个单词,例如函数 UARTPrintfStringForLCD,

因为它们在整个项目的许多源文件中都会用到,必须让使用者明确这个变量或函数是干什么

用的。局部变量和只在一个源文件中调用的内部函数的命名可以。简略一些,但不能太短,

不要使用单个字母做变量名,只有一个例外:用i、j 、k 做循环变量是可以的。

四》:

用于编译开关的文件头,必须加上当前文件名称,防止编译时产生冲突。 例如在UARTInterface.h 头文件中,必须加上以下内容

#ifndef __UARTINTERFACE_H__

#define __UARTINTERFACE_H__

extern void UARTPrintfString(CONST INT8* str);

extern void UARTSendNBytes(UINT8 *ucSendBytes,UINT8 ucLen);

…… //其他外部声明的代码

#endif

5》:

禁止用汉语拼音作为标识符名称,可读性极差

6》:

建议名称间的区别要显而易见。使用标识符名称要注意的一个相关问题是发生在名称之

间只有一个字符或少数字符不同的情况,特别是名称比较长时,当名称间的区别很容易被误

读时问题就比较显著,比如1(数字1)和l(L 的小写)、0 和O、2 和Z、5 和S,或者n 和

h。

其他:

a. 一些常量(如圆周率PI)或者常需要在调试时修改的参数最好用#define定义,但要注意宏定

义只是简单的替换,因此有些括号不可少。

b. 不要轻易调用某些库函数,因为有些库函数代码很长(我是反对使用printf之类的库函数

的,但是是一家之言,并不勉强各位)。

c. 对各运算符的优先级有所了解,记不得没关系,加括号就是,千万不要自作聪明说自己

记得很牢。

d. 不管有没有无效分支,switch函数一定要defaut这个分支。一来让阅读者知道程序员并没

有遗忘default,并且防止程序运行过程中出现的意外(健壮性)。

e. 函数的参数和返回值没有的话最好使用void。

f. 一些常数和表格之类的应该放到code中去以节省RAM。

g. 程序编完编译看有多少code多少data,注意不要使堆栈为难。

h. 减少函数本身或函数间的递归调用

i. 编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段

对其加以保护。

j. 在多重循环中,应将最忙的循环放在最内层

k. 避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。

l. 系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。 m. 编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢

失。

其他:

1》:

Extern的作用:把局部变量声明为全局变量

.h的头文件一般用来定义接口文件(一般用#define来定义)

.c的源文件一般用来定义模块函数

2》:

在写完程序编译的时候后出现

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL

是因为组里面没有加入相应的.c文件

3》:

Volatile

如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执

行)。此例中i也应该如此说明。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意

义;

4》:

单纯的 char 类型应该只用做存储和使用字符值。

signed char 和 unsigned char 类型应该只用做存储和使用数字值。

对于基本的类型使用Typedef来表示大小和有无符号。


第二篇:C程序设计算法总结举例


1.

顺序结构举例:(该类题目,通常输入一些要素,通过使用一个或几个数学公式求解, 通过赋值表达式得到结果,并输出。包括求三角形面积,相关物体体积,求温度,解二元一次方程组、一元二次方程等)

1-1.求温度转换 华氏-摄氏温度转换公式:c=5/9(f-32)

#include <stdio.h>

main()

{float c,f;

scanf("%f",&f);

c=5.0/9*(f-32); //---------注意如果写成5/9则结果为零,同种类型变量进行运算结果还是该类型。

printf("c is : %f", c );

}

1-2.分解一个三位数的每位数字:

a=x/100;

b=x/10%10;

c=x%10;

1-3. 判断输出结果:printf("\n\n%7.3f,%-7.2f;;;%12.3f,%-12.2f",122.8899,122.8899,122.8899,122.8899);

结果为: 122.890,122.89_;;;_____122.890,122.89______

2.

选择结构算法举例:(该类题目往往根据输入进行条件判断,得到相应的值或者执行相应的操作,

包括:分段函数求值,求最值,判断大小并交换,求分数等级(switch--case,if-else if...),判断闰年,

判断一个5位数是否回文数如12321就是回文数,判断一个数字是几位数等)

2-1.分段函数求值:若x<=10,y=10;若10<x<=50,y= 10-1.0/(10-x);若x>50,y=5

关键:

float x,y;

....

if (x<=10)

y=10;

else

if (x>10 && x<=50)

y= 10-1.0/(10-x);

else

y=5;

2-2. 求a,b,c,d的最大值

关键:

.....

if (a>=b && a>=c && a>=d) max=a;

...

2-3.判断一个数是几位数

if (x>=1000) n=4;

else if(x>=100 && x<=999) n=3;

else if(x>=10 && x<=99) n=2;

else if(x>=1 && x<=9) n=1;

...

2-4.输入一个年份判断是否是闰年。

(闰年是满足下面二者之一:1。能被4整除,但不能被100整除;2。能被400整除。) #include <stdio.h>

main(){

int year;

scanf("%d",&year);

if(year%4==0 && year%100!=0 || year%400==0)

printf("yes");

else

printf("no");

}

另:最牛算法:

#include <stdio.h>

main(){

int a;

scanf("%d",&a);

printf(a%(a%100?4:400)?"NO":"YES"); //建议看看赞叹一下即可,不必学习。。。 }

3。

循环结构算法举例:循环结构应用于重复进行多次相同(相近似)的动作。while,do。。。while,for三种结构

两层循环结构的使用称为循环嵌套,注意:外层循环变量变化一次,内层循环变量遍历一圈。 包括:求最大公约数最小公倍数、求素数、鸡兔同笼、搬砖、百钱百鸡、1+(1+2)+(1+2+3)+(1+2+3+4)+??+(1+2+3+??m)

数列求和,求数列前n项、阶乘、打印图形、水仙花数、完数。

3-1.求1000以内内同时被3,5,7整除的所有数

关键:

。。。。

i=1;

while(i<=1000)

{if (i%(3*5*7)==0)

printf (" %d",i );

i=i+1;

}

3-2.用do...while求n!算法。

.....

s=1;i=1; //注意循环变量初始化的位置

do

{s=s*i;

i=i+1;

}while(i<=n);

3-3。求数列前n项。。。

f1=1,f2=1,f3=1 fn=3fn-1+2fn-2+fn-3-------------------建议此类题以后可以用数组解决。

思路 类似前面讲过的f1=1,f2=1,fn=fn-1+fn-2...

如求该数列前30项则

...

int f1,f2,f3,i;

f1=f2=f3=1;

for(i=1;i<=10;i++)

{printf("\n%d,%d,%d",f1,f2,f3);

f1=3*f3+2*f2+f1; //-----此处的f1实际上是新的f4

f2=3*f1+2*f3+f2; //-----此处的f2实际上是新的f5

f3=3*f2+2*f1+f3; //-----此处的f3实际上是新的f6

}

...

****求1!+2!+3!+....m!

方法一:-----(n+1)!=n!*(n+1)

s=0;t=1;

for(n=1;n<=m;n++)

{ t=t*n ; //1! 2! 3!

s=s+t ;

}

方法二:

s=0;

for(n=1;n<=m;n++)

{ t=1;

for(i=1;i<=n;i++)

t=t*i;

s=s+t;

}

3-4, 求分段函数值 :

若 n>=20 1!+2!+3!+。。。n!

若 20>n>=10 1*2+2*3+3*4+...+n*(n+1)

若 1<n<10 1的n次方+2的n-1次方。。。+n的1次方

#include <math.h>

...

s=0; m=1;

if(n>20)

for(i=1;i<=n;i++)

{m=m*i; //------ m存放的是每一个阶乘项 1! 2! 3! 4!=3!*4 s=s+m;

}

else if (20>n && n>=10)

for(i=1;i<=n;i++)

s=s+i*(i+1); //-----------1*2+ 2*3 + 3*4...

else if (10>n && n>1)

for(i=1;i<=n;i++)

s=s+pow(i,n-i+1); //----------pow(x,y)---x的y次方 pow(2,n-1) pow(n,1) ...

3-5,求 s=a+aa+aaa+aaaa+a...a(n个a),a,n由键盘输入!。 如输入a=3 n=5 则 s=3+33+333+3333+33333

.......

k=a;s=a;

for(i=1;i<=n-1;i++)

{a=a*10+k; //-------a的变化趋势 :3 33 333 3333

s=s+a;}

....

3-6, 求1000以内所有完数,所谓完数是指它等于它的所有因子之和比如6是完数因为6=1+2+3

...............

for(i=1;i<=1000;i++)

{s=0; //----存放每一个i的所有因子之和

for(j=1;j<=i/2;j++)

if(i%j==0)

s=s+j;

if(s==i) printf("%d is wanshu\n ",s);

}

3-7,求100—1000的所有水仙花数,所谓水仙花数是指其各位数字的立方和等于该书本身 如371是水仙花数 3*3*3+7*7*7+1*1*1=371

.................

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

{ a=x/100;

b=x/10%10;

c=x%10;

if(a*a*a+b*b*b+c*c*c==x)

printf("%d is shuixianhua\n",x);

}

3-8, 输入一个整数x,将其分解质因数 比如输入12 则显示 12=2*2*3 (此题不要求掌握,能看懂即可)

#include <stdio.h>

void main()

{int x,i;

scanf("%d",&x);

i=2;

printf("\n%d=",x);

while(i<=x)

{ if(x%i==0)

{printf("%d*",i);

x=x/i;

}

else

i++;

}

printf("\b "); //通过退格删除最后一个多余的*号

}

3-9, 输入两个整数x,y,求最大公约数和最小公倍数。

.................

1,for(i=1;i<=x;i++)

if(x%i==0 && y%i==0)

max=i; //---------------max里存放的始终是x,y进行判断过程中遇到的最大公约数

2,for(i=x;i>=1;i--)

if(x%i==0 && y%i==0)

{ max=i; break;} //---------------max里是x,y的最大公约数

辗转相除法:

...............

r=m%n;

while(r!=0)

{ m=n;

n=r;

r=m%n;

}

printf("zui da gong yue shu :%d",n); //n为最大公约数

3-10,输入人民币钱数x(x,整数),求其可能的所有组合,最小单位为1元。 如输入 x=5元 则其所有可能组合为:

1〉5张1元 2〉3张1元,1张2元 3〉2张2元,1张1元 4〉1张5元

//-----------------------------该题参考比对鸡兔同笼问题,搬砖问题,百钱百鸡问题,都是同样的解法

for(i=0;i<=x;i++)

for(j=0;j<=x/2;j++)

for(k=0;k<=x/5;k++)

for(a=0;a<=x/10;a++)

for(b=0;b<=x/20;b++)

for(c=0;c<=x/50;c++)

for(d=0;d<=x/100;d++)

if(i+2*j+5*k+10*a+20*b+50*c+100*d==x)

printf("%d,%d,%d,%d,%d,%d,%d",i,j,k,a,b,c,d);

鸡兔同笼问题: x+y=h

2x+4y=f

搬砖问题 x+y+z=36

5x+2y+z/3=36

3-11 求解方程组 x+2y+3z=100

3x-y-z =130

for(x=0;x<=100;x++) //三重循环嵌套 for(y=0;y<=50;y++)

for(z=0;z<=33;z++)

if(x+2*y+3*z==100 && 3*x-y-z==130) printf("%d%d%d",x,y,z) ;

************************或者采用如下方式***************************************

for(x=0;x<=100;x++) //两重循环嵌套 for(y=0;y<=50;y++)

{z=3*x-y-130;

if(x+2*y+3*z==100 )

printf("%d%d%d",x,y,z) ;

}

3-12 对于1000以内所有满足条件的x,求表达式的值

1。若x能同时被3,5,7整除则求 1+2+3+。。。+x的值

2。若x是水仙花数,则求 1*1*2*1*2*3*。。。*1*2*3*...(x/100)

.................

for(x=100;x<=999;x++) //----------注意循环嵌套的位置 { if(x%(3*5*7)==0)

{ s=0;

for(i=1;i<=x;i++)

s=s+i;

printf(....)

}

a=x/100;

b=x/10%10;

c=x%10;

if(a*a*a+b*b*b+c*c*c==x)

{ s=1;k=1;

for(i=1;i<=x/100;i++)

{ k=k*i;

s=s*k;

}

printf.....

}

}

也可

3-13 打印图形问题:

思路:两重循环,外层循环控制打印多少行,内层循环分三部分:

1。前导空格 2。图形,如每行星号个数 3。回车换行

如:字母塔

#include <stdio.h>

main()

{int i,j;

for(i=0;i<=25;i++)

{ for (j=0;j<=25-i;j++)

printf(" ");

for (j=0;j<=i;j++)

printf("%c",'A'+j); //-----------j取不同的值,'A'+j代表不同的字符,'A'+2代表'C'

for (j=i-1;j>=0;j--)

printf("%c",'A'+j);

printf("\n");

}

}

#include <stdio.h>

main()

{int i,j,n;

scanf("%d",&n);

for(i=0;i<n;i++)

{ for (j=0;j<n-i;j++)

printf(" ");

for (j=1;j<=2*i-1;j++)

printf("%c",'*');

printf("\n");

}

}

数组

包括:排序、查找、字符串长度、字符串大小写转换、比较字符串大小、字符串连接、字符串拷贝、数列前n项、

统计字符串中单词个数、求数组元素最值、二维数组输入、输出、转置、数字(字符串)逆序输出。

数组中统计奇数偶数,二维数组对角线元素,行列元素的相关处理。

4-1排序(选择法、起泡法)

起泡法:

<1>//起泡法排序算法

将一个数字序列存放字数组中,相邻的两个数进行比较,若前一个数大则交换,...一趟下来最大数必然在最后,

然后对于剩下元素反复执行上面操作

#include <stdio.h>

main()

{ int a[10],i,j,x;

for(i=0;i<=9;i++)

scanf("%d",&a[i]);

for(i=0;i<=8;i++)

for(j=0;j<=8-i;j++)

if(a[j]>a[j+1])

{x=a[j];a[j]=a[j+1];a[j+1]=x;}

printf("\n");

for(i=0;i<=9;i++)

printf("%5d",a[i]);

}

<2>。函数起泡法

//函数起泡法排序算法

#include <stdio.h>

main()

{ void qipao(int a[]);

int a[10],i;

for(i=0;i<=9;i++)

scanf("%d",&a[i]);

qipao(a);

printf("\n");

for(i=0;i<=9;i++)

printf("%5d",a[i]);

}

void qipao(int a[ ])

{int i,j,x;

for(i=0;i<=8;i++)

for(j=0;j<=8-i;j++)

if(a[j]>a[j+1])

{x=a[j];a[j]=a[j+1];a[j+1]=x;}

}

<3>。选择排序算法

将一个数字序列存放字数组中,假设“剩下的序列中第一个元素”为最小值,将其与数组中其它元素进行比较,找到最小值,

将该最小值与“剩下的序列中第一个元素”进行交换,------最小元素放到剩下序列的第一个位置,反复做这个操作。。。

剩下序列 假设最小值 实际最小值

a[0][1] [2]..... m存放下标

9 0 8 4 -1 9

-1 0 8 4 9

0 8 4 9 0

8 4 9 8

8 9 8

9

-1 0 4 8 9

#include <stdio.h>

main()

{ int a[10],i,j,m,x;

for(i=0;i<=9;i++)

scanf("%d",&a[i]);

for(i=0;i<=8;i++)

{ m=i;

for(j=i+1;j<=9;j++)

if(a[m]>a[j])

m=j;

x=a[m];a[m]=a[i];a[i]=x;

}

printf("\n");

for(i=0;i<=9;i++)

printf("%5d",a[i]);

}

<4>//函数选择法排序算法

#include <stdio.h>

main()

{ void xuanze(int a[]);

int a[10],i,j;

for(i=0;i<=9;i++)

scanf("%d",&a[i]);

xuanze(a); -1 0 4 8

printf("\n");

for(i=0;i<=9;i++)

printf("%5d",a[i]);

}

void xuanze(int a[])

{int i,j,x,m;

for(i=0;i<=8;i++)

{ m=i;

for(j=i+1;j<=9;j++)

if(a[m]>a[j])

m=j;

x=a[m];a[m]=a[i];a[i]=x;

}

}

4-2查找

顺序查找:数字序列放到数组中,不要求数组元素(序列本身)有序

查找x是否在数列中:

....

for(i=0;i<=9;i++)

if(x==a[i])

printf("zhaodaole %d ,%d",x,i+1);

折半查找:1.要求数列必须有序的,2,比对数列中间元素,3,缩小范围,重复2。。。。

1 2 5 8 10 18 20 120 333 1024 x=178 a[0] a[1] a[4] a[9]

....

4-3数列前n项

若已知 f1=1,f2=2,f3=3, fn=fn-1+3fn-2+fn-3 n>=4

用数组的方法求数列前n项(n由键盘输入)及前n项和。

#include <stdio.h>

main()

{int f[100],n,i,s;

scanf("%d",&n);

f[1]=1,f[2]=2,f[3]=3;s=f[1]+f[2]+f[3];

for(i=4;i<=n;i++)

{f[i]=f[i-1]+3*f[i-2]+f[i-3];

s=s+f[i];

printf("%5d",f[i]);

}

printf("%5d",s);

}

4-4

输入6个互不相同的正整数,问由这些值作为边长能组成多少个互不相同的三角形? 设每个数在组成三角形时只能使用一次,即不能出现2,2,3这样的三角形。 #include <stdio.h>

main()

{int a[6],i,j,k;

for(i=0;i<=5;i++)

scanf("%d",&a[i]);

for(i=0;i<=5;i++) //---------3重循环遍历所有取值

for(j=i+1;j<=5;j++)

for(k=j+1;k<=5;k++)

if(a[i]+a[j]>a[k] && a[i]+a[k]>a[j] && a[j]+a[k]>a[i])

printf("%d,%d,%d ",a[i],a[j],a[k]);

}

4-5

输入A[10],1。求数组中所有值为偶数的元素之和。

2。求数组中所有下标为奇数的元素的乘积。

3。将数组中所有值为3的倍数的数组元素值清零。

#include <stdio.h>

main()

{int a[10],i,s=0,k=1;

for(i=0;i<=9;i++)

{ scanf("%d",&a[i]);

if(a[i]%2==0) s+=a[i];

if(i%2==1) k=k*a[i];

}

for(i=0;i<=9;i++)

printf("%4d",a[i]);

printf("\n%3d,%3d\n\n",s,k);

for(i=0;i<=9;i++)

if(a[i]%3==0) a[i]=0;

for(i=0;i<=9;i++)

printf("%4d",a[i]);

}

4-6 杨辉三角形

#include <stdio.h>

main()

{int a[20][20],i,j;

for(i=0;i<=9;i++)

{ a[i][0]=1;

a[i][i]=1;

}

for(i=2;i<=9;i++)

for(j=1;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i<=9;i++)

{for(j=0;j<=i;j++)

printf("%5d",a[i][j]);

printf("\n");

}

}

4-7二维数组应用综合举例 ************************************重点看,每条注释//下表示要实现的功能描述

//本题目为二维数组的各种运算综合

#include <stdio.h>

main()

{int a[3][3],i,j,k=0,m,n,s=0,max,c=0,f[3],s1=0,b[9];

// 对比給一维数组赋值:for(i=0;i<=9;i++) scanf("%d",&a[i]);

// 给数组元素键盘赋值

for(i=0;i<=2;i++)

for(j=0;j<=2;j++)

scanf("%d",&a[i][j]);

//实现二维数组输出为方阵的方法

for(i=0;i<=2;i++)

{

for(j=0;j<=2;j++)

printf("%4d",a[i][j]);

printf("\n");

//注意此换行语句的位置--一定要在外层循环内部,内层选环外部

}

//转置矩阵的输出

printf("\n");

for(i=0;i<=2;i++)

{

for(j=0;j<=2;j++)

printf("%4d",a[j][i]);

printf("\n");

}

max=a[2][1];m=2,n=1; //随便假设数组中某个元素为最大值 //遍历二维数组,挨个比较求最大值

for(i=0;i<=2;i++)

for(j=0;j<=2;j++)

{

s=s+a[i][j]; //顺便求出所有数组元素的和

if(max<a[i][j])

{ max=a[i][j]; m=i,n=j; } //m,n存放最大元素下标

}

//求对角线元素之和

for(i=0;i<=2;i++)

c=c+a[i][i]+a[i][2-i];

// a[i][i]为主对角线元素,a[i][2-i]为辅对角线元素

c=c-a[1][1];

printf("\n最大值%3d,下标%d,%d",max,m,n);

printf("\n数组和%3d,对角线和%3d",s,c);

//输出所有列下标大于行下标的数组元素

for(i=0;i<=2;i++)

for(j=0;j<=2;j++)

if(j>i)

printf("\n行下标: %d,列下标: %d,数组元素值: %d",i,j,a[i][j]);

//数组f里元素均初始化为0

for(i=0;i<=2;i++)

f[i]=0;

//求每列元素的和,并将其放入数组f中

for(i=0;i<=2;i++)

{for(j=0;j<=2;j++)

f[i]=f[i]+a[j][i];

printf("列下标为 %d的元素和为: %3d",i,f[i]);

}

//求所有能被2,3,5整除的数组元素的平方和

for(i=0;i<=2;i++)

for(j=0;j<=2;j++)

{ if(a[i][j]%(2*3*5)==0)

s1=s1+a[i][j]*a[i][j];

}

printf("能被2,3,5整除的数组元素的平方和:%5d\n",s1);

//将二维数组赋值给一维数组,并输出

n=0;

for(i=0;i<=2;i++)

for(j=0;j<=2;j++)

{b[n]=a[i][j];

printf("%5d",b[n]);

n++;

}

}

4-8

//下面程序将对字符串的一些应用给与举例****************重点看 #include <stdio.h>

#include <string.h>

main()

{char a[100],b[30],c[4][100];

int i,j,k;

//编程序实现gets函数功能如下:

puts("请输入字符串a:\n");

i=0;

while((a[i]=getchar())!='\n')

i++;

a[i]='\0';

puts("输入的字符串是:\n");

printf("%s",a);

//编程序实现strlen函数的功能:

i=0;

while(a[i]!='\0')

i++;

printf("%s","输入的字符串长度是:\n");

printf("%d\n",i);

//编程序实现strcat函数的功能:

i=j=0;

puts("请输入字符串b:\n");

gets(b);

while(a[i]!='\0')

i++;

while(b[j]!='\0')

{a[i]=b[j];

i++;

j++;}

a[i]='\0';

puts("连接后字符串为:\n");

puts(a);

//编程序实现strcmp函数功能:

i=0;k=0;

puts("\n请重新输入两个字符串:\n");

gets(a);gets(b);

while(a[i]!='\0' || b[i]!='\0')

{if(a[i]>b[i]) {k=1;break;}

if(a[i]<b[i]) {k=-1;break;}

i++;

}

if(k==0) printf("两个字符串相等");

else if(k==1) printf("%s 大于 %s\n",a,b);

else printf("%s 大于 %s\n",b,a);

}

4-9

将字符串倒置,下面的代码有什么问题??

main()

{

char str[14]="abcedfghijklmn";

char a[14];

int i;

for(i=0;i<14;i++)

a[i]=str[13-i];

printf("%s",a);

}

系统运行将会报error C2117: 'abcedfghijklmn' : array bounds overflow错误。

为何报此错误呢?

注意字符串的长度并非是双引号内的字符个数(此题中为14个)而是字符个数加一, 此题为15个,这是因为系统自动要在字符串的末尾添加字符'\0'造成的。

而题目中存放字符串的字符数组str 和a 定义长度为14,不够存放,所以报错误为下标越界!

可以改为

#include <stdio.h>

main()

{

char str[15]="abcedfghijklmn";

char a[15];

int i;

for(i=0;i<14;i++)

a[i]=str[13-i];

a[i]='\0';

printf("%s",a);

}

关于二维数组的行列,需要注意的一点就是:求类似“行最大”或者“列最大”这样的结果时,需要进行

行最大:遍历该行,即确定行下标后,列下标取所有可能。

列最大:遍历该列,即确定列下标后,行下标取所有可能。

for(i=0;i<N;i++)

{x[i]=a[i][0]; //---------------注意,此时针对下标为i的每行进行处理,请比较下面另一段代码

for(j=1;j<M;j++)

if(x[i]<a[i][j]) x[i] =a[i][j]; //-----这句话的意思是遍历i行所有元素,求出该行最大值,放入x[i]中。

}

for(j=0;j<M;j++)

{x[j]=a[0][j]; //---------------注意,此时针对下标为j的每列进行处理,请比较上面另一段代码

for(i=1;i<N;i++)

if(x[j]<a[i][j]) x[j] =a[i][j]; //-----这句话的意思是遍历j列所有元素,求出该列最大值,放入x[j]中。

}

5。函数

函数的分类:

1,系统函数(库函数) 通过#include 包含相应的头文件,并填写相关的参数实现调用,是系统提供给大家直接使用的。

如求x的y次方,即 #include <math.h> ....程序中有 z=pow(x,y);

2,用户自定义函数

类型 函数名(形参表列) ------若形参不存在,表示该函数为无参函数 即: 类型 函数名()

{

函数体;

return 返回值; ------若无return语句,表明该函数不需要返回值,

此时一般函数类型为void ,即 void 函数名(形参表列)

}

函数的调用

函数定义好之后应该能够使用,这个使用函数的过程称为函数调用。

方法有三:

1,函数语句调用 如: s(x,y);

2, 表达式调用 如: z=s(x,y)+1;

3, 函数作为其他函数的参数调用 如: printf("%d",s(x,y));

函数的使用注意:

若被调用函数在调用函数前面,则调用函数中不需要对被调用函数进行声明,否则需要声明 如:

#include <stdio.h>

int max(int a,int b)

{if (a>b)

return a;

else

return b;

}

//由于max定义在前,main里无需声明

main()

{int a,b,z;

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

z=max(a,b);

printf("max is %d" ,z);

}

反之:

#include <stdio.h>

main()

{int max(int a,int b);//------------------函数声明,由于max定义在后,main里需声明!或 int max(int,int);

int a,b,z;

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

z=max(a,b);

printf("max is %d" ,z);

}

int max(int a,int b)

{if (a>b)

return a;

else

return b;

}

5-1

编函数实现求a,b,c的最大值,平均值,和

#include <stdio.h>

int s1(int x, int y,int z)

{int k;

k=x+y+z;

return k;

}

float s2(int a, int b,int c)

{float k;

k=(a+b+c)/3.0;

return (k);

}

int s3(int a, int b)

{int k;

if (a>b)

k=a;

else

k=b;

return k;

}

//由于s1,s2,s3的定义都在调用它们的函数(此处为main()前,因此main()内无需声明。 main()

{int a,b,c,sum,max;

float aver;

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

sum=s1(a,b,c);

aver=s2(a,b,c);

max=s3(s3(a,b),c);

printf("sum=%d,aver=%f,max=%d",sum,aver,max);

}

5-2

编写函数实现打印

******

******

******

#include <stdio.h>

void pr()

{

printf(" ******\n");

printf(" ******\n ******\n");

}

main()

{

pr(); //函数语句调用,该函数无返回值,无参数传递

}

5-3

编写函数实现打印

**** n行每行n个星号,n由键盘输入,此时,n值为4

****

****

****

#include <stdio.h>

void pr(int n)

{int i,j;

for(i=1;i<=n;i++) //外层循环控制打印多少行,此时根据题意为n行。

{for(j=n;j>=i;j--)

printf(" "); //输出每行前导空格

for(j=1;j<=n;j++) //输出为平行四边形,若改为 for(j=1;j<=2*i-1;j++) 输出为正三角形 printf("*"); //输出每行n个星号

printf("\n");

}

}

main()

{int n;

scanf("%d",&n);

pr(n); //函数语句调用,该函数无返回值,实参为n

}

5-4

编写函数实现一元二次方程求解。

#include <math.h>

#include <stdio.h>

main()

{void fangcheng(int a,int b, int c);

int a,b,c;

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

fangcheng(a,b,c);

}

void fangcheng(int a,int b, int c)

{float x1,x2;

if (b*b-4*a*c>=0)

{if (b*b-4*a*c>0)

{

x1=(-b+sqrt(b*b-4*a*c))/(2.0*a);

x2=(-b-sqrt(b*b-4*a*c))/(2.0*a);

}

else

x1=x2=(-b)/(2.0*a);

printf("x1=%5f,x2=%5f",x1,x2);

}

else

printf("方程无解");

}

5-5编程序实现函数strupr(str)函数的功能:该函数实现小写字母转换为大写字母。******重点看

#include <stdio.h>

main()

{char a[100];

void change(char str[]);

gets(a);

change(a);

puts(a);

}

void change(char str[])

{int i=0;

while(str[i]!='\0')

{ if(str[i]>='a' && str[i]<='z')

str[i]=str[i]-32;

i++;

}

}

5-6编程序实现函数strcat(str1,str2)函数的功能:该函数实现将两个字符串(分别存放于str1,str2中)连接。******重点看

#include <stdio.h>

void scat(char a[],char b[])

{int i,j;

i=j=0;

while(a[i]!='\0') //---------定位字符串a的结尾

i++;

while(b[j]!='\0') //---------实现字符串连接

{a[i]=b[j];

i++;

j++;

}

a[i]='\0'; //连接产生的新字符串末尾添加字符串结束标识

}

main()

{char a[100],b[30];

puts("请输入字符串a,b:\n");

gets(a);

gets(b);

scat(a,b); //函数名做为参数

puts("连接后字符串为:\n");

puts(a);

}

5-7

编写函数实现:

输入一维数组求数组中元素的最大值

输入a,b,c,d求最小值

#include <stdio.h>

//此例子中求最值分别采用条件表达式和选择结构实现,请仔细比较二者使用方式 int f1(int a, int b)

{

return a>b?a:b;

}

int f2( int a, int b)

{ int c;

if(a<b)

c=a;

else

c=b;

return c;

}

main()

{int a,b,c,d,s[10],i,max,min;

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

for(i=0;i<=9;i++)

scanf("%d",&s[i]);

//以上给a,b,c,d和数组s赋值

max=f1(f1(f1(a,b),c),d);

min=s[0]; //假设min是数组中任意元素

for(i=0;i<=9;i++)

min=f2(min,s[i]);

printf("max is:%3d, min is :%3d\n",max,min);

}

5-8函数要求掌握的算法实现:

排序、查找、字符串求长度,连接,复制,比较大小,输入,输出

以及前面讲过的各种算法通过函数调用实现,求素数,求闰年,最大公约、最小公倍数等等。

6编译预处理命令

#include <stdio.h>

#define n 5+3

....

printf("%5d",n*n);

其结果是?

答案 23 理由:纯粹置换! n*n---5+3*5+3

break; continue;区别

break; 循环和 switch...case中

continue; 循环中

#include <stdio.h>

main()

{ int i,s=0;

for(i=1;i<=10;i++)

{ if(i%3==0)

{ printf("%3d",i); break;}

//{ printf("%3d",i); continue;}

s=s+i;

}

printf("%3d",s);

}

3 3 //3 6 9 37 37=1+2+4+5+7+8+10

#include <stdio.h>

int s=3; //s全局变量

int a(int x)

{ int c=1,s=2; //c,s,x局部变量

return c+s+x; //t不起作用

}

int t=6; //t全局变量

main( )

{ int x,y; //y,x局部变量

x=5;

y=a(x);

printf("%2d,%2d,%2d",s,y,t);

}

局部变量起作用的范围是定义它的函数内

全局变量起作用的范围是从定义点开始到程序结束

静态变量,动态变量

#include <stdio.h>

int a(int x)

{ static int c=0; //c静态变量,始终存在 c=0 仅仅执行一次 ,其值保留上次运行结

int i=1; //i动态变量,每次调用分配内存空间,每次都重新赋初始值1 c++;i++;

return c+i+x;

}

main( )

{int x,y=0;

for(x=1;x<=10;x++)

y+=a(x);

printf("%2d",y);

}

c+i+x

130= (1+2+1)+(2+2+2)+(3+2+3)+(4+2+4)+(5+2+5).....+(10+2+10)

更多相关推荐:
工程结算总结

1、工程完工后,乙方依据后来变化的施工图做了结算,结算仍然采用清单计价方式,结算价是1200万元,另外还有200万元的洽商变更(此工程未办理竣工图和竣工验收报告,不少材料和作法变更也无签字)。咨询公司在对此工程…

电气及工程结算总结

结算总结1、必须做好结算审核的前期工作。如:招标文件、投标文件、中标通知书、施工图纸、竣工图纸、会审纪要、设计变更、隐蔽记录、施工签证及施工合同等都是工程结算的主要依据。2、造价高的项目、补充单价(找差价)及计…

某工程结算工作总结

***工程结算工作总结一、工程量核对是工程结算的基础工程结算造价计算是否准确,首要的是工程量计算的精度。在条件允许的情况下,多采用全面审查法,即按图纸及统一的工程量计算规则,按预、结算编制的程序和项目要求逐项要…

工程竣工结算总结

工程竣工结算总结第一章认真分析影响工程结算的因素对办好工程竣工结算是很有意义的11工程结算的涵义工程结算直接关系到建设单位和施工单位的切身利益在结算的编审过程中由于编审人员所处的地位立场和目的不同而且编审人员的...

关于工程结算的总结,精辟、到位!

众所周知竣工结算是一项很琐碎麻烦但同时技术含量很高的工作这里的技术含量体现在什么地方一结算依据技术性文件工程结束后要进行竣工结算首先合同内不必说总价承包该多少就多少工程之外的委托工程量签证工程联系单设备缺陷处理...

工程结算心得体会

项目竣工结算必看:工程结算心得体会目前,施工方大部分都是在最低让利后中标的,这就造成了施工方会在结算时想尽一切办法多要一点。作为建设方预算人员,通过3年多的实践,总结出了几条施工方常用的结算技巧,供大家参考。①…

工程结算个人小结2篇

1、经历的这次工程是个比较大的工程。公司成立里项目部。项目部下设工程、质量、安全、综合、经营等五个主要部门,而所在的自然是经营部门了。其他部门就不必说了,就说经营部门,无非收支两条线。对甲方多要钱,对分包队伍,…

工程结算与工程决算的区别

工程结算与工程决算不同点1二者包含的范围不同工程竣工结算是指按工程进度施工合同施工监理情况办理的工程价款结算以及根据工程实施过程中发生的超出施工合同范围的工程变更情况调整施工图预算价格确定工程项目最终结算价格它...

分包工程结算单

分包工程结算单

工程结算与决算的区别

工程结算与决算的区别理解1结算是施工方给业主提供的向业主要钱的经济文件决算是业主向上级主管部门提供的报告产值的经济文件这是我的理解希望大家共同讨论理解2单位工程竣工验收后由施工单位提出并经建设单位审核签认的以表...

工程结算书格式050704

华能国际电力股份有限公司基建工程施工标段结算书格式及说明电厂期工程施工标段结算汇总表金额单位万元说明1本表及以下所有表格均以Excel制作和填报2对应概算金额含编制年价差和编制月与静态水平年的价差3工程量差调整...

工程结算对量经验分享

一构造柱大家一看到图纸上的构造柱三个字就立马出来一个概念这是二次结构其实不然关于工程中的构造柱要分两种情况进行列项和计价1结构性构造柱这种构造柱是在结构平面图中直接表示出来的它的施工工艺和框架柱完全相同不同的只...

工程结算总结(45篇)