我平时积累的一点东东和大家分享哈
课程设计
第1章 图形方式下的编程
1.1 图形编程基础
C语言具有强大的作图功能,支持多种显示器和驱动器。Turbo C提供了非常丰富的图形函数,所有图形函数的原型都在graphics.h头文件中。
1.1.1 图形模式的初始化
微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。所以在作图前,必须把屏幕设置为图形模式。图形显示器适配器种类很多,通常使用Turbo C 提供的自动检测显示硬件的函数,再进行图形模式初始化。对于初学者,Turbo C提供一种简单的初始化的方法。
例1_01:自动进行图形模式初始化。
#include<graphics.h>
main()
{ int gdriver=DETECT,gmode; /*gdriver和gmode分别表示图形驱动器和模式 */
initgraph(&gdriver,&gmode," ");/* 图形初始化 */
circle(320,240,50); /* 画圆 */
circle(320,240,80);
circle(320,240,110);
getch(); /*按任意键后*/
closegraph(); /*返回文本模式*/
}
initgraph(&gdriver,&gmode,” “); 是图形初始化函数。
closegraph( ); 是退出图形状态函数,调用后返回文本方式。
在例1_1中的图形初始化函数和退出函数是每个作图程序必须有的。
1.1.2 屏幕颜色的设置和清屏函数
图形颜色设置分为背景色的设置和前景色的设置。
颜色设置表
符号常量
数值
含义
符号常量
数值
含义
BLACK
0
黑色
DARKGRAY
8
深灰
BLUE
1
蓝色
LIGHTBLUE
9
淡蓝
GREEN
2
绿色
LIGHTGREEN
10
淡绿
CYAN
3
青色
LIGHTCYAN
11
淡青
RED
4
红色
CLIGHRED
12
淡红
MAGENTA
5
洋红
LIGHTMAGENTA
13
淡洋红
BROWN
6
棕色
YELLOW
14
[屏蔽]
LIGHTGRAY
7
淡灰
WHITE
15
白色
下例中,出现有有关颜色设置、清屏函数
例1_02
#include<stdio.h>
#include<graphics.h>
main()
{ int gdriver,gmode,i,j;
gdriver=DETECT;
initgraph(&gdriver,&gmode,""); /*图形初始化*/
setbkcolor(0); /*设置图形背景*/
cleardevice(); /*清屏*/
for(i=0;i<=15;i++)
{ setcolor(i); /*设置不同作图色*/
circle(319,239,20+i*15); /*画不同半径的圆*/
delay(300000); /*延迟3000毫秒*/
}
for(i=0;i<=15;i++)
{ setbkcolor(i); /*设置不同的背景色*/
cleardevice(); /*画不同半径的圆*/
for(j=0;j<=15;j++)
{ setcolor(j);
circle(319,239,20+j*15);
delay(300000);
}
}
getch();
closegraph();
}
例1_03
#include <conio.h>
void main(void)
{
int color; /* */
for (color = 0; color < 8; color++)
{
textbackground(color); /*定义整型变量*/
cprintf("This is color %d\r\n", color);/*输入这种背景颜色*/
cprintf("Press any key to continue\r\n");
getch(); /*按任意键结束*/
}
}
1.1.3 文本颜色的设置
设置文本颜色: textcolor(color);
设置闪烁文字的颜色:textcolor(128+color);
文字颜色设置表
符号常量
数值
含义
符号常量
数值
含义
BLACK
0
黑色
DARKGRAY
8
深灰
BLUE
1
蓝色
LIGHTBLUE
9
淡蓝
GREEN
2
绿色
LIGHTGREEN
10
淡绿
CYAN
3
青色
LIGHTCYAN
11
淡青
RED
4
红色
CLIGHRED
12
淡红
MAGENTA
5
洋红
LIGHTMAGENTA
13
淡洋红
BROWN
6
棕色
YELLOW
14
[屏蔽]
LIGHTGRAY
7
淡灰
WHITE
15
白色
闪烁 BLINK 128
例1_04
#include <conio.h>
void main(void)
{
int color;
for (color = 1; color < 16; color++) /*循环语句打印出16种文字颜色与闪烁*/
{
textcolor(color); /*根据for语句来设置文本颜色*/
cprintf("This is color %d\r\n", color);/*打印该种颜色*/
}
textcolor(128 + 15); /*设置闪烁文字的颜色*/
cprintf("This is blinking\r\n");
}
说明:按ctrl+F9运行程序后,再按Alt+F5, 在用户窗口观看结果。
关于图形的坐标:
在文本方式下,屏幕被分成25行(或40行或50行),80列(或40列)。系统默认的坐标是:原点在屏幕左上角(1,1), 坐标是整数,X坐标从左向右增加,Y轴从上到下增加。
在图形方式下,屏幕被划分为象素,每个象素在屏幕上显示一个点。象素的个数取决于视频适配器的类型和适配器的工作方式。系统默认的坐标是:原点在屏幕左上角(0,0),坐标为整数,X坐标从左向右增加,Y坐标从上到下增加。屏幕上的X、Y值都有一个最大值。
可以通过下面的程序来获取屏幕最大的X值和Y值:
例1_04B 获取屏幕最大的X值和Y值。
#include<graphics.h>
#include<stdio.h>
main()
{
int Max_x,Max_y;
int stangle,endangle,radius1,radius2;
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
Max_x=getmaxx();
Max_y=getmaxy();
printf("The maximum value of x is %d\n",Max_x);
printf("The maximum value of y is %d\n",Max_y);
getch();
closegraph();
}
1.1.4 基本图形函数
基本图形函数包括画点、线、圆、圆弧、椭圆等。
1.画点函数putpixel(int x, int y, int color)
(x,y) 表示点的坐标
int color 表示画点的颜色
例1_05 画一线段
#include<graphics.h>
#include<stdio.h>
main()
{
int i;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode," ");
for(i=200;i<501;i++) /*从点(200,100)到点(500,100)用白色画线段 */
{
putpixel(i,100,WHITE);
}
getch();
closegraph();
}
2.坐标位置函数
1) 函数getmaxx( ), getmaxy( )
分别返回x轴和y轴的最大值
2) 函数getx( ), gety( )
返回当前图形位置的x坐标y坐标
3) 函数 moveto(int x, int y);
把画笔从当前位置移到点(x,y)
4) 函数 moverel(int dx, int dy)
把画笔从当前位置(x0,y0)移动到点(x0+dx, y0+dy)
例1_06 在屏幕中央画一个巨字
#include <graphics.h>
#include <stdio.h>
main()
{ int i;
int x_start, y_start; /*每条线开始的坐标*/
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
x_start=getmaxx()/2-30; /*第一笔:横 */
y_start=getmaxy()/2-30;
for(i=x_start;i<=x_start+60;i++)
putpixel(i,y_start,RED);
getch();
for(i=x_start;i<=x_start+60;i++) /*第二笔:横折*/
putpixel(i,y_start+20,RED);
x_start=i-1;
moveto(x_start,y_start+20);
x_start=getx();
y_start=gety();
for(i=y_start;i<=y_start+15;i++)
putpixel(x_start,i,RED);
getch();
moverel(-60,15); /*第三笔:横 */
x_start=getx();
y_start=gety();
for(i=x_start;i<=x_start+60;i++)
putpixel(i,y_start,RED);
getch();
moverel(0,-35); /*第四笔:竖折 */
x_start=getx();
y_start=gety();
for(i=y_start;i<=y_start+55;i++)
putpixel(x_start,i,RED);
moverel(0,55);
x_start=getx();
y_start=gety();
for(i=x_start;i<=x_start+60;i++)
putpixel(i,y_start,RED);
getch();
closegraph();
}
3. 文本输出函数
可在屏幕上的图形加说明。
1) outtext(文本字符串)
在指定位置输出“文本字符串”,可先用moveto( )函数把画笔移动到指定的位置。
2) outtextxy(x, y, 文本字符串)
在指定点(x,y)处开始输出“文本字符串”。
例1_7 用上述函数在指定的点输出文本
#include<graphics.h>
#include<stdio.h>
main()
{ int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
moveto(200,150); /*把画笔定位于点(200,150) */
outtext("The\"outtext()\" is up."); /*用函数outtext( )输出文本 */
getch(); /*停顿,按任意键继续*/
moveto(200,250); /*把画笔定位于点(200,250) */
outtext("How do you do?"); /*输出文本 */
outtextxy(200,350,"The \"outtextxy()\" is down.");/*用函数outtextxy( )输出文本*/
getch();
closegraph(); }
4.画线函数
1) line(int x0, int y0, int x1, int y1);
功能:画一条以点(x0, y0),(x1, y1)为端点的线段。
2) lineto( int x, int y);
功能:画一条以当前点为一个端点,(x,y)为另一个端点的线段
3) linerel( int dx, int dy);
功能:画一条以当前点(x,y)为一个端点,(x+dx, y+dy)为另一个端点的线段
例1_8
#include<graphics.h>
#include<stdio.h>
main()
{ int x,y;
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
x=getmaxx()/2-30;
y=getmaxy()/2-27;
line(x,y,x+60,y); /*第一笔:横 */
getch();
moveto(x,y+20);
lineto(x+60,y+20); /*第二笔:横折 */
getch();
linerel(0,15);
getch();
moverel(-60,0); /*第三笔:横*/
lineto(x+60,y+35);
getch();
line(x,y,x,y+55); /*第四笔:竖折*/
moveto(x,y+55);
linerel(60,0);
getch(); closegraph(); }
5. 画圆及圆弧函数
1)画圆函数 circle( int x, int y, int radius);
功能:画一个以点(x,y)为圆心,radius为半径的圆
2)画圆弧函数 arc(int x, int y, int stangle, int endangle, radius);
画一个以点(x,y)为,圆心,radius为半径,起始角为stangle,终止角为endangle的圆弧
例1_09 利用画圆及圆弧函数circle( ), arc( )画一个“小眼睛“
#include<graphics.h>
#include<stdio.h>
main()
{
int x,y;
int stangle,endangle,radius1,radius2;
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
x=getmaxx()/2;
y=getmaxy()/2;
stangle=25;
endangle=155;
radius1=30;
radius2=45;
circle(x,y,radius1); /*画“眼珠“ */
setcolor(RED);
arc(x,y,stangle,endangle,radius2); /*画上“眼框“ */
arc(x,y,stangle+180,endangle+180,radius2); /*画下“眼框“ */
getch();
closegraph();
}
6.画椭圆函数
ellipse(int x, int y, int stangle, int endangle,int xradius,yradius)
功能:画一个以点(x,y)为中心,起始角为stangle,终止角为endangle,长半轴为xradius,
短半轴为yradius的椭圆
例1_10利用椭圆函数ellipse( )修改上例的画“小眼睛“的程序。
#include<graphics.h>
#include<stdio.h>
main()
{
int x,y;
int stangle,endangle,radius,xradius,yradius;
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
x=getmaxx()/2;
y=getmaxy()/2;
stangle=15;
endangle=165;
radius=30;
xradius=60;
yradius=40;
circle(x,y,radius); /*画眼珠 */
setcolor(RED);
ellipse(x,y,stangle,endangle,xradius,yradius); /*画上眼框 */
ellipse(x,y,stangle+180,endangle+180,xradius,yradius); /*画下眼框 */
getch();
closegraph();
}
7.画矩形框函数
rectangle( int left, int top, int right, int bottom);
功能:画一个矩形,其左上角坐标是(left,top),右下角坐标是 (right,bottom)
例 1_11画一个多彩的矩形
#include<graphics.h>
#include<stdio.h>
#include<dos.h>
main()
{
int i;
int left,top,right,bottom;
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
left=getmaxx()/2-120;
top=getmaxy()/2-90;
right=getmaxx()/2+120;
bottom=getmaxy()/2+90;
for(i=0;i<16;i++)
{ setcolor(i); /*改变画笔颜色*/
rectangle(left,top,right,bottom); /*画矩形*/
getch(); /*暂停,按任意键继续*/
}
getch();
closegraph();
}
8.设定线型函数
setlinestyle( int linestyle, unsigned upattern, int thick);
用于设置当前绘图所用的线型和线宽, 其中参数的含义如下:
1) linestyle: 整型变量,用于设定所画线段的类型,如下表所示:
linestyle的数值及含义说明
符号表示
对应数值
含义
SOLID_LINE
0
实线(预设)
DOTTED_LINE
1
点线
CENTER_LINE
2
中心线
DASHED_LINE
3
虚线
USERBIT_LINE
4
用户自定义线型
2) upattern :无符号整型变量。当用户要自定义线型时,才使用此参数。如果线型不是
用户自定义时,取0;
3) thick: 整型变量,用于设定所画线段的粗细,单位为像素。如下表所示:
符号表示
对应数值
含义
NORM_WIDTH
1
一个像素宽度(预设)
THICK_WIDTH
3
三个像素宽度
例1_12 线型设定例1
/*1-4.c*/
#include "stdlib.h"
#include "graphics.h"
main()
{
int gdriver=DETECT, gmode, i;
initgraph(&gdriver, &gmode, "");
setbkcolor(RED);
cleardevice();
setcolor(BLUE);
circle(320,240,50);
circle(320,240,100);
setlinestyle(0, 0, 3); /*设置三点宽实线*/
setcolor(2);
rectangle(220, 140, 420, 340);
setcolor(WHITE);
setlinestyle(4, 0xaaaa, 1); /*设置一点宽用户定义线*/
line(220, 240, 420, 240);
line(320, 140, 320, 340);
getch();
closegraph();
}
例1_13 各种线型展示
#include<graphics.h>
#include<stdio.h>
main()
{
int i;
int left, top, right,bottom;
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode," ");
left=getmaxx()/2-70;
top=getmaxy()/2-50;
right=getmaxx()/2+70;
bottom=getmaxy()/2+50;
for(i=0;i<4;i++)
{
setlinestyle(i,0,NORM_WIDTH); /*设置线宽*/
outtextxy(getmaxx()/2-105,top-60,"The line is NORM_WIDTH");
switch(i)
{
case 0:outtextxy(getmaxx()/2-105,top-10,"The linestype is SOLID_LINE");
case 1:outtextxy(getmaxx()/2-105,top-10,"The linestype is DOTTED_LINE");
case 2:outtextxy(getmaxx()/2-105,top-10,"The linestype is CENTER_LINE");
case 3:outtextxy(getmaxx()/2-105,top-10,"The linestype is DASHED_LINE");
}
rectangle(left,top,right,bottom);
getch();
setcolor(BLACK); /*把画笔设置为背景色*/
/*下面八行程序是以背景色来重画刚画过的图形(文字)*/
/*目的是擦去刚画过的图形和文字*/
outtextxy(getmaxx()/2-105,top-60,"The line is NORM_WIDTH");
switch(i)
{
case 0:outtextxy(getmaxx()/2-105,top-10,"The linestype is SOLID_LINE");
case 1:outtextxy(getmaxx()/2-105,top-10,"The linestype is DOTTED_LINE");
case 2:outtextxy(getmaxx()/2-105,top-10,"The linestype is CENTER_LINE");
case 3:outtextxy(getmaxx()/2-105,top-10,"The linestype is DASHED_LINE");
}
rectangle(left,top,right,bottom);
setcolor(WHITE);
/*画笔的颜色恢复为以前的颜色*/
}
}
9.填充函数
1) setfillstyle( int pattern, int color);
功能:用pattern模式和color颜色填充指定区域。
pattern的模式
符号表示
对应数值
含义
0
用背景色填充
1
用指定的颜色填充
2
用线填充
3
用斜线填充
4
用粗斜线填充
5
用粗反斜线填充
6
用反斜线填充
7
用网格线填充
8
用斜交线填充
9
用间隔线填充
10
用稀疏点填充
11
用密集点填充
12
用用户定义模式填充
2) floodfill(int x, int y, int bcolor);
功能:用于填充一个有界区域,其填充的模式和颜色已由setfillstyle( )函数设定。
参数x,y指位于填充区域内的任意一点(x,y),参数bcolor是指被填充区域边
界的颜色。
3) fillellipse( int x, int y, int xradius, int yradius);
功能:用当前颜色画出一已填充椭圆。点(x,y)是椭圆中心的坐标,xradius是x轴方向的半轴长,y是轴方向的半轴长
4) sector( int x, int y, int stangle, int endingle, int xradius, int yradius);
功能:画出一已填充的椭圆扇形。点(x,y)是椭圆的中心的坐标,stangle,endangle分
别是该椭圆扇区起始角和终止角,xradius是轴的半轴长,yradius是轴方向
的半轴长
5) fillpoly( int numpoints, int far *polypoints);
功能:用当前颜色画出一已填充的多边形。表示所画多边形的顶点数,参数是一个
整型数组名,其中存放了各个顶点的坐标序列。
例1_14 填充函数的用法举例。
#include<graphics.h>
#include<stdio.h>
main()
{
int x,y,bcolor,poly[8];
int stangle,endangle,xradius,yradius;
int gdriver=DETECT, gmode; /*自动探测图形显示器适配器的类型*/
initgraph(&gdriver,&gmode," "); /*初始化图形系统*/
x=150;
y=240;
stangle=0;
endangle=360;
xradius=100;
yradius=70;
poly[0]=400; /*定义一个多边形,它有四个顶点:(400,50),(450,120),(500,140),
poly[1]=50; (530,100)*/
poly[2]=450;
poly[3]=120;
poly[4]=500;
poly[5]=140;
poly[6]=530;
poly[7]=100;
circle(x,y,100); /*画个圆*/
setfillstyle(SOLID_FILL,GREEN);/*设置填充模式和颜色*/
floodfill(x,y,getmaxcolor()); /*用绿色填充上面画的圆*/
getch();
ellipse(x+250,y,stangle,endangle,xradius,yradius);/*画一个椭圆*/
sector(x+250,y,0,90,xradius,yradius);/*用绿色填充上面画的椭圆的0~90度扇区*/
fillpoly(4,poly); /*用绿色填充多边形*/
getch();
closegraph();
}
1.2 综合举例
1.2.1 制作多样的椭圆
利用椭圆函数ellipse( )来制作。
例1_15 制作多样的椭圆
#include "stdio.h"
#include "graphics.h"
main()
{
int x=360,y=160;
int num=20,i;
int top,bottom;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,""); /*初始化图形系统*/
top=y-30;
bottom=y-30;
for(i=0;i<num;i++) /*循环语句绘制20个椭圆,横坐标不变,
纵坐标逐渐变小 */
{
ellipse(250,250,0,360,top,bottom); /*用椭圆函数绘制椭圆*/
top-=5;
bottom+=5;
}
getch(); /*按任意键结束*/
}
1.2.2 制作[屏蔽]图形
利用rectangle函数制作多个不同大小的矩形,利用ellipse函数制作多个大小不同的椭圆中,形成一个具有[屏蔽]效果的图形。
例1_16
#include "stdio.h"
#include "graphics.h"
main()
{
int i,num=15,top=50;
int left=20,right=50;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
for(i=0;i<num;i++) /*for循环语句绘制15个矩形与30个椭圆*/
{
ellipse(250,250,0,360,right,left);
ellipse(250,250,0,360,20,top);
rectangle(20-2*i,20-2*i,10*(i+2),10*(i+2));
right+=5; /*下一个矩形或椭圆与上一个右边相差为5*/
left+=5; /*下一个矩形或椭圆与上一个左边相差为5*/
top+=10; /*下一个矩形或椭圆与上一个顶部相差为10*/
}
getch(); /*按任意键结束*/
}
1.2.3 多重彩色窗口
运用window( )函数可以在屏幕上定义一个矩形区域作为窗口。多次调用window( )函数后,在屏幕上出现多重windows的窗口。
window( )函数的调用格式:
void window(int left, int top, int right, int bottom);
其中,(left, top) 和 (right, bottom)是窗口左上角与右下角的坐标。
例1_17 多重彩色窗口
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char *c[]={"BLACK", "BLUE", "GREEN", "CYAN", "RED","MAGENTA", "BROWN", "LIGHTGRAY"};
textbackground(0); /*设置屏幕背景颜色*/
clrscr(); /*清除文本屏幕*/
for(i=1; i<8; i++) {
window(10+i*5, 5+i, 30+i*5, 15+i); /*定义文本窗口*/
textbackground(i); /*定义窗口背景色*/
clrscr(); /*清除窗口*/
} getch(); return 0;
}
1.2.4 各种填充格式
本例显示填充函数的应用。程序运行时,显示一个以白色为填充色的矩形,按任意键后,矩形内的填充格式就会发生变化。
例1_18
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
main(void)
{
int gdriver = DETECT, gmode; /* 自动检测 */
int midx, midy, i;
initgraph(&gdriver, &gmode, ""); /* 初始化图形系统 */
getch(); /*暂停,按任意键继续*/
midx = getmaxx()/2; /*获得最大值的一半赋给变量*/
midy = getmaxy()/2;
for (i=SOLID_FILL; i<USER_FILL; i++)
{
setfillstyle(i, getmaxcolor());/* 设置填充模式 */
bar(midx-50, midy-50, midx+50, midy+50);
getch(); }
closegraph();
}
1.2.5 有填充色的图形
程序运行后,在屏幕上显示一个红色边框的圆与一个与之相交的有黄黑小方格填充的长方形。
例1_19
# include "graphics.h"
main()
{ int gdriver=VGA ,gmode=VGAHI;
unsigned char c[8]={0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0};
initgraph (&gdriver,&gmode ,“”);
setcolor(RED);
circle(320,240,150);
setcolor(GREEN);
rectangle(120,200,520,280);
setfillpattern(c,YELLOW);
floodfill(320,240,GREEN);
getch();
closegraph();
}
1.2.6 六叶图案
利用画弧函数arc( )绘制不同的弧线,组成一个六叶的图案。
例1_20
# include "graphics.h"
# include "math.h
# define PI 3.1415926535
main()
{
int gdriver=VGA; /*规定显示器为VGA*/
int gmode = VGAHI; /*选用VGA中4号调色板模式*/
double a=0,b;
int x0=340,y0=240,radius=100,i,x,y;
initgraph(&gdriver,&gmode,” “); /*初始化*/
setcolor(2); /*设置弧线的颜色为绿色*/
setlinestyle(0,0,0); /*设置弧线的类型与宽度*/
for(i=0;i<6;i++,a+=60) /*用for语句控制绘制六条弧线*/
{ b=a*PI/180; /*把度数转化为弧度*/
x=x0+radius*cos(b);
y=y0+radius*sin(b);
arc(x,y,120-i*60,240-i*60,radius); /*绘制弧线*/
}
getch(); /*暂停,按任意键继续*/
closegraph(); /*关闭图形系统返回文本模式*/
}
第2章 动画初步
动画是计算机图形学的一部分,广泛用于制作动画片、游戏和进行辅助教学等方面。
动画是指在屏幕上显示出来的画或其中的一部分,能够按照一定的规则或要求在屏幕上移动或变幻。因此,实现动画的关键在于图形和生成、复现和消隐。产生动画的方法有多种,下面主要介绍一种较简单的方法。
2.1 制作动画有关函数
三个重要的函数:
imagesize( int x1, int y1, int x2, int y2);
功能:测试左上角为(x1,y1)、右上角为(x2,y2)的图形屏幕区域内的全部内容所需的字节数,然后再给mapbuf分配一个具有相同字节内存空间的指针。
getimage(int x1, int y1, int x2, int y2, void far *mapbuf);
功能:将上面区域内的图像保存在内存中。
putimage( int x, int y, void *mapbuf, int op);
功能:将图像输出到左上角为点(x,y)的位置上。其中,参数op 规定释放内存中的图像的
方式。参数op的定义如下表:
putimage( )函数中的op值
符号常数
数值
含义
COPY_PUT
0
复制
XOR_PUT
1
与屏幕图像异或操作后复制
OR_PUT
2
与屏幕图像或操作后复制
AND_PUT
3
与屏幕图像与操作后复制
NOT_PUT
4
复制反相的图形
例2_01
说明:程序运行时,整个屏幕显示五彩缤纷的夜空,一个[屏蔽]的星球在不停地旋转,并发出
红色的光。
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <math.h>
main()
{void * ptr;
int gd=DETECT,gm; /*自动检测*/
float i;
initgraph(&gd,&gm,"d:\\tc"); /*初始化图形模式*/
setactivepage(1); /*图形输出选择激活页*/
setcolor(RED);
setfillstyle(1,14); /*设置填充模式函数*/
fillellipse(10,10,10,10);
ptr=malloc(imagesize(0,0,20,20));
getimage(0,0,20,20,ptr);
randomize(); /* 随机函数*/
setactivepage(0); /*选择激活另一活页*/
for(i=0;i<3000;i++)
putpixel(random(640),random(480),random(15)); /*点函数*/
for(i=0;i<6.28*4;i=i+0.005) /*用for语句来实现动画制作*/
{putimage(300+8*(cos(i)+i*sin(i)),240+6*(sin(i)-i*cos(i)),ptr,COPY_PUT);
putimage(300+8*(cos(i)+(i)*sin(i)),240+6*(sin(i)-(i)*cos(i)),ptr,COPY_PUT);
if(kbhit()) break;
delay(10);
}
getch(); /*按任意键结束*/
closegraph();
}
例2_02 小球碰撞。
说明:程序运行时,屏幕上显示3个小球,一个静止不支,而另两个小球在同一水平线上运行,互相分开。
# include <stdio.h>
# include<graphics.h>
int main()
{
int i, gdriver, gmode, size;
void *buf;
gdriver=DETECT; /*自动检测*/
initgraph(&gdriver, &gmode, ""); /*图形初始化*/
setbkcolor(BLUE); /*设置背景颜色*/
cleardevice();
setcolor(LIGHTRED); /*设置颜色*/
setlinestyle(0,0,1); /*设置线条样式*/
setfillstyle(1, 10); /*设置填充样式*/
circle(100, 200, 30);
floodfill(100, 200, 12);
size=imagesize(69, 169, 131, 231); /*设置图形区域*/
buf=malloc(size); /*分配size大小的内存块*/
getimage(69, 169, 131, 231,buf);
putimage(500, 269, buf, COPY_PUT);
for(i=0; i<185; i++){
putimage(70+i, 170, buf, COPY_PUT);
putimage(500-i, 170, buf, COPY_PUT);
}
for(i=0;i<185; i++){ /*for语句把内存块中的内容输出到屏幕上从而
putimage(255-i, 170, buf, COPY_PUT); 制作动画*/
putimage(315+i, 170, buf, COPY_PUT);
}
getch();
closegraph(); /*关闭图形系统,返回字符模式*/
}
例2_03多彩曲线。
说明:程序运行时,许多彩色的曲线在屏幕上飞舞,渐渐[屏蔽]覆盖了飞舞区域。
#include "graphics.h"
#define LEFT 0
#define TOP 0
#define RIGHT 639
#define BOTTOM 479
#define LINES 400
#define MAXCOLOR 15
main()
{
int driver,mode,error;
int x1,y1;
int x2,y2;
int dx1,dy1,dx2,dy2,i=1;
int count=0;
int color=0;
driver=DETECT;
initgraph(&driver,&mode,""); /*初始化图形模式*/
x1=x2=y1=y2=10;
dx1=dy1=2;
dx2=dy2=3;
while(!kbhit()) /*按任意键结束循环*/
{ /*循环语句控制绘制的直线条数*/
line(x1,y1,x2,y2); /*绘制直线 */
x1+=dx1;y1+=dy1;
x2+=dx2;y2+dy2;
if(x1<=LEFT||x1>=RIGHT) /*当切线超过左右边界时,取值为边界值*/
dx1=-dx1;
if(y1<=TOP||y1>=BOTTOM) /*当曲线超过上下边界时,取值为边界值*/
dy1=-dy1;
if(x2<=LEFT||x2>=RIGHT)
dx2=-dx2;
if(y2<=TOP||y2>=BOTTOM)
dy2=-dy2;
if(++count>LINES)
{
setcolor(color); /*设置线条的颜色*/
color=(color>=MAXCOLOR)?0:++color; /*利用条件语句来选择不同的颜色*/
} }
closegraph(); } /*关闭图形模式返回文本模式*/
例2_04多变的圆环
说明:程序显示多个静态的同心圆,和通过圆心的一组线段,按任意键,图形出现不同的变化。
# define PAI 3.1415926 /*宏定义两个常量*/
# define B 0.809
# include "graphics.h" /*预定义两个库函数*/
#include "math.h"
main()
{
int i,j,k,x0,y0,x,y,driver,mode;
float a;
driver=CGA;mode=CGAC0; /*指定图形显示设置*/
initgraph(&driver,&mode,""); /*初始化图形系统*/
setcolor(3);
setbkcolor(GREEN); /*设置背景色*/
x0=150;y0=100;
circle(x0,y0,10); /*画三个同心圆*/
circle(x0,y0,20);
circle(x0,y0,50);
for(i=0;i<16;i++) /*用for语句来绘制直线*/
{
a=(2*PAI/16)*i;
x=ceil(x0+48*cos(a));
y=ceil(y0+48*sin(a)*B);
setcolor(2); line(x0,y0,x,y);}
setcolor(3);circle(x0,y0,60);
settextstyle(DEFAULT_FONT,HORIZ_DIR,0); /*改变字体、字体大小与方向*/
outtextxy(10,170,"press a key"); /*输出字符串函数*/
getch();
setfillstyle(HATCH_FILL,YELLOW); /*设置填充模式函数*/
floodfill(202,100,WHITE);
getch();
for(k=0;k<=500;k++) /*利用for语句来控制直线的条数*/
{
setcolor(3);
for(i=0;i<=16;i++)
{
a=(2*PAI/16)*i+(2*PAI/180)*k;
x=ceil(x0+48*cos(a));
y=ceil(y0+48+sin(a)*B);
setcolor(2); line(x0,y0,x,y);
}
for(j=1;j<=50;j++)
{
a=(2*PAI/16)*i+(2*PAI/180)*k-1;
x=ceil(x0+48*cos(a));
y=ceil(y0+48*sin(a)*B);
line(x0,y0,x,y);
}
}
restorecrtmode();
}
例 2_05 行驶的小车
说明:程序运行时,一辆小车从左向右行驶。本例中主要使用了如下的2个函数:
putimage( ): 作用是把指向buffer的内存块中的内容传输到左上角点(x,y)的位置上。
bar( ) :用于绘制矩形及填色。
# include "graphics.h"
# include "conio.h"
# include "stdlib.h"
# define PATH "d:\\tc"
main()
{ int i,j,imsize;
int x=60,y=68,k=2;
char *buffer1,*buffer2;
int gdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,PATH); /*初始化图形模式*/
setfillstyle(1,GREEN);
bar(70,70,120,100); /*画矩形*/
bar(120,84,150,100);
setcolor(EGA_BROWN);
setfillstyle(1,EGA_BROWN); /*设置填充模式*/
circle(84,103,8);
floodfill(84,103,EGA_BROWN);
circle(134,103,8);
floodfill(134,103,EGA_BROWN);
bar(20,122,556,142);
bar(556,60,600,142);
imsize=imagesize(x,y,152,112); /*在内存中开辟字节数*/
buffer1=(char*)malloc(imsize);
buffer2=(char*)malloc(imsize);
getimage(x,y,152,112,buffer1);
while(!kbhit()) /*按任意键结束循环*/
{ for(i=0;i<=400;i+=k) /*汽车向前行驶*/
putimage(x+i,y,buffer1,COPY_PUT);
j=i-k+x;
for(i=0;i<152-x;i+=k)
{ imsize=imagesize(j+i,y,152-x+j,112);
buffer2=(char*)realloc(buffer2,imsize);
getimage(j+i,y,152-x+j-k,112,buffer2);
putimage(j+i+k,y,buffer2,COPY_PUT);
}
}
getch();
free(buffer1); /*释放内存空间*/
free(buffer2);
closegraph();
}
例2_06 重复出现的图像
说明:程序运行时,会统计图像重复出现的次数,并在屏幕上显示重复的次数。
# include "graphics.h"
# include "conio.h"
main()
{ int gdriver=VGA,gmode;
int i=0,k=0, x=160, y=120;
char ch[50];
gdriver=DETECT;
initgraph(&gdriver,&gmode," "); /*图形初始化*/
while(!kbhit())
{setviewport(0,0,319,239,1);
setcolor(i%15+1);
circle(x,y,i);
setcolor(0);
circle(x,y,i-1);
setviewport(320,240,639,479,1); /*建立显示窗口*/
setcolor(15-i%15);
rectangle(x-i,y-i,x+i,y+i);
setcolor(0);
rectangle(x-i+1,y-i+1,x+i-1,y+i-1); /*删除上一次画的矩形*/
i++;
if(i>200)
{i=0;
setcolor(EGA_MAGENTA);
setviewport(0,240,320,479,1); /*建立显示窗口*/
clearviewport();
sprintf(ch,"number is %d",++k);
outtextxy(30,30,ch); /*显示动态变化次数*/
}
}
getch();
closegraph();
}
例2_07 时钟
说明:运行程序时,显示一个正在运行的时钟,并们在伴有“滴嗒”响声。
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define pi 3.1415926
#define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300;
#define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240;
#define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y)
void init() /*自定义函数*/
{int i,l,x1,x2,y1,y2;
setbkcolor(1);
circle(300,240,200); /*画三个同心圆*/
circle(300,240,205);
circle(300,240,5);
for(i=0;i<60;i++)
{
if(i%5==0) l=15;
else l=5;
x1=200*cos(i*6*pi/180)+300;
y1=200*sin(i*6*pi/180)+240;
x2=(200-l)*cos(i*6*pi/180)+300;
y2=(200-l)*sin(i*6*pi/180)+240;
line(x1,y1,x2,y2);
}
}
main()
{
int x,y;
int gd=VGA,gm=2; /*设置图形显示模式*/
unsigned char h,m,s;
struct time t[1];
initgraph(&gd,&gm,"d:\\tc");
init();
setwritemode(1);
gettime(t);
h=t[0].ti_hour; /*把三个成员变量赋给变量*/
m=t[0].ti_min;
s=t[0].ti_sec;
setcolor(7);
d(150,h,30); /*画三条直线并设置不同的颜色*/
setcolor(14);
d(170,m,6);
setcolor(4);
d(190,s,6);
while(!kbhit()) /*按任意键结束循环*/
{while(t[0].ti_sec==s)
gettime(t);
sound(400);
delay(70);
sound(200);
delay(30);
nosound();
setcolor(4);
d(190,s,6);
s=t[0].ti_sec;
d(190,s,6);
if (t[0].ti_min!=m) /*当时间函数的min成员不是m时运行下面语句体*/
{
setcolor(14);
d(170,m,6);
m=t[0].ti_min;
d(170,m,6);
}
if (t[0].ti_hour!=h) /*当时间函数hour成员不是h时运行下面语句体*/
{ setcolor(7);
d(150,h,30);
h=t[0].ti_hour;
d(150,h,30);
sound(1000);
delay(240);
nosound();
delay(140);
sound(2000);
delay(240);
nosound();
}
}
getch();
closegraph();
}
2_08 火箭升空
说明:程序运行时,屏幕显示:press any key for set off.。若安按住任意键不放,火箭即发射。
发射完成后,屏幕显示:successfully!!! press ESC to quit
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<alloc.h>
#define ESC 0x1b /*ESC的ASCII码,十六进制数*/
void InstallGraph(void); /*图形初始化函数的声明*/
void DrawGun(void); /*画发射架函数的声明*/
void DrawPlan(void); /*画火箭函数的声明*/
void DrawStar(void); /*画星函数的声明*/
void *buf; /*全局变量,用于存储火箭的图像*/
int x0=300; /*以下是火箭的位置初始化参数*/
int y0=340;
int width1=5;
int width2=20;
int height=25;
int y1=8;
int y2=15;
int y3=23;
int y4=38;
main()
{
int size;
int i=0;
int key;
int station;
InstallGraph();
setbkcolor(BLACK); /*设置背景颜色*/
cleardevice();
setcolor(BLUE); /*设置字的颜色*/
outtextxy(80,100,"Ready!...Any key to SET OFF !!!");
DrawGun();
getch();
cleardevice();
DrawGun();
DrawPlan();
DrawStar();
setcolor(LIGHTRED);
do{putimage(x0-width2,y0-height-3*width1-i,buf,XOR_PUT);/*主循环开始,用于移动
i+=2; 火箭,方法是用异或方式
putimage(x0-width2,y0-height-3*width1-i,buf,XOR_PUT);在屏幕上连续画出火箭的
key=getch(); 图像,每画一次,新图像
if(y0-height-3*width1-i==0) 和原来的位置相差两个像
outtextxy(60,100,"Successfully!!! Press ESC to quit");素点。这个值越大,飞行
if(key==ESC) 速度越快*/
{
if(y0-height-3*width1-i>0){
cleardevice();
outtextxy(100,100,"Failue. What did you do?");
outtextxy(130,300,"Press any key to quit.");
getch();
}
}
}
while(key!=ESC);
free(buf);
closegraph();
return 0; }
void InstallGraph(void) /*图形初始化函数*/
{
int grdriver=DETECT;
int grmode;
int errorcode;
char *errormsg;
initgraph(&grdriver,&grmode,"");
errorcode=graphresult();
errormsg=grapherrormsg(errorcode);
if(errorcode!=grOk){
printf("Graphics error: %s\n",errormsg);
printf("Press any key to exit.\n");
getch();
exit(1);
}
}
void DrawStar(void) /*画星函数*/
{
int seed=2000;
int i,dotx,doty,height,width,color,maxcolor;
maxcolor=getmaxcolor();
width=getmaxx();
height=getmaxy();
srand(seed);
for(i=0;i<250;i++){
dotx=i+random(width-1);
doty=i+random(height-1);
color=random(maxcolor);
setcolor(color);
putpixel(dotx,doty,color);
circle(dotx+1,doty+1,1);
}
srand(seed);
}
void DrawGun(void) /*画发射架函数*/
{
int x0=300;
int y0=430;
int height=45;
int rx=20;
int ry=5;
int rightx,righty,leftx,lefty;
int centery1=30;
rightx=righty=leftx=lefty=12;
setcolor(LIGHTGREEN);
ellipse(x0,y0,180,360,rx,ry);
ellipse(x0,y0-height,0,360,rx,ry);
line(x0+rx,y0,x0+rx,y0-height);
line(x0-rx,y0,x0-rx,y0-height);
moveto(x0+rx,y0);
lineto(x0+rx+rightx,y0+righty);
moveto(x0+rx+rightx,y0+righty);
lineto(x0+rx+rightx+10,y0+righty+10);
circle(x0+rx+rightx+10,y0+righty+10,4);
moveto(x0,y0+ry);
lineto(x0,y0+centery1);
moveto(x0,y0+centery1);
lineto(x0,y0+centery1+10);
circle(x0,y0+centery1+10,4);
moveto(x0-rx,y0);
lineto(x0-rx-leftx,y0+lefty);
moveto(x0-rx-leftx,y0+lefty);
lineto(x0-rx-leftx-10,y0+lefty+10);
circle(x0-rx-leftx-10,y0+lefty+10,4);
line(x0-rx-leftx,y0+lefty,x0,y0+centery1);
line(x0,y0+centery1,x0+rx+rightx,y0+righty);
}
void DrawPlan(void) /*发射火箭函数*/
{
int size;
setcolor(LIGHTRED);
setfillstyle(1,BLUE);
ellipse(x0,y0-height,0,180,width1,3*width1);
moveto(x0+width1,y0);
lineto(x0+width1,y0-height);
moveto(x0+width1,y0);
lineto(x0+width2,y0+y2);
moveto(x0-width1,y0);
lineto(x0-width1,y0-height);
moveto(x0-width1,y0);
lineto(x0-width2,y0+y2);
moveto(x0+width2,y0+y3);
lineto(x0+width2,y0+y1);
moveto(x0+width2,y0+y3);
lineto(x0+width1,y0+y2);
moveto(x0-width2,y0+y3);
lineto(x0-width2,y0+y1);
moveto(x0-width2,y0+y3);
lineto(x0-width1,y0+y2);
moveto(x0,y0+y4);
lineto(x0+width1,y0+y2);
moveto(x0,y0+y4);
lineto(x0-width1,y0+y2);
setfillstyle(2,LIGHTRED);
floodfill(x0,y0,LIGHTRED);
size=imagesize(x0-width2-1,y0-height-3*width1,x0+width2+1,y0+y4);
buf=malloc(size);
if(!buf){printf("No enough memory!");
exit(0);}
getimage(x0-width2,y0-height-3*width1,x0+width2,y0+y4,buf);
}
第3章 音乐程序
3.1 音乐编程基础
3.1.1 C语言中的发声函数
有两个发声的函数:
sound(unsigned frequency);
功能:以指定的频率打开计算机内置扬声器。frequency表示频率。
nosound( );
功能:关闭扬声器。
delay(unsigned m);
功能:使程序暂停执行m毫秒。
例2_01
/*可生成噪声的主程序 */
#define FALSE 0
#define TRUE 1
#include <dos.h>
main()
{
int snd; /*which sound to produce*/
int cnt; /*number of times to repeat sound*/
int note; /*Current note,when sweeping frequencies */
while(TRUE)
{ nosound(); /* Make sure any previous sounds are turned off. */
printf("1--siren; 2--overload; 3--whoop; 4-phaser; 0--exit");
scanf("%d",&snd); /*read the answer*/
if(snd==0)
break;
printf("Numbers of times:");
scanf("%d",&cnt);
while(cnt--)
switch(snd) /*switch on type of sound to produce*/
{ case 1: /* do a siren:sweep up */
for(note=1000; note>150; note-=10)
{
sound(note);
delay(20);
}
case 2: /* do a overload:sweep up */
for(note=4000;note>10;note-=10)
{
sound(note);
delay(70);
}
break;
case 3: /* do a whoop:sweep up */
for(note=1000;note>10;note-=10)
{
sound(note);
delay(200);
}
break;
case 4:
for(note=60;note<2000;note+=10)
{
sound(note);
delay(100);
}
break;
default:
printf("Invalid entry; try again\n");
break;
}
}
}
运行时显示如下菜单:
1—siren; 2—overload; 3—whoop; 4—phaser; 0—exit
1—4表示不同的声音,0 表示退出
3.1.2 音乐编程基础
音乐是音高和音长的有序组合。音调的高低由音符的频率决定,频率越高,音调也越高。音乐中使用的频率通常为131~1976HZ,包括了4个8度的音程。
音符与频率对照表
音符
频率(HZ)
音符
频率(HZ)
音符
频率(HZ)
音符
频率(HZ)
C
131
C
262
C
523
C
1047
D
147
D
294
D
587
D
1175
E
165
E
330
E
659
E
1319
F
175
F
349
F
698
F
1397
G
196
G
392
G
784
G
1568
A
220
A
440
A
880
A
1760
B
247
B
494
B
988
B
1976
例_02 弹奏1,2,3,4,5,6,7的小程序
#include "stdio.h"
#include "dos.h"
main()
{ int i,j;
unsigned frequency;
unsigned mi=150000000;
for(i=0;i<5;i++)
{
for(j=1;j<8;j++)
{ switch(j)
{
case 1:frequency=262;
sound(frequency);
delay(mi);
break;
case 2:frequency=294;
sound(frequency);
delay(mi);
break;
case 3:frequency=330;
sound(frequency);
delay(mi);
break;
case 4:frequency=349;
sound(frequency);
delay(mi);
break;
case 5:frequency=392;
sound(frequency);
delay(mi);
break;
case 6:frequency=440;
sound(frequency);
delay(mi);
break;
case 7:frequency=494;
sound(frequency);
delay(mi);
break;
}
nosound();
}
if(j!=7) printf("\nPlease press any key to star the next musical performance(total 5)\n");
getch();
}
nosound();
}
第4章 C语言编程技巧
4.1 程序和软件
许多人认为程序就是软件,实际上两者是有区别的。
在20世纪60年代初期,计算机硬件和软件正处于初级发展阶段,那时候,人们心目中的软件开发就是程序的编写。当时,强调的是个人的编程技巧,程序开发的随意性很大,编写的源代码一般很难让别人读懂,甚至过一段时间后,连自己也无法看懂。
随着操作系统等复杂的软件系统的出现和应用软件规模的增大,依靠程序员手工式的编写程序已无法完成。这引起人们对软件和程序的关系的思考。
为了开发复杂的操作系统和规模庞大的应用软件,必须把它们分解成若干个相互关连的模块,由多个人分工合作完成,这是软件发展的一个新的阶段,即出现“工程”的意味。
人们认为,软件实质是一个工程,称之为“软件工程”。现在国际上普遍采用的定义是:
软件是计算机程序、方法、规则、相关的文档以及计算机运行时所必需的数据。
从软件的发展历程,总结得到一些有益的编程经验。虽然,软件工程内容庞大,但编程仍是很基础很重要的一部分。如何编写出结构清晰,让人能看懂并有利于完善和修改的程序,是人们追求的目标。
本章中的其余章节是介绍编程技巧,希望大家逐步掌握这些技巧,体会其中的编程思想,不断提高编程能力。
此外,本章所编选的内容大多与C语言等级考试上机试题有关,希望对读者通过等级考试有一定的帮且。
4.2 排序算法
4.2.1 冒泡排序法
7.3 用起泡法对10个数排序(由小到大)
分析: 先把这10个数保存在一个数组中.
起泡法的思路: 将相邻两个数比较交换.
a[1] 9 8 8 8 8 8
a[2] 8 9 5 5 5 5
a[3] 5 5 9 4 4 4
a[4] 4 4 4 9 2 2
a[5] 2 2 2 2 9 0
a[6] 0 0 0 0 0 9
6个数经过5次比较交换,最大数落在最后位置(第一轮)
5个数经过4次比较交换,最大数落在最后位置(第二轮)
4个数经过3次比较交换,最大数落在最后位置(第三轮)
3个数经过2次比较交换,最大数落在最后位置(第四轮)
2个数经过1次比较交换,最大数落在最后位置(第五轮)
对于有n个元素,要进行n-1轮冒泡
第1轮要进行n-1次比较交换
第2轮要进行n-2次比较交换
…………………………………
第j轮要进行n-j次比较交换
…………………………………
第n-1轮要进行n-(n-1)次比较交换
上述过程可通过两重循环实现:
外循环实现“轮”:j从1 to n-1
内循环实现“次”:i 从j to n-j
源程序为:
main()
{ int a[11];
int i,j,t;
printf("Input 10 number:\n");
for(i=1;i<11;i++) /*第1个元素取为a[1],第10个元素为a[10] */
scanf("%d",&a
);
printf("\n");
for(j=1;j<=9;j++) /*共有10个元素,要进行9轮冒泡*/
for(i=1;i<=10-j;i++) /*对于第j轮,要进行10-j次比较交换*/
if(a>a[i+1])
{t=a;a=a[i+1];a[i+1]=t;}
printf("The sorted numbers:\n");
for(i=1;i<11;i++)
printf("%d ",a);
}
4.2.2 选择排序法
基本思想:在每轮中,先确定最小元素的位置,再与首位元素交换。每一轮后,最小数位于
首位。
若有n个元素,则要进行n-1轮选择。在第i轮中,首先令min=i,从i+1开始逐个元素进行比较,找出最小元素所位置min. 再令a与a[min]交换。
#define N 6
main()
{ int i,j,t,k,a[N];
printf("The originale array:\n");
for(i=0;i<N;i++) /*第1个元素为a[0]*/
scanf("%d",&a);
for(i=0;i<N;i++)
printf("%d ",a);
printf("\n");
for(i=0;i<N-1;i++)
{ k=i;
for(j=i+1;j<N;j++)
if(a[k]>a[j]) k=j;
if(i!=k)
{t=a;
a=a[k];
a[k]=t; }
}
printf("Now,the array:\n");
for(i=0;i<N;i++)
printf("%d ",a);
printf("\n");
}
4.3 穷举法
穷举法是一种简单、常见的程序设计方法。此法的关键是要确定正确的穷举的范围。
4.3.1 百钱买百鸡
这是<算经>中一道著名的问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;
百钱买百鸡,翁、母、雏各几何?
分析:
设买公鸡x只,买母鸡y只,买小鸡z只,依题意,有:
x+y+z=100
5x+3x+z/3=100
这是一道三元一次方程组问题。有三个未知数,只有二个方程,有无穷多个解。但从题设知道:x、y、z的取值范围是从0到100的正整数。可以让x、y、z分别从0变到100,然后判断x、y、z的每一种组合是否满足方程的要求。有如下的源程序:
main()
{ int x,y,z,j=0;
for(x=0;x<=100;x++)
for(y=0;y<=100;y++)
for(z=0;z<=100;z++)
if(x+y+z==100&&5*x+3*y+z/3.0==100)
printf("%2d:cock=%2d hen=%2d chicken=%2d\n",++j,x,y,z);
}
程序中采用三重循环,实际上是穷举了x、y、z全部可能的组合。这是最直接的穷举法。但可以进一步优化。实际上100钱不可能买100只公鸡,最多可买20只,即有x<=20; 同理有y<=33, 这样可以缩小穷举的范围。程序如下
main()
{ int x,y,z,j=0;
for(x=0;x<=100;x++)
for(y=0;y<=100;y++)
for(z=0;z<=100;z++)
if(x+y+z==100&&5*x+3*y+z/3.0==100)
printf("%2d:cock=%2d hen=%2d chicken=%2d\n",++j,x,y,z);
}
这个问题还可以进一步优化。
4.3.2 爱因斯坦问题
爱因斯坦出了一道数学问题:有一条长阶梯,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩5阶,若每步跨6阶,则最后剩5阶。只有每次跨7阶,最后才一阶不剩。问这阶梯共有多少阶?
分析:
设共有x阶,则有
x%2=1
x%3=2
x%5=4
x%6=5
x%7=0
满足上述条件的表达式为:
(x%2= =1)&&(x%3= =2)&&(x%5= =4)&&(x%6= =5)&&(x%7= =0)
可让梯级数x从1开始尝试,若不满足条件则x自加1,直至满足条件为止。源程序:
main()
{ int x=1;
while(!((x%2==1)&&(x%3==2)&&(x%5==4)&&(x%6==5)&&(x%7==0)))
x++;
printf("Staris_number=%d\n",x);
}
4.3.3 马克思手稿中的数学题
马克思手稿中有一道趣味的数学题:有30个人,其中有男人、女人和小孩。他们在一家饭馆吃饭共花了50先令:每个男人花3先令,每个女人花2先令,每个小孩花1先令;问男人、女人和小孩各有几人?
分析:这是有3个未知数,两个方程的代数问题。
设男人、女人和小孩各有x、y、z人,依题意,有
x+y+z=30 ①
3x+2y+z=50 ②
由②-① 有
2x++y=20 ③
由已知条件,x的变化范围是 0~16
求解此不定方程的非负整数解的程序为:
main()
{ int x,y,z,count=0;
printf(" men women childen\n");
printf("-----------------------------------\n");
for(x=0;x<16;x++)
{ y=20-2*x;
z=30-x-y;
if(3*x+2*y+z==50&&y>0&&z>0)
printf("%-8d %d %d %d\n",++count,x,y,z);
}
}
4.3.4 减法还原
编写程序求解下式中各字母所代表的数字,不同字母代表不同数字。
PEAP
- ARA
PEA
分析:可采用穷举法求解。采用循环穷举每个字母可能代表的数字,根据要满足的条件
求出合乎要求的各字母所代表的数。
main()
{ int p,e,a,r;
clrscr();
for(p=1;p<=9;p++)
for(e=0;e<=9;e++)
if(p!=e)
for(a=1;a<=9;a++)
if(a!=p&&a!=e)
for(r=0;r<=9;r++)
if(r!=0&&r!=e&&r!=a)
if(p*1000+e*100+a*10+r-(a*100+r*10+a)==
p*100+e*10+a)
{ printf(" pear %d%d%d%d\n",p,e,a,r);
printf(" -ara %d%d%d\n",a,r,a);
printf("-----------------\n");
printf(" pea %d%d%d\n",p,e,a);
}
}
4.3.5 三色球问题
若有一个口袋放有12个球,其中有3个红的,3个白的和6个黑的,从中任取8个球,
问共
有多少种不同的颜色搭配?
这也是一个可用穷举法求解的问题。
设任取的红球个数为i, 白球个数为 j,则黑球个数为8-i-j,用count统计不同的搭配数目。程序如下:
main()
{ int i,j,count=0;
printf(" RED WHILE BLACK\n");
printf("-----------------------\n");
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
if((8-i-j)<=6)
printf("%2d:%4d%5d%7d\n",++count,i,j,8-i-j);
}
4.4 打印图案
4.4.1 编写程序,输出如下图案
*
***
*****
*******
*****
***
*
分析:上半图案中,共有4行,每行中有空格和字符“*”。每行的空格数和字符数与行数有关。
设行数为i, 空格数为 j, 字符“*”数为k ,则有
j=4-i ;
k=2*i-1
类似地,对于下半图案,有
j=i ;
k=7-2i
故输出图案程序为:
main()
{ int i,j,k;
for(i=1;i<=4;i++)
{ for(j=1;j<=4-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
for(i=1;i<=3;i++)
{ for(j=1;j<=i;j++)
printf(" ");
for(k=1;k<=7-2*i;k++)
printf("*");
printf("\n");
}
}
4.4.2 编写程序,输出杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
分析:
使用双重循环语句for, 来控制循环. 步骤如下:
1. 利用循环语句打印出边部1:
for(i=1;i<N;i++)
{ a=1;
a[1]=1;
}
2. 下一项为它上对角两项之和:
for(i=3;i<N;i++)
for(j=2;j<=i-1;j++)
a[j]=a[i-1][j-1]+a[i-1][j];
3. 控制打印空格和过行
for(i=1;i<N;i++)
{for(j=1;j<=i;j++)
printf("%6d",a[j]);
printf("\n");
}
输出杨辉三角形的程序:
#define N 11
main()
{ int i,j,a[N][N];
clrscr();
for(i=1;i<N;i++)
{ a=1;
a[1]=1;
}
for(i=3;i<N;i++)
for(j=2;j<=i-1;j++)
a[j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i<N;i++)
{for(j=1;j<=i;j++)
printf("%6d",a[j]);
printf("\n");
}
}
4.4.3 输出等腰三角形形式的杨辉三角形
使用双重循环语句for, 来控制循环. 步骤如下:
1. 用循环语句打印出边部1:
for(i=1;i<N;i++)
{ a=1;
a[1]=1;
}
2. 一项为它上对角两项之和:
for(i=3;i<N;i++)
for(j=2;j<=i-1;j++)
a[j]=a[i-1][j-1]+a[i-1][j];
3. 控制打印空格和过行
for(i=1;i<N;i++)
{ for(j=N-i;j>0;j--)
printf("%3c",32);
for(j=1;j<=i;j++)
printf("%6d",a[j]);
printf("\n");
}
程序:
#define N 8
main()
{ int i,j,a[N][N];
clrscr();
for(i=1;i<N;i++)
{ a=1;
a[1]=1;
}
for(i=3;i<N;i++)
for(j=2;j<=i-1;j++)
a[j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i<N;i++)
{for(j=N-i;j>0;j--)
printf("%3c",32);
for(j=1;j<=i;j++)
printf("%6d",a[j]);
printf("\n");
}
}
4.5 常用数值问题
各种常用的数值问题一般都有其本身特定的算法。下面介绍最常见的具有代表性的算法。
4.5.1 迭代法求平方根
迭代法是一种逐次逼近方法。使用迭代法的关键是要确定迭代公式、迭代的初值和精度要求。精度要求是停止迭代计算的条件。
迭代公式为:
例:用迭代法求 , 要求前后两次求的x的差的绝对值小于 10-5
分析:用迭代法求平方根的算法如下:
(1) 设定一个x的初值x0;
(2) 用上述公式求出x的下一个值x1;
(3) 再将x1代入上述公式,求出x的下一个值x2;
(4) 一直继续下去,直到前后两次求出的x值 xn+1和 xn满足条件:
|xn+1-xn|<10-5
取初值 x0=a/2;
程序如下:
#include<math.h>
main()
{ float a,x0,x1;
printf("Enter a positive number:");
scanf("%f",&a);
x0=a/2;
x1=(x0+a/x0)/2;
do
{ x0=x1;
x1=(x0+a/x0)/2;
}
while(fabs(x0-x1)>=1e-5);
printf("The square root of %5.2f is %8.5f\n",a,x1);
}
4.5.2 梯形法
用梯形法编程求函数 的定积分,
分析:
定积分 的几何意义是求曲线y=f(x)、x=1、 y=0(x 轴)和x=b所围成的面积。把 [a,b]区间等分为n等分,可得若干个小梯形,积分面积就近似为这些小梯形面积之和。
其中,第一个小梯形面积约为:
(f(x0)+f(x1))/2*((b-a)/n)
第i个小梯形面积为:
(f(xi-1)+f(xi))/2*((b-a)/n)
程序如下:
#include<stdio.h>
main()
{ int i;
double s=0,h,f0,f1,n,a,b;
printf("Enter n,a,b");
scanf("%lf,%lf,%lf",&n,&a,&b);
h=(b-a)/n;
f0=a*a+2*a+1;
for(i=0;i<=n;i++)
{ a=a+h;
s+=(f0+f1)*h/2;
f0=f1;
}
printf("Sum=%lf\n",s);
}
4.5.3 二分法
用二分法求一元方程 在(-10,10)区间的根。
分析:若函数有实根,则函数的曲线应当在根这点上与x轴有一个交点,在根附近的左右区
间内,函数的值的符号相反。利用这一原理,逐步缩小区间的范围,就可以逐步逼近
函数的根。
程序如下:
#include<stdio.h>
#include<math.h>
main()
{ float x0,x1,x2,fx0,fx1,fx2;
do
{ printf("Enter x1,x2:");
scanf("%f,%f",&x1,&x2);
fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;
fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;
}while(fx1*fx2>0);
do
{ x0=(x1+x2)/2;
fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;
if((fx0*fx1)<0)
{ x2=x0;
fx2=fx0;
}
else
{ x1=x0;
fx1=fx0;
}
}while(fabs((double)fx0)>1e-5);
printf("x=%6.2f\n",x0);
}
4.5.4 牛顿切线法
牛顿切线法采用以下方法求根:先任意设定一个与真实的根接近的值x0作为第一次近似根,由x0求出f(x0),过(x0 ,f(x0) 作曲线的切线,交x 轴于x1,把它作为第二次近似根
再由x1求出,过(x1,f(x1))点作曲线的切线,交x轴于x2;再作切线……如此不断继续下去,直到足够接近真正的根为止。
程序如下:
#include<math.h>
main()
{ float x,x0,f,f1;
printf("Enter x:");
scanf("%f",&x);
do
{ x0=x;
f=((2*x0-4)*x0+3)*x0-6;
f1=(6*x0-8)*x0+3;
x=x0-f/f1;
}while(fabs(x-x0)>=1e-5);
printf("The root of equation is %5.2f\n");
}
4.6 上机编程题题解
“计算机等级考试”二级C考试分笔试和上机考试两部分,两部分的分数都是100分,及格分为60分,只有在两部分的分数都合格,考试才算合格。
上机部分的考题共3道大题。第1大题是DOS系统操作题,含6小题,每小题5 分,共30分。每小题完成一个DOS系统操作命令。
第2道大题是程序改错题,提供一道包含几处错误的程序,要求将错误的地方改正过来,并进行调试,直到通过为止。
第3道大题是编制程序题,要求按题意编写一个程序。此题40分。
本节中,选取若干近年的上机编程试题,以提高编程能力,同时也可以了解二级C考试中,编程部分的要求。
4.6.1 写出判别一个整数是否素数的函数
给定程序中,编写函数fun的功能是从键盘输入一个较大的整数n (n>=6), 并验证从6到n之间的所有偶数,都可以分解为两个素数之和的形式。函数fun的功能验证m是否为素数,当其值为0时,说明m不是素数;当其值为1时,说明m是素数。
注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include<stdio.h>
#include<conio.h>
#include<math.h>
int fun(int m)
{ int i,k; /*要求完成此函数*/
/*考生在此输入正确的语句*/
}
main()
{ int n,a,b,k;
while(1)
{ printf("\nInput a number>=6:");
scanf("%d",&k);
if(k>=6) break;
}
for(n=6;n<=k;n=n+2)
for(a=3;a<=n/2;a=a+2)
if(fun(a))
{ b=n-a;
if(fun(b))
{ printf("%d,%d,%d\n",n,a,b);
break;
}
}
}
答案:
int fun(int m)
{ int i,k;
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
return (0);
return(1);
}
4.6.2 求和问题
给定程序中,编写函数fun( ),它的功能是:根据以下公式计算π.
例如程序运行后,输入0.0001, 则程序输出3.1414。
注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
试题程序:
#include <math.h>
float fun(float num)
{ int s;
float t,pi,n;
(由考生在此填入若干语句)
}
main()
{ float f1,f2;
clrscr();
printf("Enter a float number.");
scanf("%f",&f1);
f2=fun(f1);
printf("%f\n",f2);}
解答:
这是求一个规律多项式的和的问题,采用循环来实现。
要求编写的函数为:
#include <math.h>
float fun(float num)
{ int s;
float t,pi,n;
t=1;
pi=0;
n=1.0;
s=1;
while(fabs(t)>=num)
{ pi=pi+t;
n=n+2; 考生应编写的语句
s=-s;
t=s/n;
}
pi=pi*4;
return pi; }
4.6.3 求阶乘值的函数
在给定的程序中,请编写函数fun(int n), 其功能是:打印1到5的阶乘值。输出结果为:
1!=1
2!=2
3!=6
4!=24
5!=120
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
int fac(int n)
{ static int f=1;
(此处,由考生编写若干语句。)
}
main()
{ int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fac(i));
}
解答:
要实现输出1到5的阶乘值,可以用静态变量来实现,因为静态变量能保存上一次使用的结果。函数fun的流程为:
(1) 定义一个静态变量f用以存放函数的返回值;
(2) 求阶乘运算:f=f*n;
(3) 返回函数值f.
函数应为:
int fac(int n)
{ static int f=1;
f=f*n;
考生须编写的若干语句
return(f);
}
4.6.4 用递归方法求xn
请编写函数fun( ),其功能是:用递归方法求f(x)=xn,其中n为正整数。
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
double fun(float x,int n)
{
(此处由考生编写若干语句)
}
main()
{ int n;
float x;
double r;
clrscr();
scanf("%f,%d",&x,&n);
r=fun(x,n);
printf("%f",r);
}
解答:
递归方法就是在函数定义过程中,自己调用自己。函数fun的流程为:
(1) 因为n是整数,当n=0时,返回值是1;
(2) 当n>0时,返回值是 x*fun(x,n-1).
所求函数应为:
double fun(float x,int n)
{ if(n==0)
return 1; 考生编写的若干语句
else return (x*fun(x,n-1));
}
4.6.5 求低于平均成绩的人数
请编写函数 int fun(int score[ ], int m, int below[ ]),其功能是:计算score中 m个人的平均成绩aver,将低于 aver的成绩放在below中,通过函数名返回人数。
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
int fun(int score[],int m,int below[])
{ int i,j=0;
float aver,s=0.0;
(此处由考生编写若干语句)
}
main()
{ int a[10],b[10],i,k;
for(i=0;i<10;i++)
scanf("%d",&a);
k=fun(a,10,b);
for(i=0;i<k;i++)
printf("%d ",b);
printf("\n");
printf("%d\n",k);
}
解答:
首先求出平均成绩,然后再把每一低于平均成绩的分数写入到数组below中,并把记录低于平均成绩人数返回。
所求的函数:
int fun(int score[],int m,int below[])
{ int i,j=0;
float aver,s=0.0;
for(i=0;i<m;i++)
s=s+score;
aver=s/m;
for(i=0;i<m;i++) 考生作答的语句
if(score<aver)
below[j++]=score;
return j;
}
4.6.6 求两个数的最大公约数
请编写一个函数fun,其功能是求两个数的最大公约数。
例如:给变量x1、x2分别输入8,12,则输出结果应当是4。
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
fun(int n,int m)
{ int r;
(此处由考生编写若干语句)
}
main()
{ int a,b,k;
printf("Input a,b:\n");
scanf("%d,%d",&a,&b);
k=fun(a,b);
printf("The minimal common multiple is:%d\n",k);
}
解答:
采用辗转相除法。求n与m的最大公约数(n>m)
即求 n%m与m的最大公约数。程序流程:
(1) 求 r=n%,’
(2) n=m;
(3) m=r;
(4) 直到余数m=r=0为止,则此时n为所求。
所求的函数为:
fun(int n,int m)
{ int r;
while(m!=0)
{
r=n%m;
n=m;
m=r;
}
return n;
}
4.6.7 将字符串倒序输出
请编写程序fun(),其功能是:将s所指字符串中内容倒序
例如:输入字符串 “abcdefg”,则输出为:“gfdcba”
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
fun(char s[])
{ int i,j;
char t;
(此处由考生编写若干语句)
}
main()
{ char str[50];
scanf("%s",str);
fun(str);
printf("%s",str);
}
解答:
实现把一字符串中内容倒序,即把s[0] 与s[n-1],s[1] 与s[n-2]交换,……。
函数fun的程序流程为:
(1) 计算字符串s 的实际长度j=strlen(s);
(2) 用for循环实现字符的交换:for(i=0; i<(j-1)/2;i++);
所求函数fun( )为:
fun(char s[])
{ int i,j;
char t;
j=strlen(s);
for(i=0;i<(j-1)/2;i++)
{ t=s;
s=s[j-1-i];
s[j-1-i]=t;
}
}
4.6.8 统计字符串中大、小写字母的个数
请编写函数fun( ), 其功能是:分别统计字符串中大写字母和小写字母的个数。
例如:设有字符串 AAaaBBb123CCcdef,则应输出结果为:upper=6, lower=7.
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
void fun(char *s,int *a,int *b)
{ while(*s!='\0')
{
(此处由考生编写若干语句)
}
}
main()
{ char s[80];
int upper=0,lower=0;
clrscr();
printf("\nPlease input a string:");
gets(s);
fun(s,&upper,&lower);
printf("\nupper=%d, lower=%d\n",upper,lower);
}
解答:
判断大写字母的范围是:*s>=’A’&& *s<=’Z’, 判断小写字母的范围是:
*s>=’a’&&* s<=’a’. 函数fun的流程是:
(1) 利用指向字符串的指针变量的自加运算来实现:
(2) 判断字符串的每一个字符是否大写字符;若是指针变量加一,即
if( * s>=’A’&&* s<=’Z’)
*a++;
(3) 判断字符串的每一个字符是否小写字符;若是指针变量加一,即
if ( *s>=’a’&& *s<=’z’)
*b++;
(4) 最后通过指针变量返回计算的值。
所求函数fun( )为:
void fun(char *s,int *a,int *b)
{ while(*s!='\0')
{ if(*s>='A'&&*s<='Z')
(*a)++;
if(*s>='a'&&*s<='z')
(*b)++;
s++;
}
}
4.6.9 删除字符串中的字符‘a’
请编写函数fun( ),其功能是删除字符串中的字符‘a’
例如:输入字符串为:ddcabfdgag, 输出为:ddcbfdgg.
输入字符串时用‘*’结束输入。
例如:设有字符串 AAaaBBb123CCcdef,则应输出结果为:upper=6, lower=7.
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
#include<stdio.h>
fun( char *p)
{ int i,t;
char c[80];
(此处由考生编写若干语句)
}
main()
{ char c,s[80];
int i=0;
printf("Input a string:");
c=getchar();
while(c!='*')
{ s=c;
i++;
c=getchar();
}
s='\0';
fun(s);
puts(s);
}
解答:
要删除字符串中指定的字符,首先判断字符串中是否存在指定的字符。若存在,后面的字符覆盖它,若没有,则什么也不做。函数fun程序流程为:
(1) 利用for循环判断指向字符串的指针变量中是否存在字符‘a’;
(2) 若不存在,则把字符拷贝到另一个字符数组中, 即把指针变量所有不是‘a’字符都拷贝到字符数组中;
(3) 给字符数组中赋字符串结束标志;
(4) 再把字符数组中的内容拷贝到指针变量中,完成了删除字符‘a’的操作。
所求的函数为:
#include<stdio.h>
fun( char *p)
{ int i,t;
char c[80];
for(i=0,t=0;p!='\0';i++)
if(*(p+i)!='a')
c[t++]=p;
c[t]='\0';
strcpy(p,c);
}
注意:请勿改动主函数main和其他函数的任何内容,仅在函数fun的花括号中填入你编写
的若干语句。
试题程序:
4.6.10 函数调用
编写函数double fun(l),它的功能是:求 l!的值,再由此函数求以下p的值。
结果由函数值带回。m与n为两个正整数且要求m>n。
试题程序:
double fun(int l)
{ int i;
(此处由考生编写若干语句)
}
main()
{ float p=0.0;
int i=1;
int m,n;
printf("Enter the m,n\n");
scanf("%d,%d",&m,&n);
p=fun(m)/(fun(n)*fun(m-n));
printf("%.0f",p);
}
解答:
求阶乘可用for(i=1;i<=l;i++)
x=x*i;
三次调用函数,即可求出p的值。
所要求的函数为:
double fun(int l)
{ int i;
double x=1;
for(i=1;i<=l;i++)
x=x*i;
return x;
}
转帖自http://www.bvtc.edu.cn/hedu/jsjx/yyxx.htm
网友: 对电脑程序发电(creepxu@126.com) 发表于: 2004-11-6 19:20:30
我想知道这里发表的论坛,是不是有人可以回复?我对电脑各个方面都由衷的喜好,由于并非学习此专业,误了三年。是不是有人可以带我入gate呢?由衷感谢!有意者请+我QQ429767666,备注请注明相关信息。如:教我学程序。
网友: 小帅 发表于: 2004-11-2 15:46:10
c语言太菜了!!!!!!!!
网友: suifengershi 发表于: 2004-11-2 11:18:22
学习C语言是不是悟性很重要?
网友: suifengershi 发表于: 2004-11-2 11:18:11
学习C语言是不是悟性很重要?
网友: 我怕伤心(luhuafa520@126.com) 发表于: 2004-11-1 3:09:52
大家好,
我是个计算机爱好者,现在对编程产生了兴趣,我希望得到你们的帮助,因为我现在什么也不会,
帮我,我QQ:175179633
欢迎我们能成为朋友
网友: ke(kejinxing555@163.com) 发表于: 2004-10-30 22:53:13
想学,不知道从哪下手
网友: 独孤寻欢(tanfeilong2004@hotmail.com) 发表于: 2004-10-26 16:03:23
好长呀。可惜没通信电缆在网吧看好费钱哟?
网友: candy(qinyingying123@sina.com) 发表于: 2004-10-22 18:55:26
大家好,看到这个网址觉得它很棒,我也是C的初学者也很希望能和大家在这里探讨呀!我想成为C语言的高手.希望大家能帮助我和鼓励我一下.我怕C太恐怖了.-_-!!!!哎..希望大家能经常到这个网址来走动走动.谢谢哦...大家一起努力吧..OK....有事大家给我发E-MAIL 我的信箱是真的..谢了..
网友: 匿名(yang.liu@cn.bosch.com) 发表于: 2004-10-21 21:55:26
C语言教程---第一章: C语言概论
2003-4-10 8:01:13 VCOK 阅读次数: 30673
C语言的发展过程
C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。
当代最优秀的程序设计语言
早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。
C语言的特点
C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。
C语言版本
目前最流行的C语言有以下几种:
·Microsoft C 或称 MS C
·Borland Turbo C 或称 Turbo C
·AT&T C
这些C语言版本不仅实现了ANSI C标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。
面向对象的程序设计语言
在C的基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。C++目前流行的最新版本是Borland C++4.5,Symantec C++6.1,和Microsoft VisualC++ 2.0。C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。
C和C++
但是,C是C++的基础,C++语言和C语言在很多方面是兼容的。因此,掌握了C语言,再进一步学习C++就能以一种熟悉的语法来学习面向对象的语言,从而达到事半功倍的目的。
C源程序的结构特点
为了说明C语言源程序结构的特点,先看以下几个程序。这几个程 序由简到难,表现了C语言源程序在组成结构上的特点。虽然有关内容还未介绍,但可从这些例子中了解到组成一个C源程序的基本部分和书写格式。main()
{
printf("c语言世界www.vcok.com,您好!\n");
}
main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,且只能有一个主函数(main函数)。函数调用语句,printf函数的功能是把要输出的内容送到显示器去显示。printf函数是一个由系统定义的标准函数,可在程序中直接调用。
#include
#include
main()
{
double x,s;
printf("input number:\n");
scanf("%lf",&x);
s=sin(x);
printf("sine of %lf is %lf\n",x,s);
}
每行注释
include称为文件包含命令扩展名为.h的文件也称为头文件或首部文件
定义两个实数变量,以被后面程序使用
显示提示信息
从键盘获得一个实数x
求x的正弦,并把它赋给变量s
显示程序运算结果
main函数结束
程序的功能是从键盘输入一个数x,求x的正弦值,然后输出结果。在main()之前的两行称为预处理命令(详见后面)。预处理命令还有其它几种,这里的include 称为文件包含命令,其意义是把尖括号""或引号<>内指定的文件包含到本程序来,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h。因此也称为头文件或首部文件。C语言的头文件中包括了各个标准库函数的函数原型。因此,凡是在程序中调用一个库函数时,都必须包含该函数原型所在的头文件。在本例中,使用了三个库函数:输入函数scanf,正弦函数sin,输出函数printf。sin函数是数学函数,其头文件为math.h文件,因此在程序的主函数前用include命令包含了math.h。scanf和printf是标准输入输出函数,其头文件为stdio.h,在主函数前也用include命令包含了stdio.h文件。
需要说明的是,C语言规定对scanf和printf这两个函数可以省去对其头文件的包含命令。所以在本例中也可以删去第二行的包含命令#include。同样,在例1.1中使用了printf函数,也省略了包含命令。
在例题中的主函数体中又分为两部分,一部分为说明部分,另一部分执行部分。说明是指变量的类型说明。例题中未使用任何变量,因此无说明部分。C语言规定,源程序中所有用到的变量都必须先说明,后使用,否则将会出错。这一点是编译型高级程序设计语言的一个特点,与解释型的BASIC语言是不同的。说明部分是C源程序结构中很重要的组成部分。本例中使用了两个变量x,s,用来表示输入的自变量和sin函数值。由于sin函数要求这两个量必须是双精度浮点型,故用类型说明符double来说明这两个变量。说明部分后的四行为执行部分或称为执行语句部分,用以完成程序的功能。执行部分的第一行是输出语句,调用printf函数在显示器上输出提示字符串,请操作人员输入自变量x的值。第二行为输入语句,调用scanf函数,接受键盘上输入的数并存入变量x中。第三行是调用sin函数并把函数值送到变量s中。第四行是用printf 函数输出变量s的值,即x的正弦值。程序结束。
printf("input number:\n");
scanf("%lf",'C10F10&x);
s=sin(x);
printf("sine of %lf is %lf\n",'C10F10x,s);
运行本程序时,首先在显示器屏幕上给出提示串input number,这是由执行部分的第一行完成的。用户在提示下从键盘上键入某一数,如5,按下回车键,接着在屏幕上给出计算结果。
输入和输出函数
在前两个例子中用到了输入和输出函数scanf和 printf,在第三章中我们要详细介绍。这里我们先简单介绍一下它们的格式,以便下面使用。scanf和 printf这两个函数分别称为格式输入函数和格式输出函数。其意义是按指定的格式输入输出值。因此,这两个函数在括号中的参数表都由以下两部分组成: “格式控制串”,参数表 格式控制串是一个字符串,必须用双引号括起来,它表示了输入输出量的数据类型。各种类型的格式表示法可参阅第三章。在printf函数中还可以在格式控制串内出现非格式控制字符,这时在显示屏幕上将原文照印。参数表中给出了输入或输出的量。当有多个量时,用逗号间隔。例如:
printf("sine of %lf is %lf\n",x,s);
其中%lf为格式字符,表示按双精度浮点数处理。它在格式串中两次现,对应了x和s两个变量。其余字符为非格式字符则照原样输出在屏幕上
int max(int a,int b);
main(){
int x,y,z;
printf("input two numbers:\n");scanf("%d%d",&x,&y);
z=max(x,y);
printf("maxmum=%d",z);
}
int max(int a,int b){
if(a>b)return a;else return b;
}
此函数的功能是输入两个整数,输出其中的大数。
/*函数说明*/
/*主函数*/
/*变量说明*/
/*输入x,y值*/
/*调用max函数*/
/*输出*/
/*定义max函数*/
/*把结果返回主调函数*/
上面例中程序的功能是由用户输入两个整数,程序执行后输出其中较大的数。本程序由两个函数组成,主函数和max 函数。函数之间是并列关系。可从主函数中调用其它函数。max 函数的功能是比较两个数,然后把较大的数返回给主函数。max 函数是一个用户自定义函数。因此在主函数中要给出说明(程序第三行)。可见,在程序的说明部分中,不仅可以有变量说明,还可以有函数说明。关于函数的详细内容将在第五章介绍。在程序的每行后用/*和*/括起来的内容为注释部分,程序不执行注释部分。
上例中程序的执行过程是,首先在屏幕上显示提示串,请用户输入两个数,回车后由scanf函数语句接收这两个数送入变量x,y中,然后调用max函数,并把x,y 的值传送给max函数的参数a,b。在max函数中比较a,b的大小,把大者返回给主函数的变量z,最后在屏幕上输出z的值。
C源程序的结构特点
1.一个C语言源程序可以由一个或多个源文件组成。
2.每个源文件可由一个或多个函数组成。
3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。
4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。
5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
书写程序时应遵循的规则
从书写清晰,便于阅读,理解,维护的角度出发,在书写程序时 应遵循以下规则:
1.一个说明或一个语句占一行。
2.用{} 括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。
3.低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。
C语言的字符集
字符是组成语言的最基本的元素。C语言字符集由字母,数字,空格,标点和特殊字符组成。在字符常量,字符串常量和注释中还可以使用汉字或其它可表示的图形符号。
1.字母 小写字母a~z共26个,大写字母A~Z共26个
2.数字 0~9共10个
3.空白符 空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用。在其它地方出现时,只起间隔作用, 编译程序对它们忽略。因此在程序中使用空白符与否,对程序的编译不发生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。
4.标点和特殊字符
C语言词汇
在C语言中使用的词汇分为六类:标识符,关键字,运算符,分隔符,常量,注释符等。
1.标识符
在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C 规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线()组成的字符串,并且其第一个字符必须是字母或下划线。
以下标识符是合法的:
a,x, 3x,BOOK 1,sum5
以下标识符是非法的:
3s 以数字开头
s*T 出现非法字符*
-3x 以减号开头
bowy-1 出现非法字符-(减号)
在使用标识符时还必须注意以下几点:
(1)标准C不限制标识符的长度,但它受各种版本的C 语言编译系统限制,同时也受到具体机器的限制。例如在某版本C 中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2)在标识符中,大小写是有区别的。例如BOOK和book 是两个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,作到“顾名思义”。
2.关键字
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。C语言的关键字分为以下几类:
(1)类型说明符
用于定义、说明变量、函数或其它数据结构的类型。如前面例题中用到的int,double等
(2)语句定义符
用于表示一个语句的功能。如例1.3中用到的if else就是条件语句的语句定义符。
(3)预处理命令字
用于表示一个预处理命令。如前面各例中用到的include。
3.运算符
C语言中含有相当丰富的运算符。运算符与变量,函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。
4.分隔符
在C语言中采用的分隔符有逗号和空格两种。逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,作间隔符。在关键字,标识符之间必须要有一个以上的空格符作间隔, 否则将会出现语法错误,例如把int a;写成 inta;C编译器会把inta当成一个标识符处理,其结果必然出错。
5.常量
C 语言中使用的常量可分为数字常量、字符常量、字符串常量、符号常量、转义字符等多种。在第二章中将专gate给予介绍。
6.注释符
C 语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。在调试程序中对暂不使用的语句也可用注释符括起来,使翻译跳过不作处理,待调试结束后再去掉注释符。
网友对该文章的评论
网友: enkun(yangwencan2002@163.com) 发表于: 2004-10-20 14:43:50
C++里,gotoxy()要哪个头文件啊?我试了conio.h,不行啊(而这在C是可以的),请指教,谢谢!
网友: 慕容钰磊(zhulei2000@mail.china.com) 发表于: 2004-10-20 8:39:55
我是个新手,关于计算机我是个gate外汉的,我想学好C语言,希望大家能帮我哦!!!
网友: 现代男儿(hup452@tom.com) 发表于: 2004-10-19 21:54:25
我很想学C语言,但我现在对这些一点不懂,希望能得到你们的帮助。请加我QQ:343082125
网友: 曾经的最美(fengming_2004@163.com) 发表于: 2004-10-18 20:38:32
我们现在学的就是C语言,我想找一个学姐或是老师,陪我度过这大学四年。
请大家多多指教。。。。。。
说实在我也是电脑白痴
上课说些什么都不知道
网友: LELE(jiang-1203@163.com) 发表于: 2004-10-13 16:29:03
我再winxp下运行turboc2.0,在编辑界面输入完以后编译也没错误,可是直接运行
,屏幕就闪一下就回到了编辑界面,只有退出以后才能看到运行结果,这是怎么
回事?编译完以后生成的exe文件应该是可以直接双击运行的,双击以后也是出现
DOS界面闪一下就没了,这又是什么问题,该怎么办呢
网友: pjhuolong(pjhuolong@126.com) 发表于: 2004-10-12 19:09:44
我是新来的请大家多多指教
网友: 冷枫(zhaoyiyi1983@126.com) 发表于: 2004-10-11 12:11:58
大家好,我国际经济法本科,现在转学程序,正在自学,有没有哪位朋友带我入gate!
先谢谢了我的QQ是183150741
网友: 逸风(king2233445566@yahoo.com.cn) 发表于: 2004-10-10 20:42:20
我们今年开C语言 可是我一点都不懂啊 怎么办啊
网友: 李杰(wojiushijiaojiao@163.com) 发表于: 2004-10-9 20:51:05
大家好,请问怎么下载TORBOC呢?
网友: 李杰(wojiushijiaojiao@163.com) 发表于: 2004-10-9 20:51:02
大家好,请问怎么下载TORBOC呢?
网友: E时代果冻 发表于: 2004-10-9 20:07:55
多多学习啊
网友: 穿越时空(zsy0822@126.com) 发表于: 2004-10-7 7:14:56
大家好!说真的我看以后就两个字.很好.,在次如果有意者想和我一起学的请加我QQ;359995040
加的时候声明学习C语言.我有几个学习C语言的网站还可以.
网友: Stararrow002(stararrow002@sina.com) 发表于: 2004-9-30 23:27:55
有没有什么办法做到以下这点:
printf("a=%f",a);
如果按这样在TC2.0中输入,则在执行程序时在DOS界面里的光标只出现在"a="这行的下一行.可我想让光标出现在"a="的同一行,这样我在输入数据时就可以写成"a=2"之类的常见形式了.我不知道这点该怎样做到.教教我吧!
网友: 一点都不懂!(xinjiguo888@163.com) 发表于: 2004-9-28 21:12:06
我只学过QBASIC语言,对C语言一翘不通还望各位哥哥姐姐们多多指教!!!!
我在此谢谢名位了!!!!!!
网友: 匿名 发表于: 2004-9-27 18:50:38
#include <bios.h>
#include <graphics.h>
Cannot open include file: 'bios.h': No such file or directory
Cannot open include file: 'graphics.h': No such file or directory
怎么在Vc++中编译出现这种情况怎么解决啊?望回复!谢了 zhiminghe@eyou.com
网友: richliu(tyyld@163.com) 发表于: 2004-9-26 20:36:06
各位有什么不懂C语言的网友们你们如果有什么要帮忙的请加我啊
QQ:395719866
E-MAIL:tyyld@163.com
网友: 带我远洋(cnli0922@yahoo.com.cn) 发表于: 2004-9-24 9:50:41
大森林(zhengyoushun2004@163.com)您好,你的turboc2.0运行不了是因为你的路径设置的不对。我以前也出现过这种情况的。
网友: 大森林(zhengyoushun2004@163.com) 发表于: 2004-9-23 17:25:50
哪位仁兄可以帮我一下
我装的系统是xp
可是我的turboc2.0运行不了
不知道怎么搞的??
知道,请给我答复!!!!!!!!!!!
网友: 一骑绝尘(xuchunshan3926.student@sina.com) 发表于: 2004-9-23 11:40:00
把这个东西照搬上来花了我将近一个小时时间,斑竹你一定得给我个解释啊,要不我永不瞑目....
网友: 一骑绝尘(xuchunshan3926.student@sina.com) 发表于: 2004-9-23 11:37:36
斑竹先生,各位被C语言捆饶的同胞们,在下初学,有一小问题,望解答!
在谭浩强先生编写,由情话大学出版的《C程序设计(第二版)》中,第五页例1.3中,我从WINDOS 98中照书打一遍后,系统显示源程序硬是有错;从MS-DOS中打一遍后,系统就说无误了!我很纳闷,白思不得其解,还望各位高手给个说法!下面我把原文奉上,请大家看看!
main() /*主函数*/
{int a,b,c; /*声明部分,定义变量*/
scanf ("%d,%d",&a,&b); /*输入变量a和b的值*/
c=max(a,b); /*调用max函数,将得到的值赋给c*/
printf("max=%d",c); /*输出c的值*/
}
int max(int x,int y) /*定义max函数,函数值为整型,形式参数x,y为整型*/
{int z; /*max函数中的声明部分,定义本函数中用到的变量z为整型*/
if (x>y)z=x;
else z=y;
return(z); /*将z的值返回,通过max带回调用处*/
}
网友: 水瓶 发表于: 2004-9-21 19:09:59
我刚刚来的。我都是想学才进来这里的哦,大家多多指教哦。。
网友: 白云(mamatniyaz@tom.com) 发表于: 2004-9-21 17:54:58
网友,你们好!
我遇到了一个问题,谁帮我?
有一个老人 他有三个孙子。老大 15岁,老二 10岁,老三 5岁。
几年以后 ,他们三个人的年龄总数等于老人的年龄。
他们长大跟着老人的年龄一长大。
谁给我编程序?
网友: 绝代私人 发表于: 2004-9-21 14:38:02
C语言!!我要吃了你!!!
网友: 爱^_^妹妹(sky_lq) 发表于: 2004-9-20 17:27:17
我也是初学者,希望可以同所有初学者一起进步! my Q:54621544 ^_^
网友: 郁闷(xiongli013@yahoo.com.cn) 发表于: 2004-9-20 11:03:51
哎~~~~~~~~~~~哎!!!!!!!!!哎!!!!!!!!!!!哎!!!!
我看我是不行的哦
看都看不懂!
但我想学啊
大家告诉我能从那 入手吗?
谢谢!!
知道的加我QQ55866870
帮帮我吧!!!
网友: lsh(lsh3272@126.com) 发表于: 2004-9-19 16:33:41
http://wwwb.pconline.com.cn/pcedu/rookie/program.htm
· C语言基础教程(一) Turbo C语言概述
· C语言基础教程(二) Turbo C集成开发环境的使用
· C语言基础教程(三) Edit(编辑)菜单
· C语言基础教程(四) Run(运行)菜单
· C语言基础教程(五) Compile(编译)菜单
· C语言基础教程(六) Project(项目)菜单
· C语言基础教程(七) Options(选择)菜单
· C语言基础教程(八) Debug(调试)菜单
· C语言基础教程(九) 数据类型、变量和运算符
· C语言基础教程(十) 数据类型
· C语言基础教程(十一) 变量(1)
· C语言基础教程(十二) 变量(2)
· C语言基础教程(十三) 变量(3)
· C语言基础教程(十四) 变量(4)
· C语言基础教程(十五) 变量(5)
· C语言基础教程(十六) 变量(6)
· C语言基础教程(十七) 运算符(1)
· C语言基础教程(十八) 运算符(2)
· C语言基础教程(十九) 运算符(3)
· C语言基础教程(二十) 运算符(4)
· C语言基础教程(二十一) 运算符(5)
· C语言基础教程(二十二) 运算符(6)
· C语言基础教程(二十三) 函数(1)
· C语言基础教程(二十四) 函数(2)
· C语言基础教程(二十五) 函数(3)
· C语言基础教程(二十六) 函数(4)
· C语言基础教程(二十七) 函数(5)
· C语言基础教程(二十八) 函数(6)
· C语言基础教程(二十九) 函数(7)
· C语言基础教程(三十) 函数(8)
· C语言基础教程(三十一) 函数(9)
· C语言基础教程(三十二) 函数篇(a)
· C语言基础教程(三十三) 函数篇(b)
· C语言基础教程(三十四) 函数篇(c)
· C语言基础教程(三十五) 函数篇(c)
· C语言基础教程(三十六) 函数篇(c)
· C语言基础教程(三十七) 函数篇(c)
· C语言基础教程(三十八) 函数篇(d)
· C语言基础教程(三十九) 函数篇(d)
· C语言基础教程(四十) 函数篇(d)
· C语言基础教程(四十一) 函数篇(e)
· C语言基础教程(四十二) 函数篇(e)
· C语言基础教程(四十三) 函数篇(f)
· C语言基础教程(四十四) 函数篇(f)
· C语言基础教程(四十五) 函数篇(f)
· C语言基础教程(四十六) 函数篇(f)
· C语言基础教程(四十七) 函数篇(f)
· C语言基础教程(四十八) 函数篇(f)
· C语言基础教程(四十九) 函数篇(f)
· C语言基础教程(五十) 函数篇(g)
· C语言基础教程(五十一) 函数篇(g)
· C语言基础教程(五十二) 函数篇(g)
· C语言基础教程(五十三) 函数篇(g)
· C语言基础教程(五十四) 函数篇(g)
· C语言基础教程(五十五) 函数篇(g)
· C语言基础教程(五十六) 函数篇(h)
· C语言基础教程(五十七) 函数篇(i)
· C语言基础教程(五十八) 函数篇(k)
· C语言基础教程(五十九) 函数篇(L)
· C语言基础教程(六十) 函数篇(m)
· C语言基础教程(六十一) 函数篇(o)
· C语言基础教程(六十二) 函数篇(p)
· C语言基础教程(六十三) 函数篇(q)
· C语言基础教程(六十四) 函数篇(r)
· C语言基础教程(六十五) 函数篇(s)
· C语言基础教程(六十六) 函数篇(t)
· C语言基础教程(六十七) 函数篇(u)
· C语言基础教程(六十八) 函数篇(v)
· C语言基础教程(六十九) 函数篇(w)
希望对各位跟我一样刚起步的有点启发
网友: 王清玲( wqlwxitom.com) 发表于: 2004-9-18 17:44:11
我也是一个C语言的初学者,我想多学点关于C语言的知识,在这里我向你们深深地说一声谢谢。初学者的心声。愿你们能够帮我。
网友: 一别多年(xw2q@163.net) 发表于: 2004-9-17 18:31:19
求助啊!!
int max(int a,int b);
main(){
int x,y,z;
printf("input two numbers:\n");scanf("%d%d",&x,&y);
z=max(x,y);
printf("maxmum=%d",z);
}
int max(int a,int b){
if(a>b)return a;else return b;
} 上面的 比较两个数大小 然后输出最大数的程序
我要怎么修改 使 我输入3个数 然后输出最大的数啊
会的告诉我啊 谢谢了啊
网友: 一别多年(xw2q@163.net) 发表于: 2004-9-17 17:36:00
大家好,我是一个初学做程序的,但我发誓一定要学好它!!
在这里 我想找几个和我情况相同,(要是你很厉害那最好啦)自己有电脑 常常在线和愿意我共同进步的朋友,要的话请加QQ 65295216 我一般在线 不过 有时是隐身
我们一起向 优秀的程序员 努力吧!!!
网友: 达到 发表于: 2004-9-17 15:47:07
大啊
网友: 稻草人(daocaoren1544@tom.com) 发表于: 2004-9-16 11:08:34
我就要参加计算机2级考试了,大家为我加油吧
网友: c王(footballboy323@yahoo.com.cn) 发表于: 2004-9-15 9:38:00
希望,以后多多增加,OK
网友: 闷ぁ豆么么茶(mjhhs@eyou.com) 发表于: 2004-9-13 20:44:58
有没有学生成绩管理系统的C程序啊!
哪位仁兄或大姐请帮帮小弟,我的QQ是307249565,就叫”闷ぁ豆么么茶‘。
网友: a (fdsfds@163.com) 发表于: 2004-9-12 21:11:09
怎么第二章内容没有啊 无法显示啊
这网站站长 不打理了吗?
网友: 真真 发表于: 2004-9-10 10:16:09
unable to open file "cos.obj"错误! 回复:
有可能的一种情况:
可以检查安装路径是否和系统的默认路径一致!!
方法:在“option"菜单下察看“directories"子菜单的内容,如果路径和你所安装的
路径不一致,则可选中后按回车键进行改动,使其安实际情况设置即可。
网友: 白噶棵(我国器) 发表于: 2004-9-8 11:15:17
http://cstudy.rwen.net/pchc/html/basic/学习c 语言哦
网友: 匿名 发表于: 2004-9-8 11:12:42
http://cstudy.rwen.net/pchc/html/basic/学习c 语言哦
网友: 阿牛(niuzhongliang007@.163.com) 发表于: 2004-9-7 19:42:16
我在网上下载了一个c 2.0,运行一个正确程序时,总会出现unable to open file "cos.obj"错误!
不知为何? 哪大侠可帮小弟一把?
网友: 纪甫磊(jifulei@163.com) 发表于: 2004-9-7 16:28:12
#include <bios.h>
#include <graphics.h>
Cannot open include file: 'bios.h': No such file or directory
Cannot open include file: 'graphics.h': No such file or directory
怎么在Vc++中编译出现这种情况怎么解决啊?望回复!谢了 jifulei@163.com
网友: stephen (stephen.chen@cn.flextronics.com) 发表于: 2004-9-5 11:16:03
我想知道下面这个c语言怎么不能正常运行?
#include "math.h" /* 调用fabs函数时要求包含math.h文件*/
main ()
{int s;
float n,t,pi;
t=1.0; /*t中存放每项的值初值为1*/
pi=0; /*pi中存放圆周率的值初值为0*/
n=1.0; /*n中存放每项分母*/
s=1.0; /*s中存放每项分子其值按公式在1和-1间变化*/
while(fabs(t)>=1e-4)
{pi=pi+t;
n+=2.0;
s=-s /*改变符号*/
t=s/n;
}
pi=pi*4;
printf("pi=%f\n",pi);
}
网友: 凡凡(jiangfanfan@sina.com) 发表于: 2004-9-3 13:09:14
我要怎么样才能入gate啊。我不会编程序,老师要我编的时候。我只知道照格式套一下。还有就是程序我也看不懂。每一步是什么意思 ,我现在已经大二了。要学数据结构。也听不懂。也是关于C语言的。以后还有C++啊,这些都与C有关。我该怎么办啊。有不有好的建议啊。能不能给我说说啊。谢谢啦。
网友: 凡心(fanfanjiang@sina.com) 发表于: 2004-9-3 12:59:26
我想说C语言怎么入gate啊。我不会编写程序啊,怎么样才编写啊。我就是搞不懂。只知道乱套几个格式。还有就是那些程序我看不懂啊,是什么意思啊。我都大二了。现在还要学数据结构啊,还有C++ 啊,现在更是听不懂。怎么样学好C啊。有什么好的方法告诉我一下好吗。谢谢啦。
网友: pxl527(yx0733@yahoo.com.cn) 发表于: 2004-9-1 14:59:26
各位好!~
我想请问一个问题!`就是到哪里可以下载有清华大学谭浩强的《C程序设计》书籍呀
谢谢各位[屏蔽]!~!~
网友: 漂亮々丫头(gongping007@163.com) 发表于: 2004-8-31 15:55:18
哎!!我英文太差看里面的命令跟看天文一样?怎么办?
哪里有初学者的教材啊 要能看懂的 谢谢各位 大狭
网友: 青青(xkgj021@163.com) 发表于: 2004-8-29 6:09:01
回复"我在学习C语言当中,遇到了一个难题,请各位大侠帮助解决,我在运行一个程序时,它就会出现错误提示,Linker Error:Unable to open input file 'COS.OBJ'
谢谢! "
你的路径有问题,把路径修改了就没问题了.
网友: 海 发表于: 2004-8-17 21:22:55
这是我的程序中的一个分函数,它的作用是改变文件中原有的密码,但是在运行时它会把原有的文件内容改的面目全非,导致无法进入,我只学了简单的C语言,还请高手指导一下,谢谢!
void changepassword(void)
{ int i,j,a;
char filename[]="hyh.dat";/*密码文件名,为了方便,设置成了相对路径*/
FILE *fp;
char key[40],key2[40];
textbackground(BLUE);/*定义背景颜色为蓝色,因为前提为图形菜单界面,在此切换成的文本界面*/
clrscr();/*清屏函数*/
textcolor(YELLOW);/*定义字体颜色为[屏蔽]*/
gotoxy(M,N-2);/*光标定位,M是22,N是10*/
cprintf("You should input the former password !");
i= password();/*密码验证函数,正确时返回值1,错误时返回0*/
if(i==1){
if(( fp=fopen(filename,"wb"))==NULL){ /*打开密码文件*/
fprintf(stderr,"Error opening file %s>\n",filename);
getch();}
else {
again: clrscr();
printf("\n\n\n\n\tPlease input the new password :(<20)\n");
printf("\tPassword:");
for(j=0;j<20;j++){ /*录入新的密码*/
key[j]=getch();
putchar('*') ; /*在屏幕上显示‘*’ */
if(key[j]==RETURN)
break;
} key[j]=0;
printf("\n\tPlease input again!");
printf("\n\tPassword:");
for(j=0;j<20;j++){ /*验证录入密码*/
key2[j]=getch();
putchar('*');
if(key2[j]==RETURN)
break;}
key2[j]=0;
if(strcmp(key,key2)!=NULL){ /*比较两次录入是否相同*/
puts("\n\tTwo password is different,please input again.(press any key)");
getch();
goto again;}
else {
for(a=0;a<j;a++){
fwrite(&key2[a],sizeof(char),1,fp); } /*新密码写入*/
key2[a]=RETURN; /*有问题处*/
fwrite(&key2[a],sizeof(char),1,fp);
printf("\n\tThe new password has been taken,thank you !");
printf("\n\tany key to return.");
getch();
}
}
}
else ;
}
附录:密码验证函数(该函数运行正常)
int password(void)
{
FILE *fp;
char b,c;
int i,j;
char file[]="hyh.dat";
char ah[40];
char sk[20];
j=0;
if((fp=fopen(file,"rb"))==NULL){
cprintf("\n\r Can't read the data!");
getch();
}
else {
while(!feof(fp)){
fread(&ah[j],sizeof(char),1,fp);
j++;
}
fclose(fp);
ah[j-2]=0;
B: clrscr();
gotoxy(M,N);
cprintf("Please input the key!\n");/*如果没有密码文件存在,创建该文件,并提示设置密码*/
gotoxy(M,N+2);
cprintf("key:");
for(i=0;i<20;i++){
sk=getch();
putchar('*');
if(sk==RETURN)
break;
}
sk=0;
clrscr();
gotoxy(M,N);
if(strcmp(ah,sk)!=NULL)
{ /*如果密码文件存在,验证密码正确性*/
puts("Wrong key! Please input again!\n");
gotoxy(M,N-2);
puts("You can press 'e' to exit !\n");
c=getch();
if(c=='e')
return 0;
else
goto B;
}
return 1;
}
}