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

c语言高级应用实例

发布时间: 2023-08-30 23:49:04

A. c语言中怎样调用函数(举个例子)

C语言中调用函数的方法及步骤:

工具/原料:C语言

1、首先需要输入想要调用的函数。

B. 求C语言程序设计实例(200行)

时间函数举例程序分析
2.程序源代码:

#include "stdio.h"
#include "time.h"
void main()
{
time_t lt; /*define a longint time varible*/
lt=time(NULL);/*system time and date*/
printf(ctime(<)); /*english format output*/
printf(asctime(localtime(<)));/*tranfer to tm*/
printf(asctime(gmtime(<))); /*tranfer to Greenwich time*/
}
【程序92】

题目:时间函数举例2

1.程序分析:

2.程序源代码:

/*calculate time*/
#include "time.h"
#include "stdio.h"
main()
{
time_t start,end;
int i;
start=time(NULL);
for(i=0;i<3000;i++)
{
printf("\1\1\1\1\1\1\1\1\1\1\n");
}
end=time(NULL);
printf("\1: The different is %6.3f\n",difftime(end,start));
}
【程序93】

题目:时间函数举例3

1.程序分析:

2.程序源代码:

/*calculate time*/
#include "time.h"
#include "stdio.h"
main()
{
clock_t start,end;
int i;
double var;
start=clock();
for(i=0;i<10000;i++)
{
printf("\1\1\1\1\1\1\1\1\1\1\n");
}
end=clock();
printf("\1: The different is %6.3f\n",(double)(end-start));
}
【程序94】

题目:时间函数举例4,一个猜数游戏,判断一个人反应快慢。(版主初学时编的)

1.程序分析:

2.程序源代码:

#include "time.h"
#include "stdlib.h"
#include "stdio.h"
main()
{
char c;
clock_t start,end;
time_t a,b;
double var;
int i,guess;
srand(time(NULL));
printf("do you want to play it.('y' or 'n') \n");
loop:
while((c=getchar())=='y')
{
i=rand()%100;
printf("\nplease input number you guess:\n");
start=clock();
a=time(NULL);
scanf("%d",&guess);
while(guess!=i)
{
if(guess>i)
{
printf("please input a little smaller.\n");
scanf("%d",&guess);
}
else
{
printf("please input a little bigger.\n");
scanf("%d",&guess);
}
}
end=clock();
b=time(NULL);
printf("\1: It took you %6.3f seconds\n",var=(double)(end-start)/18.2);
printf("\1: it took you %6.3f seconds\n\n",difftime(b,a));
if(var<15)
printf("\1\1 You are very clever! \1\1\n\n");
else if(var<25)
printf("\1\1 you are normal! \1\1\n\n");
else
printf("\1\1 you are stupid! \1\1\n\n");
printf("\1\1 Congralations \1\1\n\n");
printf("The number you guess is %d",i);
}
printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n");
if((c=getch())=='y')
goto loop;
}
【程序95】

题目:家庭财务管理小程序

1.程序分析:

2.程序源代码:

/*money management system*/
#include "stdio.h"
#include "dos.h"
main()
{
FILE *fp;
struct date d;
float sum,chm=0.0;
int len,i,j=0;
int c;
char ch[4]="",ch1[16]="",chtime[12]="",chshop[16],chmoney[8];
pp: clrscr();
sum=0.0;
gotoxy(1,1);printf("|----------------------------------------------------|");
gotoxy(1,2);printf("| money management system(C1.0) 2000.03 |");
gotoxy(1,3);printf("|----------------------------------------------------|");
gotoxy(1,4);printf("| -- money records -- | -- today cost list -- |");
gotoxy(1,5);printf("| ------------------------ |-----------------------------|");
gotoxy(1,6);printf("| date: -------------- | |");
gotoxy(1,7);printf("| | | | |");
gotoxy(1,8);printf("| -------------- | |");
gotoxy(1,9);printf("| thgs: ------------------ | |");
gotoxy(1,10);printf("| | | | |");
gotoxy(1,11);printf("| ------------------ | |");
gotoxy(1,12);printf("| cost: ---------- | |");
gotoxy(1,13);printf("| | | | |");
gotoxy(1,14);printf("| ---------- | |");
gotoxy(1,15);printf("| | |");
gotoxy(1,16);printf("| | |");
gotoxy(1,17);printf("| | |");
gotoxy(1,18);printf("| | |");
gotoxy(1,19);printf("| | |");
gotoxy(1,20);printf("| | |");
gotoxy(1,21);printf("| | |");
gotoxy(1,22);printf("| | |");
gotoxy(1,23);printf("|--------------------------------------------------|");
i=0;
getdate(&d);
sprintf(chtime,"%4d.%02d.%02d",d.da_year,d.da_mon,d.da_day);
for(;;)
{
gotoxy(3,24);printf(" Tab __browse cost list Esc __quit");
gotoxy(13,10);printf(" ");
gotoxy(13,13);printf(" ");
gotoxy(13,7);printf("%s",chtime);
j=18;
ch[0 ]=getch();
if(ch[0]==27)
break;
strcpy (chshop,"");
strcpy(chmoney,"");
if(ch[0]==9)
{
mm:i=0;
fp=fopen("home.dat","r+");
gotoxy(3,24);printf(" ");
gotoxy(6,4);printf(" list records ");
gotoxy(1,5);printf("|-------------------------------------|");
gotoxy(41,4);printf(" ");
gotoxy(41,5);printf(" |");
while(fscanf(fp,"%10s%14s%f\n",chtime,chshop,&chm)!=EOF)
{
if(i==36)
{
getch();
i=0;
}
if ((i%36)<17)
{
gotoxy(4,6+i);
printf(" ");
gotoxy(4,6+i);
}
else
if((i%36)>16)
{
gotoxy(41,4+i-17);
printf(" ");
gotoxy(42,4+i-17);
}
i++;
sum=sum+chm;
printf("%10s %-14s %6.1f\n",chtime,chshop,chm);}
gotoxy(1,23);printf("|----------------------------------------------|");
gotoxy(1,24);printf("| |");
gotoxy(1,25);printf("|----------------------------------------------|");
gotoxy(10,24);printf("total is %8.1f$",sum);
fclose(fp);
gotoxy(49,24);printf("press any key to.....");getch();goto pp;
}
else
{
while(ch[0]!='\r')
{
if(j<10)
{
strncat(chtime,ch,1);
j++;
}
if(ch[0]==8)
{
len=strlen(chtime)-1;
if(j>15)
{
len=len+1;
j=11;
}
strcpy(ch1,"");
j=j-2;
strncat(ch1,chtime,len);
strcpy(chtime,"");
strncat(chtime,ch1,len-1);
gotoxy(13,7);printf(" ");
}
gotoxy(13,7);printf("%s",chtime);ch[0]=getch();
if(ch[0]==9)
goto mm;
if(ch[0]==27)
exit(1);
}
gotoxy(3,24);printf(" ");
gotoxy(13,10);
j=0;
ch[0]=getch();
while(ch[0]!='\r')
{
if (j<14)
{
strncat(chshop,ch,1);
j++;
}
if(ch[0]==8)
{
len=strlen(chshop)-1;
strcpy(ch1,"");
j=j-2;
strncat(ch1,chshop,len);
strcpy(chshop,"");
strncat(chshop,ch1,len-1);
gotoxy(13,10);printf(" ");
}
gotoxy(13,10);printf("%s",chshop);ch[0]=getch();}
gotoxy(13,13);
j=0;
ch[0]=getch();
while(ch[0]!='\r')
{
if (j<6)
{
strncat(chmoney,ch,1);
j++;
}
if(ch[0]==8)
{
len=strlen(chmoney)-1;
strcpy(ch1,"");
j=j-2;
strncat(ch1,chmoney,len);
strcpy(chmoney,"");
strncat(chmoney,ch1,len-1);
gotoxy(13,13);printf(" ");
}
gotoxy(13,13);printf("%s",chmoney);ch[0]=getch();
}
if((strlen(chshop)==0)||(strlen(chmoney)==0))
continue;
if((fp=fopen("home.dat","a+"))!=NULL);
fprintf(fp,"%10s%14s%6s",chtime,chshop,chmoney);
fputc('\n',fp);
fclose(fp);
i++;
gotoxy(41,5+i);
printf("%10s %-14s %-6s",chtime,chshop,chmoney);
}
}
}

【程序96】

题目:计算字符串中子串出现的次数

1.程序分析:

2.程序源代码:

#include "string.h"
#include "stdio.h"
main()
{
char str1[20],str2[20],*p1,*p2;
int sum=0;
printf("please input two strings\n");
scanf("%s%s",str1,str2);
p1=str1;p2=str2;
while(*p1!='\0')
{
if(*p1==*p2)
{
while(*p1==*p2&&*p2!='\0')
{
p1++;
p2++;
}
}
else
p1++ ;
if(*p2=='\0')
sum++;
p2=str2;
}
printf("%d",sum);
getch();
}
【程序97】

题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。

1.程序分析:

2.程序源代码:

#include "stdio.h"
main()
{
FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
ch=getchar();
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);putchar(ch);
ch=getchar();
}
fclose(fp);
}

【程序98】

题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。输入的字符串以!结束。

1.程序分析:

2.程序源代码:

#include "stdio.h"
main()
{
FILE *fp;
char str[100],filename[10];
int i=0;
if((fp=fopen("test","w"))==NULL)
{
printf("cannot open the file\n");
exit(0);
}
printf("please input a string:\n");
gets(str);
while(str[i]!='!')
{
if(str[i]>='a'&&str[i]<='z')
str[i]=str[i]-32;
fputc(str[i],fp);
i++;
}
fclose(fp);
fp=fopen("test","r");
fgets(str,strlen(str)+1,fp);
printf("%s\n",str);
fclose(fp);
}
【程序99】

题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),
输出到一个新文件C中。

1.程序分析:

2.程序源代码:

#include "stdio.h"
main()
{
FILE *fp;
int i,j,n,ni;
char c[160],t,ch;
if((fp=fopen("A","r"))==NULL)
{
printf("file A cannot be opened\n");
exit(0);
}
printf("\n A contents are :\n");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{
c[i]=ch;
putchar(c[i]);
}
fclose(fp);
ni=i;
if((fp=fopen("B","r"))==NULL)
{
printf("file B cannot be opened\n");
exit(0);
}
printf("\n B contents are :\n");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{
c[i]=ch;
putchar(c[i]);
}
fclose(fp);
n=i;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(c[i]>c[j])
{
t=c[i];c[i]=c[j];c[j]=t;
}
printf("\n C file is:\n");
fp=fopen("C","w");
for(i=0;i<n;i++)
{
putc(c[i],fp);
putchar(c[i]);
}
fclose(fp);
}
【程序100】

题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

1.程序分析:

2.程序源代码:

#include "stdio.h"
struct student
{
char num[6];
char name[8];
int score[3];
float avr;
} stu[5];
main()
{
int i,j,sum;
FILE *fp;
/*input*/
for(i=0;i<5;i++)
{
printf("\n please input No. %d score:\n",i);
printf("stuNo:");
scanf("%s",stu[i].num);
printf("name:");
scanf("%s",stu[i].name);
sum=0;
for(j=0;j<3;j++)
{
printf("score %d.",j+1);
scanf("%d",&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].avr=sum/3.0;
}
fp=fopen("stud","w");
for(i=0;i<5;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}

C. 经典C语言程序例子

题目01:在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同的单词。

(3)c语言高级应用实例扩展阅读:

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

D. 《单片机C语言程序设计实训100例——基于8051+Proteus仿真》 第03篇源代码

单片机c语言编程100个实例目录1
函数的使用和熟悉
实例3:用单片机控制第一个灯亮
实例4:用单片机控制一个灯闪烁:认识单片机的工作频率
实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能
实例6:使用P3口流水点亮8位LED
实例7:通过对P3口地址的操作流水点亮8位LED
实例8:用不同数据类型控制灯闪烁时间
实例9:用P0口、P1 口分别显示加法和减法运算结果
实例10:用P0、P1口显示乘法运算结果
实例11:用P1、P0口显示除法运算结果
实例12:用自增运算控制P0口8位LED流水花样
实例13:用P0口显示逻辑"与"运算结果
实例14:用P0口显示条件运算结果
实例15:用P0口显示按位"异或"运算结果
实例16:用P0显示左移运算结果
实例17:"万能逻辑电路"实验
实例18:用右移运算流水点亮P1口8位LED
实例19:用if语句控制P0口8位LED的流水方向
实例20:用swtich语句的控制P0口8位LED的点亮状态
实例21:用for语句控制蜂鸣器鸣笛次数
实例22:用while语句控制LED
实例23:用do-while语句控制P0口8位LED流水点亮
实例24:用字符型数组控制P0口8位LED流水点亮
实例25: 用P0口显示字符串常量
实例26:用P0 口显示指针运算结果
实例27:用指针数组控制P0口8位LED流水点亮
实例28:用数组的指针控制P0 口8 位LED流水点亮
实例29:用P0 、P1口显示整型函数返回值
实例30:用有参函数控制P0口8位LED流水速度
实例31:用数组作函数参数控制流水花样
实例32:用指针作函数参数控制P0口8位LED流水点亮
实例33:用函数型指针控制P1口灯花样
实例34:用指针数组作为函数的参数显示多个字符串
单片机c语言编程100个实例目录2
实例35:字符函数ctype.h应用举例
实例36:内部函数intrins.h应用举例
实例37:标准函数stdlib.h应用举例
实例38:字符串函数string.h应用举例
实例39:宏定义应用举例2
实例40:宏定义应用举例2
实例41:宏定义应用举例3
* 中断、定时器中断、定时器 *中断、定时器*中断、定时器 /
实例42:用定时器T0查询方式P2口8位控制LED闪烁
实例43:用定时器T1查询方式控制单片机发出1KHz音频
实例44:将计数器T0计数的结果送P1口8位LED显示
实例45:用定时器T0的中断控制1位LED闪烁
实例46:用定时器T0的中断实现长时间定时
实例47:用定时器T1中断控制两个LED以不同周期闪烁
实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频
实例49:用定时器T0的中断实现"渴望"主题曲的播放
实例50-1:输出50个矩形脉冲
实例50-2:计数器T0统计外部脉冲数
实例51-2:定时器T0的模式2测量正脉冲宽度
实例52:用定时器T0控制输出高低宽度不同的矩形波
实例53:用外中断0的中断方式进行数据采集
实例54-1:输出负脉宽为200微秒的方波
实例54-2:测量负脉冲宽度
实例55:方式0控制流水灯循环点亮
实例56-1:数据发送程序
实例56-2:数据接收程序
实例57-1:数据发送程序
实例57-2:数据接收程序
实例58:单片机向PC发送数据
实例59:单片机接收PC发出的数据
*数码管显示*数码管显示 数码管显示数码管显示*/
实例60:用LED数码显示数字5
实例61:用LED数码显示器循环显示数字0~9
实例62:用数码管慢速动态扫描显示数字"1234"
实例63:用LED数码显示器伪静态显示数字1234
实例64:用数码管显示动态检测结果
实例65:数码秒表设计
实例66:数码时钟设计
实例67:用LED数码管显示计数器T0的计数值
实例68:静态显示数字“59”
单片机c语言编程100个实例目录3
键盘控制*键盘控制* *键盘控制 *键盘控制 */
实例69:无软件消抖的独立式键盘输入实验
实例70:软件消抖的独立式键盘输入实验
实例71:CPU控制的独立式键盘扫描实验
实例72:定时器中断控制的独立式键盘扫描实验
实例73:独立式键盘控制的4级变速流水灯
实例74:独立式键盘的按键功能扩展:"以一当四"
实例75:独立式键盘调时的数码时钟实验
实例76:独立式键盘控制步进电机实验
实例77:矩阵式键盘按键值的数码管显示实验
//实例78:矩阵式键盘按键音
实例79:简易电子琴
实例80:矩阵式键盘实现的电子密码锁
液晶显示LCD*液晶显示LCD *液晶显示LCD * *液晶显示LCD*液晶显示LCD *液晶显示LCD */
实例81:用LCD显示字符'A'
实例82:用LCD循环右移显示"Welcome to China"
实例83:用LCD显示适时检测结果
实例84:液晶时钟设计
*一些芯片的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控/
实例85:将数据"0x0f"写入AT24C02再读出送P1口显示
实例86:将按键次数写入AT24C02,再读出并用1602LCD显示
实例87:对I2C总线上挂接多个AT24C02的读写操作
实例88:基于AT24C02的多机通信 读取程序
实例89:基于AT24C02的多机通信 写入程序
实例90:DS18B20温度检测及其液晶显示
实例91:将数据"0xaa"写入X5045再读出送P1口显示
实例92:将流水灯控制码写入X5045并读出送P1口显示
实例93:对SPI总线上挂接多个X5045的读写操作
实例94:基于ADC0832的数字电压表
实例95:用DAC0832产生锯齿波电压
实例96:用P1口显示红外遥控器的按键值
实例97:用红外遥控器控制继电器
实例98:基于DS1302的日历时钟
实例99:单片机数据发送程序
实例100:电机转速表设计
模拟霍尔脉冲

http://www.dzkfw.com.cn/myxin/51c_language.chm 单片机c语言一百例子

E. C语言中有哪些实用的编程技巧

这篇文章主要介绍了C语言高效编程的几招小技巧,本文讲解了以空间换时间、用数学方法解决问题以及使用位操作等编辑技巧,并给出若干方法和代码实例,需要的朋友可以参考下

引言:

编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。

第1招:以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招——以空间换时间。

例如:字符串的赋值。

方法A,通常的办法:

代码如下:

#define LEN 32

char string1 [LEN];

memset (string1,0,LEN);

strcpy (string1,“This is a example!!”);

方法B:

代码如下:

const char string2[LEN] =“This is a example!”;

char * cp;

cp = string2 ;

(使用的时候可以直接用指针来操作。)

从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵 活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序 执行的高效率。

如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。

该招数的变招——使用宏函数而不是函数。举例如下:

方法C:

代码如下:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

int BIT_MASK(int __bf)

{

return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);

}

void SET_BITS(int __dst, int __bf, int __val)

{

__dst = ((__dst) & ~(BIT_MASK(__bf))) | /

(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

}

SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

方法D:

代码如下:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)

#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))

#define SET_BITS(__dst, __bf, __val) /

((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | /

(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查 选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要 一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函 数的时候,该现象尤其突出。

D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。

第2招:数学方法解决问题

现在我们演绎高效C语言编写的第二招——采用数学方法来解决问题。

数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。

举例如下,求 1~100的和。

方法E

代码如下:

int I , j;

for (I = 1 ;I<=100; I ++){

j += I;

}

方法F

代码如下:

int I;

I = (100 * (1+100)) / 2

这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。

第3招:使用位操作

实现高效的C语言编写的第三招——使用位操作,减少除法和取模的运算。

在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:

方法G

代码如下:

int I,J;

I = 257 /8;

J = 456 % 32;

方法H

int I,J;

I = 257 >>3;

J = 456 - (456 >> 4 << 4);

在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存 器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。

运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。

第4招:汇编嵌入

高效C语言编程的必杀技,第四招——嵌入汇编。

“在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法 ——嵌入汇编,混合编程。

举例如下,将数组一赋值给数组二,要求每一字节都相符。

代码如下:

char string1[1024],string2[1024];

方法I

代码如下:

int I;

for (I =0 ;I<1024;I++)

*(string2 + I) = *(string1 + I)

方法J

代码如下:

#ifdef _PC_

int I;

for (I =0 ;I<1024;I++)

*(string2 + I) = *(string1 + I);

#else

#ifdef _ARM_

__asm

{

MOV R0,string1

MOV R1,string2

MOV R2,#0

loop:

LDMIA R0!, [R3-R11]

STMIA R1!, [R3-R11]

ADD R2,R2,#8

CMP R2, #400

BNE loop

}

#endif

方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有 朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个 例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。

虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。切记,切记。

F. C语言图形函数及应用 C语言输出图形

摘 要:图形函数是C语言函数库中的重要组成部分,利用图形函数可以绘制出非常精美的图形,该文介绍了常用C语言图形函数并通过一个具体的实例介绍了如何利用图形函数设计出完美、漂亮的图形。
关键词:C语言 图形函数 应用

引言

C语言是国际上广泛流行的很有发展前途的计算机高级语言。它既具有一般计算机高级语言的可读性改睁、可移植性的特点,又具有低级语言能够改皮对计算机硬件进行操作的特性,因此,它适合用于操作系统的描述语言,用C语言开发系统软件和应用软件。但在87ANSIC中并没有规定C语言的图形功能,许多C语言教材没有介绍C语言的图形功能,这给许多需要用C语言设计完美、漂亮的用户界面的初学者带来了困难[1-2]。本文旨在通过介绍Turbo C 2.0的主要图形函数及一个具体的实例简介这些函数的用法。

1 与图形绘制有关的系统硬件[2-3]

要使计算机能够绘制图形,必须有一定的硬件基础作为保障。图形绘制的硬件基础主要是显示器和显示卡。显示器的工作方式一般有文本方式和图形方式。要在屏幕上显示图形,必须将其设置成图形方式。衡量显示器的主核歼岁要性能指标是点距和分辨率。目前显示器常用的点距有0.39mm、0.31mm和0.28mm三种。高档微机配置的彩色显示器目前流行的是VGA档次,它最低的分辨率为640×480,中档的是800×600,高档的是1024×768。显示器必须与显示卡配套使用才能发挥其图形功能。显示卡所能支持的不同分辨率的显卡类型称为显示模式。下表给出Turbo C中常用的几种显示卡的图形模式:


2 Turbo C 2.0中与绘图有关的常用图形函数

2.1 设置图形工作方式的函数:initgraph()。
Turbo C绘图,首先必须设置显示器为图形方式。该函数通过选定参数可确定显卡的类型及图形模式。
如:
int driver,mode;
driver=IBM8514;
mode=IBM8514HI;
initgraph(&driver,& mode,“c:\temp”);
将图形方式设置为IBM8514类型,IBM8514HI图形模式,1024×768的分辨率,搜索路径temp为C盘一级子目录。
2.2 颜色控制函数setbkcolor(int color)及setcolor(int color)。
其中setbkcolor( )设置背景颜色,setcolor( )设置划线颜色。
2.3 基本绘图函数
A. line(int x1,int y1,int x2,int y2)
功能:从点(x1,y1)到点(x2,y2)画一直线。
B. arc(int x,int y,int stange,int endangle,int r)
功能:以(x,y)为圆弧的中心,以stange为起始角度,以endangle为终止角度,以r为半径作一圆弧。
C. setfillstyle(int pattern,int color)
功能:用参数pattern所确定的填充模式,用参数color确定的颜色进行填充。
D. floodfill(int x,int y,int color)
功能:填充一个含有点(x,y)在内的有界封闭区域,这个有界封闭区域的边界由参数color确定,填充模式与填充颜色由函数setfillstyle设定。
2.4 字符输出函数
A. settextstyle(int font,int direction,int size)
功能:在图形方式下设置字符的字体,式样和放大因子。
B. outtextxy(int x,int y,char &str)
功能:在窗口(x,y)的位置输出字符或字符串。
C. getch( )
功能:从控制台取得一字符且不输出,用来使程序暂停,按任意键后使程序继续运行。

3. 绘制一个圆饼型统计图的程序如下

#include
main( )
{ int driver,mode;
driver=VGA;
mode=VGAHI;
initgraph(&driver,&mode,“ ”);
setbkcolor(0);
setcolor(15);
arc(320,240,0,360,180);
line(320,240,500,240);
line(320,240,443,112);
line(320,240,266,70);
line(320,240,200,374);
setfillstyle(4,2);
floodfill(340,230,15);
setfillstyle(5,9);
floodfill(340,180,15);
setfillstyle(7,4);
floodfill(300,240,15);
setfillstyle(8,3);
floodfill(340,280,15);
setcolor(14);
settextstyle(1,0,4);
outtextxy(410,180,“14%”);
settextstyle(1,0,4);
outtextxy(330,110,“16%”);
settextstyle(1,0,4);
outtextxy(200,200,“34%”);
settextstyle(1,0,4);
outtextxy(340,310,“36%”);}
上述程序在Turbo C 2.0中上机通过编译、连接、运行,可得到精美的圆饼型图。读者通过阅读并上机调试运行该程序可以对C语言的图形设置、绘制;颜色的控制、填充等函数的应用有一个感性的认识,对复杂枯燥的C函数提高学习兴趣。

结语
目前许多C语言教材很少介绍C语言的图形功能,而许多C语言学习者对C语言的图形功能很感兴趣,为帮助初学者学习C语言绘图函数并提高学习兴趣,本文简单介绍了C语言一些常用的绘图函数及其应用,权当抛砖引玉!还有一些图形函数没有列出,读者若有兴趣可参阅《C语言函数大全》。

参考文献:
[1]徐士良.PC机C图形编程手册.北京:清华大学出版社,1994.2.
[2]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,1999.
[3]MarkFinlay.C和C++图形程序设计基础.北京:龙门书局,1997.4.
[4]Herbert Schildt着.戴健鹏译.C语言大全(第二版)[M].北京:电子工业出版社,1994.