C语言实现简单二维动画

124人浏览 2024-05-19 07:47:38

7个回答

  • 一曲相思愁断肠
    一曲相思愁断肠
    最佳回答

    1.可以考虑用Turbo C的绘图函数(附加graphic.h库)或者用opengl+glut等来实现。 2.前者一般就是纯粹的画点画线。网上也能找到教程。  3.主要说一下后者。可以导入图片,并且二维、三维动画都可以做,甚至是用来开发游戏。后者可以用vc6.0或者vs2005来开发。跨平台。参考教程: http://www.owlei.com/DancingWind/看你的描述要做比较偏数学的东西,那你自己得弄明白如何去实现绘制算法。要实现的动画本身而搭的基本框架不会很复杂的,可能100行代码都不用。4.另外还有opencv、GDI之类的可能更适合二维图像处理库,但我自己不是很了解了,你也可以查一查用哪种绘图库比较适合你。

  • 土豪哥
    土豪哥

    我有相关的资料(原版英文书), 但无法传递给你!!! 给你个实例程序:(太长,程序没发完)

    /*

    GRAPHICS DEMO FOR TURBO C 2.0 Copyright (c) 1987,88 Borland International. All rights reserved. From the command line, use: tcc bgidemo graphics.lib */ #ifdef __TINY__

    #error BGIDEMO will not run in the tiny model.

    #endif #include

    #include

    #include

    #include

    #include

    #include #include #define ESC 0x1b /* Define the escape key */

    #define TRUE 1 /* Define some handy constants */

    #define FALSE 0 /* Define some handy constants */

    #define PI 3.14159 /* Define a value for PI */

    #define ON 1 /* Define some handy constants */

    #define OFF 0 /* Define some handy constants */ char *Fonts[] = {

    "DefaultFont", "TriplexFont", "SmallFont",

    "SansSerifFont", "GothicFont"

    }; char *LineStyles[] = {

    "SolidLn", "DottedLn", "CenterLn", "DashedLn", "UserBitLn"

    }; char *FillStyles[] = {

    "EmptyFill", "SolidFill", "LineFill", "LtSlashFill",

    "SlashFill", "BkSlashFill", "LtBkSlashFill", "HatchFill",

    "XHatchFill", "InterleaveFill", "WideDotFill", "CloseDotFill"

    }; char *TextDirect[] = {

    "HorizDir", "VertDir"

    }; char *HorizJust[] = {

    "LeftText", "CenterText", "RightText"

    }; char *VertJust[] = {

    "BottomText", "CenterText", "TopText"

    }; struct PTS {

    int x, y;

    }; /* Structure to hold vertex points */ int GraphDriver; /* The Graphics device driver */

    int GraphMode; /* The Graphics mode value */

    double AspectRatio; /* Aspect ratio of a pixel on the screen*/

    int MaxX, MaxY; /* The maximum resolution of the screen */

    int MaxColors; /* The maximum # of colors available */

    int ErrorCode; /* Reports any graphics errors */

    struct palettetype palette; /* Used to read palette info */ /* */

    /* Function prototypes */

    /* */ void Initialize(void);

    void ReportStatus(void);

    void TextDump(void);

    void Bar3DDemo(void);

    void RandomBars(void);

    void TextDemo(void);

    void ColorDemo(void);

    void ArcDemo(void);

    void CircleDemo(void);

    void PieDemo(void);

    void BarDemo(void);

    void LineRelDemo(void);

    void PutPixelDemo(void);

    void PutImageDemo(void);

    void LineToDemo(void);

    void LineStyleDemo(void);

    void CRTModeDemo(void);

    void UserLineStyleDemo(void);

    void FillStyleDemo(void);

    void FillPatternDemo(void);

    void PaletteDemo(void);

    void PolyDemo(void);

    void SayGoodbye(void);

    void Pause(void);

    void MainWindow(char *header);

    void StatusLine(char *msg);

    void DrawBorder(void);

    void changetextstyle(int font, int direction, int charsize);

    int gprintf(int *xloc, int *yloc, char *fmt, ... ); /* */

    /* Begin main function */

    /* */ int main()

    { Initialize(); /* Set system into Graphics mode */

    ReportStatus(); /* Report results of the initialization */ ColorDemo(); /* Begin actual demonstration */

    if( GraphDriver==EGA || GraphDriver==EGALO || GraphDriver==VGA )

    PaletteDemo();

    PutPixelDemo();

    PutImageDemo();

    Bar3DDemo();

    BarDemo();

    RandomBars();

    ArcDemo();

    CircleDemo();

    PieDemo();

    LineRelDemo();

    LineToDemo();

    LineStyleDemo();

    UserLineStyleDemo();

    TextDump();

    TextDemo();

    CRTModeDemo();

    FillStyleDemo();

    FillPatternDemo();

    PolyDemo();

    SayGoodbye(); /* Give user the closing screen */ closegraph(); /* Return the system to text mode */

    return(0);

    } /* */

    /* INITIALIZE: Initializes the graphics system and reports */

    /* any errors which occured. */

    /* */ void Initialize(void)

    {

    int xasp, yasp; /* Used to read the aspect ratio*/ GraphDriver = DETECT; /* Request auto-detection */

    initgraph( &GraphDriver, &GraphMode, "" );

    ErrorCode = graphresult(); /* Read result of initialization*/

    if( ErrorCode != grOk ){ /* Error occured during init */

    printf(" Graphics System Error: %sn", grapherrormsg( ErrorCode ) );

    exit( 1 );

    } getpalette( &palette ); /* Read the palette from board */

    MaxColors = getmaxcolor() + 1; /* Read maximum number of colors*/ MaxX = getmaxx();

    MaxY = getmaxy(); /* Read size of screen */ getaspectratio( &xasp, &yasp ); /* read the hardware aspect */

    AspectRatio = (double)xasp / (double)yasp; /* Get correction factor */ } /* */

    /* REPORTSTATUS: Report the current configuration of the system */

    /* after the auto-detect initialization. */

    /* */ void ReportStatus(void)

    {

    struct viewporttype viewinfo; /* Params for inquiry procedures*/

    struct linesettingstype lineinfo;

    struct fillsettingstype fillinfo;

    struct textsettingstype textinfo;

    struct palettetype palette; char *driver, *mode; /* Strings for driver and mode */

    int x, y; getviewsettings( &viewinfo );

    getlinesettings( &lineinfo );

    getfillsettings( &fillinfo );

    gettextsettings( &textinfo );

    getpalette( &palette ); x = 10;

    y = 4; MainWindow( "Status report after InitGraph" );

    settextjustify( LEFT_TEXT, TOP_TEXT ); driver = getdrivername();

    mode = getmodename(GraphMode); /* get current setting */ gprintf( &x, &y, "Graphics device : %-20s (%d)", driver, GraphDriver );

    gprintf( &x, &y, "Graphics mode : %-20s (%d)", mode, GraphMode );

    gprintf( &x, &y, "Screen resolution : ( 0, 0, %d, %d )", getmaxx(), getmaxy() ); gprintf( &x, &y, "Current view port : ( %d, %d, %d, %d )",

    viewinfo.left, viewinfo.top, viewinfo.right, viewinfo.bottom );

    gprintf( &x, &y, "Clipping : %s", viewinfo.clip ? "ON" : "OFF" ); gprintf( &x, &y, "Current position : ( %d, %d )", getx(), gety() );

    gprintf( &x, &y, "Colors available : %d", MaxColors );

    gprintf( &x, &y, "Current color : %d", getcolor() ); gprintf( &x, &y, "Line style : %s", LineStyles[ lineinfo.linestyle ] );

    gprintf( &x, &y, "Line thickness : %d", lineinfo.thickness ); gprintf( &x, &y, "Current fill style : %s", FillStyles[ fillinfo.pattern ] );

    gprintf( &x, &y, "Current fill color : %d", fillinfo.color ); gprintf( &x, &y, "Current font : %s", Fonts[ textinfo.font ] );

    gprintf( &x, &y, "Text direction : %s", TextDirect[ textinfo.direction ] );

    gprintf( &x, &y, "Character size : %d", textinfo.charsize );

    gprintf( &x, &y, "Horizontal justify : %s", HorizJust[ textinfo.horiz ] );

    gprintf( &x, &y, "Vertical justify : %s", VertJust[ textinfo.vert ] ); Pause(); /* Pause for user to read screen*/ } /* */

    /* TEXTDUMP: Display the all the characters in each of the */

    /* available fonts. */

    /* */ void TextDump()

    {

    static int CGASizes[] = {

    1, 3, 7, 3, 3 };

    static int NormSizes[] = {

    1, 4, 7, 4, 4 }; char buffer[80];

    int font, ch, wwidth, lwidth, size;

    struct viewporttype vp; for( font=0 ; font<5 ; ++font ){ /* For each available font */

    sprintf( buffer, "%s Character Set", Fonts[font] );

    MainWindow( buffer ); /* Display fontname as banner */

    getviewsettings( &vp ); /* read current viewport */ settextjustify( LEFT_TEXT, TOP_TEXT );

    moveto( 2, 3 ); buffer[1] = 0; /* Terminate string */

    wwidth = vp.right - vp.left; /* Determine the window width */

    lwidth = textwidth( "H" ); /* Get average letter width */ if( font == DEFAULT_FONT ){

    changetextstyle( font, HORIZ_DIR, 1 );

    ch = 0;

    while( ch < 256 ){ /* For each possible character */

    buffer[0] = ch; /* Put character into a string */

    outtext( buffer ); /* send string to screen */

    if( (getx() + lwidth) > wwidth )

    moveto( 2, gety() + textheight("H") + 3 );

    ++ch; /* Goto the next character */

    }

    }

    else{ size = (MaxY < 200) ? CGASizes[font] : NormSizes[font];

    changetextstyle( font, HORIZ_DIR, size ); ch = !; /* Begin at 1st printable */

    while( ch < 127 ){ /* For each printable character */

    buffer[0] = ch; /* Put character into a string */

    outtext( buffer ); /* send string to screen */

    if( (lwidth+getx()) > wwidth ) /* Are we still in window? */

    moveto( 2, gety()+textheight("H")+3 );

    ++ch; /* Goto the next character */

    } } Pause(); /* Pause until user acks */ } /* End of FONT loop */ } /* */

    /* BAR3DDEMO: Display a 3-D bar chart on the screen. */

    /* */ void Bar3DDemo(void)

    {

    static int barheight[] = {

    1, 3, 5, 4, 3, 2, 1, 5, 4, 2, 3 };

    struct viewporttype vp;

    int xstep, ystep;

    int i, j, h, color, bheight;

    char buffer[10]; MainWindow( "Bar 3-D / Rectangle Demonstration" ); h = 3 * textheight( "H" );

    getviewsettings( &vp );

    settextjustify( CENTER_TEXT, TOP_TEXT );

    changetextstyle( TRIPLEX_FONT, HORIZ_DIR, 4 );

    outtextxy( MaxX/2, 6, "These are 3-D Bars" );

    changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );

    setviewport( vp.left+50, vp.top+40, vp.right-50, vp.bottom-10, 1 );

    getviewsettings( &vp ); line( h, h, h, vp.bottom-vp.top-h );

    line( h, (vp.bottom-vp.top)-h, (vp.right-vp.left)-h, (vp.bottom-vp.top)-h );

    xstep = ((vp.right-vp.left) - (2*h)) / 10;

    ystep = ((vp.bottom-vp.top) - (2*h)) / 5;

    j = (vp.bottom-vp.top) - h;

    settextjustify( CENTER_TEXT, CENTER_TEXT ); for( i=0 ; i<6 ; ++i ){

    line( h/2, j, h, j );

    itoa( i, buffer, 10 );

    outtextxy( 0, j, buffer );

    j -= ystep;

    } j = h;

    settextjustify( CENTER_TEXT, TOP_TEXT ); for( i=0 ; i<11 ; ++i ){

    color = random( MaxColors );

    setfillstyle( i+1, color );

    line( j, (vp.bottom-vp.top)-h, j, (vp.bottom-vp.top-3)-(h/2) );

    itoa( i, buffer, 10 );

    outtextxy( j, (vp.bottom-vp.top)-(h/2), buffer );

    if( i != 10 ){

    bheight = (vp.bottom-vp.top) - h - 1;

    bar3d( j, (vp.bottom-vp.top-h)-(barheight[i]*ystep), j+xstep, bheight, 15, 1 );

    }

    j += xstep;

    } Pause(); /* Pause for users response */ } /* */

    /* RANDOMBARS: Display random bars */

    /* */ void RandomBars(void)

    {

    int color; MainWindow( "Random Bars" );

    StatusLine( "Esc aborts or press a key..." ); /* Put msg at bottom of screen */

    while( !kbhit() ){ /* Until user enters a key... */

    color = random( MaxColors-1 )+1;

    setcolor( color );

    setfillstyle( random(11)+1, color );

    bar3d( random( getmaxx() ), random( getmaxy() ),

    random( getmaxx() ), random( getmaxy() ), 0, OFF);

    } Pause(); /* Pause for users response */ } /* */

    /* TEXTDEMO: Show each font in several sizes to the user. */

    /* */ void TextDemo(void)

    {

    int charsize[] = {

    1, 3, 7, 3, 4 };

    int font, size;

    int h, x, y, i;

    struct viewporttype vp;

    char buffer[80]; for( font=0 ; font<5 ; ++font ){ /* For each of the four fonts */ sprintf( buffer, "%s Demonstration", Fonts[font] );

    MainWindow( buffer );

    getviewsettings( &vp ); changetextstyle( font, VERT_DIR, charsize[font] );

    settextjustify( CENTER_TEXT, BOTTOM_TEXT );

    outtextxy( 2*textwidth("M"), vp.bottom - 2*textheight("M"), "Vertical" ); changetextstyle( font, HORIZ_DIR, charsize[font] );

    settextjustify( LEFT_TEXT, TOP_TEXT );

    outtextxy( 2*textwidth("M"), 2, "Horizontal" ); settextjustify( CENTER_TEXT, CENTER_TEXT );

    x = (vp.right - vp.left) / 2;

    y = textheight( "H" ); for( i=1 ; i<5 ; ++i ){ /* For each of the sizes */

    size = (font == SMALL_FONT) ? i+3 : i;

    changetextstyle( font, HORIZ_DIR, size );

    h = textheight( "H" );

    y += h;

    sprintf( buffer, "Size %d", size );

    outtextxy( x, y, buffer ); } if( font != DEFAULT_FONT ){ /* Show user declared font size */

    y += h / 2; /* Move down the screen */

    settextjustify( CENTER_TEXT, TOP_TEXT );

    setusercharsize( 5, 6, 3, 2 );

    changetextstyle( font, HORIZ_DIR, USER_CHAR_SIZE );

    outtextxy( (vp.right-vp.left)/2, y, "User Defined Size" );

    } Pause(); /* Pause to let user look */ } /* End of FONT loop */ } /* */

    /* COLORDEMO: Display the current color palette on the screen. */

    /* */ void ColorDemo(void)

    {

    struct viewporttype vp;

    int color, height, width;

    int x, y, i, j;

    char cnum[5]; MainWindow( "Color Demonstration" ); /* Show demonstration name */ color = 1;

    getviewsettings( &vp ); /* Get the current window size */

    width = 2 * ( (vp.right+1) / 16 ); /* Get box dimensions */

    height = 2 * ( (vp.bottom-10) / 10 ); x = width / 2;

    y = height / 2; /* Leave 1/2 box border */ for( j=0 ; j<3 ; ++j ){ /* Row loop */ for( i=0 ; i<5 ; ++i ){ /* Column loop */ setfillstyle(SOLID_FILL, color); /* Set to solid fill in color */

    setcolor( color ); /* Set the same border color */ bar( x, y, x+width, y+height ); /* Draw the rectangle */

    rectangle( x, y, x+width, y+height ); /* outline the rectangle */ if( color == BLACK ){ /* If box was black... */

    setcolor( WHITE ); /* Set drawing color to white */

    rectangle( x, y, x+width, y+height ); /* Outline black in white*/

    } itoa( color, cnum, 10 ); /* Convert # to ASCII */

    outtextxy( x+(width/2), y+height+4, cnum ); /* Show color # */ color = ++color % MaxColors; /* Advance to the next color */

    x += (width / 2) * 3; /* move the column base */

    } /* End of Column loop */ y += (height / 2) * 3; /* move the row base */

    x = width / 2; /* reset column base */

    } /* End of Row loop */ Pause(); /* Pause for users response */ } /* */

    /* ARCDEMO: Display a random pattern of arcs on the screen */

    /* until the user says enough. */

    /* */ void ArcDemo(void)

    {

    int mradius; /* Maximum radius allowed */

    int eangle; /* Random end angle of Arc */

    struct arccoordstype ai; /* Used to read Arc Cord info */ MainWindow( "Arc Demonstration" );

    StatusLine( "ESC Aborts - Press a Key to stop" ); mradius = MaxY / 10; /* Determine the maximum radius */ while( !kbhit() ){ /* Repeat until a key is hit */

    setcolor( random( MaxColors - 1 ) + 1 ); /* Randomly select a color */

    eangle = random( 358 ) + 1; /* Select an end angle */

    arc( random(MaxX), random(MaxY), random(eangle), eangle, mradius );

    getarccoords( &ai ); /* Read Cord data */

    line( ai.x, ai.y, ai.xstart, ai.ystart ); /* line from start to center */

    line( ai.x, ai.y, ai.xend, ai.yend ); /* line from end to center */

    } /* End of WHILE not KBHIT */ Pause(); /* Wait for users response */ }

  • 雨后初晨
    雨后初晨

    #include

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

    {

    c=a+b;

    printf("%d\t",c);

    printf("\n");

    }

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

    {

    c=a-b;

    printf("%d\t",c);

    printf("\n");

    }

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

    {

    c=a*b;

    printf("%d\t",c);

    printf("\n");

    }

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

    {

    c=(float)a/(float)b;

    printf("%f\t",c);

    printf("\n");

    }

    main()

    {

    int a,b,c;

    char p;

    puts("input A:\n");

    scanf("%d",&a);

    puts("input B:\n");

    scanf("%d",&b);

    puts("input operation:\n");

    getchar();

    p=getchar();

    if(p==+) add(a,b,c);else

    if(p==-) minus(a,b,c);else

    if(p==*) multiplication(a,b,c);else

    if(p==/) div(a,b,c);else

    puts("没有注册这个运算符号\n");

    }

    以上是设计的一个简易计算器。可以进行相应的加减乘除。

  • 巴别
    巴别

    爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础 学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣. 1, 总是从Hello,world开始 学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell o,world!".让我们来看看这个最简单的C程序:#incolude /*把输入输出函数的头文件包含进来*/int main(){printf("Hello, world!");/*在屏幕上输出字符串"Hello,world!"*/return 0;/*退出main函数,并返回0*/} 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符.3,我们 还希望屏幕输出一个笑脸来欢迎我们. 让我们来改进一下这个程序吧!1,在return语句的前面加一句:getch ();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有 许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可 以用printf("%c", 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧! 2, 心动的开始,一个运动中的笑脸 大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构:struct move_point{ int x, y;/*该点的位置,包括x坐标和y坐标*/ int xv, yv;/*该点在x轴,y轴的速度*/};运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码:gotoxy(man.x, man.y);/*把光标移到指定的坐标*/printf(" ");/*输出一个空格,把先前的字符擦去*/然后我们让物体按其速度运动:man.x += man.xv;/*水平方向按x轴的速度运动*/man.y += man.yv;/*垂直方向按y轴的速度运动*/运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让 它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸:gotoxy(man.x, man.y);printf("%cb", 2); /*输出ASCII码值为2的"笑脸"字符*/怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能 让我们来控制它运动呢?

    不过这个程序没有什么目的,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧! 4, 在迷宫中探索 小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣. 首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中map[x][y] == #表示在(x,y)坐标上的点是墙壁.DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息.在main函数里,我们定义了"小人"man的坐标和"目的地"des的 坐标.在游戏循环中,我们增加了一些用来判断胜负的语句:if (man.x == des.x && man.y == des.y) /*如果人的坐标等于目的地的坐标*/{ gotoxy(35, 3); printf("Ok! You win!"); /*输出胜利信息*/….}在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不是有"墙壁",如果有的话,就不能往前移动了.好的,我们在判断按键的switch语句的各个分支加上了判断语句,如下:if (map[…][…] == #) break;/*如果前面是墙壁,就不执行下去*/哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们要设计一个更好玩的游戏—— 5, 聪明的搬运工 大家一定玩过"搬运工"的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的"搬运工"吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,b表示箱子,#表示墙壁,*表示目的地,i表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值.游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推箱子前进,否则不可移动.好的,我们在switch中增加了这些判断语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢. 尾声: 在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的.C语言在与硬件联系紧密的编程中,也占有重要地位.其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法. 好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏.

  • 刘应春
    刘应春

    C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,Turbo C等等......

    [编辑本段]C语言的发展历史C语言的原型ALGOL 60语言。(也称为A语言)1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言。1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语言。1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字“B语言”。意思是将CPL语言煮干,提炼出它的精华。并且他用B语言写了第一个UNIX操作系统。而在1973年,B语言也给人“煮”了一下,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。为了使UNIX操作系统推广,1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。即是著名的ANSI C。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。在《K&R》中并没有定义一个完整的标准C 语言,后来由美国国家标准协会(American National Standards Institute)在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。1988年,随着微型计算机的日益普及, C语言出现了许多版本。由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准, 成为现行的C语言标准3.C语言的主要特点 。C语言发展迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。用C语言加上一些汇编语言子程序, 就更能显示C语言的优势了,象PC- DOS 、WORDSTAR等就是用这种方法编写的。

    [编辑本段]C语言的优点1. 简洁紧凑、灵活方便C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。2. 运算符丰富C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。3. 数据结构丰富C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。4. C是结构式语言结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。5. C语法限制不太严格,程序设计自由度大虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。6. C语言允许直接访问物理地址,可以直接对硬件进行操作因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。7. C语言程序生成代码质量高,程序执行效率高一般只比汇编程序生成的目标代码效率低10へ20%。8. C语言适用范围大,可移植性好C语言有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。

    [编辑本段]C语言的缺点1. C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别。2. C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。[C语言指针]指针就是C语言的一大特色,可以说C语言优于其它高级语言的一个重要原因就是因为它有指针操作可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素。C++在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。Java取消了指针操作,提高了安全性。

    [编辑本段]C源程序的结构特点1.一个C语言源程序可以由一个或多个源文件组成。2.每个源文件可由一个或多个函数组成。3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。

    [编辑本段]学习C语言在初学C语言时,可能会遇到有些问题理解不透,或者表达方式与以往数学学习中不同(如运算符等),这就要求不气馁,不明白的地方多问多想,鼓足勇气进行学习,待学完后面的章节知识,前面的问题也就迎刃而解了,这一方面我感觉是我们同学最欠缺,大多学不好的就是因为一开始遇到困难就放弃,曾经和好多同学谈他的问题,回答是听不懂、不想听、放弃这样三个过程,我反问,这节课你听过课吗?回答又是没有,根本就没听过课,怎么说自己听不懂呢?相应的根本就没学习,又谈何学的好? 学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。 我们如何学好《C程序设计》呢? 一.学好C语言的运算符和运算顺序 这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。 先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序. 二.学好C语言的四种程序结构 (1)顺序结构 顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。 例如;a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。 (2) 分支结构 顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。 学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。下面我介绍几种基本的分支结构。 ①if(条件) {分支体} 这种分支结构中的分支体可以是一条语句,此时“{ }”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过分支体,这时分支体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0) x=-x; ②if(条件) {分支1} else {分支2} 这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根 分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下: d=b*b-4*a*c; if(d>=0) {x1=(-b+sqrt(d))/2a; x2=(-b-sqrt(d))/2a; printf(“x1=%8.4f,x2=%8.4fn”,x1,x2); } else {r=-b/(2*a); i =sqrt(-d)/(2*a); printf(“x1=%8.4f+%8.4fin”r, i); printf(“x2=%8.4f-%8.4fin”r,i) } ③嵌套分支语句:其语句格式为: if(条件1) {分支1}; else if(条件2) {分支2} else if(条件3) {分支3} …… else if(条件n) {分支n} else {分支n+1} 嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。 ④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。 (3)循环结构: 循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do ?Cwhile循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。 在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。 顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。 (4)模块化程序结构 C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。三.掌握一些简单的算法 编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学 C源程序的关键字---------------------------------------------------------------------------------------所谓关键字就是已被C语言本身使用, 不能作其它用途使用的字。例如关键字不能用作变量名、函数名等 由ANSI标准定义的C语言关键字共32个 : auto double int struct break else long switchcase enum register typedef char extern return unionconst float short unsigned continue for signed voiddefault goto sizeof volatile do if while static 根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。1 数据类型关键字A基本数据类型(5个)void :声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果char :字符型类型数据,属于整型数据的一种int :整型数据,通常为编译器指定的机器字长float :单精度浮点型数据,属于浮点数据的一种double :双精度浮点型数据,属于浮点数据的一种B 类型修饰关键字(4个)short :修饰int,短整型数据,可省略被修饰的int。long :修饰int,长整形数据,可省略被修饰的int。signed :修饰整型数据,有符号数据类型unsigned :修饰整型数据,无符号数据类型C 复杂类型关键字(5个)struct :结构体声明union :共用体声明enum :枚举声明typedef :声明类型别名sizeof :得到特定类型或特定类型变量的大小D 存储级别关键字(6个)auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数extern :指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用”const :与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)volatile :与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值2 流程控制关键字A 跳转结构(4个)return :用在函数体中,返回特定值(或者是void值,即不返回值)continue :结束当前循环,开始下一轮循环break :跳出当前循环或switch结构goto :无条件跳转语句B 分支结构(5个)if :条件语句else :条件语句否定分支(与if连用)switch :开关语句(多重分支语句)case :开关语句中的分支标记default :开关语句中的“其他”分治,可选。C 循环结构(3个)for :for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件do :do循环结构,do 1 while(2); 的执行顺序是 1->2->1...循环,2为循环条件while :while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。

    评论|给力3不给力0说句实在话,如果你想依靠程序设计为今后工作打基础或者想从事程序设计方面的工作的话,现在已经晚了点了。

    如果你不想从事计算机工作,那么学这些也没有什么用,不会对你的毕业就业有什么作用。

    如果你是想从事计算机程序设计工作的话,你有几种现在可以选择的道路。

    1、学习简单的程序设计语言VB,然后学VB.net,这种计算机语言比较简单,学起来快,如果你C语言学的好的话,1个月就能把这些语言学的差不多,至少可以做点东西了。但现在需要VB人才的不多。

    2、学习C++/C#/Java,这些语言要的人多,但学习周期长,你想在短时间内学好,是不太现实的,如果你打算走这条路,那就要做好持久战的准备,毕业也未必能马上找到合适的工作。

    从我自己的角度来说,如果你学习C++的话,可能要学半年(我是在大学里自学的,花了半年,现在还在学,因为C++确实比想象的要复杂的多),光学C++是没有用的,你必须要会主流的编译器VC++或VS,当然还有别的选择,但就现在看,很多公司需要这些的。这个学习有牵涉到Windows程序设计、Win32 API、MFC,学习这些至少要2-3年,说实在的,这是个持久战,除非你不打算深入学习,如果是你也没有必要去学习C++。

    或许你可以学习Java或C#,这些在语法上和C比较类似,但他们是面向对象的,你没有这样的基础,学起来也可能要比较长的时间。

    说句实在的话,如果你对程序设计没有兴趣,或你不打算从事这个行业,呢就别学了,因为他对的今后的工作没有什么帮助。你要考虑的是你将来到底要干什么工作?你的发展方向是什么?毕业后是什么打算?学什么才对你未来发展有帮助?这些问题才是你的当务之急。

  • 满身青女味
    满身青女味

    要实现简单的二维动画,可以使用C语言结合图形库来实现。以下是一个简单的C语言实现二维动画的步骤:

    1. 引入图形库:首先需要引入支持图形绘制的库,比如使用graphics.h或者SDL库等。这些库提供了绘制图像的函数和绘图工具。

    2. 初始化图形环境:在程序的开始部分,需要初始化图形环境,创建一个窗口或者画布来进行图形绘制。

    3. 绘制图像:使用绘图函数来绘制你所想要的图像。可以使用直线、矩形、圆等基本的绘图函数,也可以自定义绘图函数来绘制复杂的图形。

    4. 更新图像:要实现动画效果,需要不断更新图像。可以使用循环来不断更新图像,每次更新都需要重新绘制图像。

    5. 控制动画速度:可以使用延时函数来控制动画的速度,让图像每次更新后停顿一段时间再进行下一次更新,从而形成动画效果。

    6. 清空画布:在每次更新图像之前,先清空之前的图像,可以使用清空函数或者重绘背景来清空画布。

    7. 终止图形环境:在程序结束之前,需要终止图形环境,关闭窗口或者释放资源。

    以上是实现简单二维动画的基本步骤,你可以根据具体的需求和图形库的使用说明,进行相应的编码实现。

  • HRnavy
    HRnavy

    要实现简单的二维动画,可以使用C语言的图形库来实现,比如使用Graphics.h库或者SDL库。

    1. 使用Graphics.h库:

    - 需要在C语言编译器中配置Graphics.h库。具体的配置方法可以根据使用的编译器而有所不同,可以通过搜索相关教程来配置。

    - 在程序中引入Graphics.h头文件。

    - 使用initgraph函数初始化图形环境,创建一个图形窗口。

    - 使用函数定义图形的基本元素,如线段、圆等。可以使用函数如line、circle等来实现。

    - 使用loop循环来重复绘制图形元素,产生动画效果。可以使用函数如delay、cleardevice等来控制动画的速度和清除窗口。

    - 使用closegraph函数关闭图形环境,释放资源。

    2. 使用SDL库:

    - 需要下载并安装SDL库,然后在程序中引入SDL相关的头文件。

    - 使用SDL_Init函数初始化SDL库。

    - 创建一个窗口并设置窗口的大小和属性,可以使用SDL_CreateWindow函数来实现。

    - 创建一个渲染器,可以使用SDL_CreateRenderer函数来创建。

    - 使用循环来更新渲染器中的内容,产生动画效果。可以使用函数如SDL_RenderClear、SDL_RenderDrawLine等来定义和绘制图形元素。

    - 使用SDL_RenderPresent函数来更新窗口中的内容,使动画变化可见。

    - 使用SDL_Delay函数来控制动画的速度。

    - 使用SDL_DestroyRenderer和SDL_DestroyWindow函数来销毁渲染器和窗口。

    - 使用SDL_Quit函数来退出SDL库。

    以上是两种实现简单二维动画的方法,具体选择哪个库来实现可以根据个人的需求和喜好来决定。

免费获取咨询

今日已有1243人获取咨询

免费咨询

最新问答

更多