给企业做网站运营,seo是一种利用搜索引擎的,网站搭建规划,上位机软件开发工具一、课程的总体目标和具体要求总体目标#xff1a;利用C语言和程序设计方法编制程序#xff0c;借助计算机解决问题的基本能力。(支撑毕业能力要求1)独立解决文本处理、数学上的一些问题#xff0c;编写较规范化的代码。(支撑毕业能力要求3)综合运用数学和程序设计方法…一、课程的总体目标和具体要求总体目标利用C语言和程序设计方法编制程序借助计算机解决问题的基本能力。(支撑毕业能力要求1)独立解决文本处理、数学上的一些问题编写较规范化的代码。(支撑毕业能力要求3)综合运用数学和程序设计方法设计有实用背景和一定规模的应用问题的解决方案可在较短计划时间内实现核心代码撰写实验报告。(支撑毕业能力要求3)选择、运用工具构建实验、项目并熟练进行程序编辑、调试、运行得到结果。(支撑毕业能力要求4)具体要求 1.了解和使用Turbo C和Visual C6.0的集成开发环境 2.理解C语言的程序结构 3.熟练掌握输入输出等交互方式 4.体会将待处理的问题转换为算法描述学会发现规律并编程实现 5.体会用计算机进行数学计算的特点 6.熟练掌握选择结构流程控制 7.熟练掌握不同的条件控制语句体会其应用方法 8.熟练掌握循环结构流程控制 9.熟练掌握选择结构与循环结构的嵌套 10.掌握一维数组和二维数组的定义、赋值和输入输出方法 11.掌握主要的数组有关的算法 12.学会进行矩阵运算 13.字符处理及字符数组的使用 14.掌握函数的定义与使用 15.理解函数的参数传递方式掌握函数传值及传址方法 16.掌握指针的概念和使用方法 17.比较指针操作与数组操作的一致性 18.体会指针在字符串操作中的应用 19.学习C语言中复杂数据类型的定义和使用方法 20.学习应用位运算 21.学会测试程序发现非语法方面的错误 22.学习考虑边界条件学习从用户角度思考问题 23.查找资料自学图形设计相关内容 24.完成有实用背景的应用程序的设计、编程、调试全过程并撰写实验报告二、实验环境计算机的硬件环境 目前各实验室使用的PC兼容机或品牌机均能满足该课的实验要求。 计算机的软件环境 在Windows 操作系统环境下使用Turbo C或Visual C6.0可视化程序语言。 Turbo C是一个常用的、最基本的C语言工具一般简称TC。它为C语言开发提供了操作便利的集成环境。源程序的输入、修改、调试及运行都可以在TC集成环境下完成非常方便有效。TC系统非常小巧但功能齐全。它主要支持DOS环境因此在操作中无法使用鼠标更多的需要通过键盘操纵菜单或快捷键完成。 C是一个面向对象的程序设计(OOP)语言是C语言的进一步发展已成为当今最流行的一种程序设计语言。Visual C6.0是Windows环境下最主要的应用开发系统之一它是C语言的集成开发环境也可以很好地进行C语言应用程序的开发。三、实验内容及主要设计思路、算法原理第一部分 基本程序1 第一天内容讲解内容 选择结构if语句、switch语句 循环结构while语句、do_while语句、for语句 函数函数的定义、函数说明、函数的调用。 重点讲解函数的设计思路。 练习内容1.1编写一个函数fun然后设计主函数调用函数fun。函数fun的功能是求两数平方根之和作为函数值返回。例如输入12和20输出结果为 y 7.936238。#include#includedouble fun(int m,int n){double s;ssqrt(m)sqrt(n);return s;}void main(){int a,b;printf(请输入两个要求平方根的数:);scanf(%d%d,a,b);printf(%lf,fun(a,b));}1.2编写一个函数fun然后设计主函数调用函数fun。函数fun的功能是计算正整数num的各位上的数字之积。例如若输入252则输出应该是20。若输入202则输出应该是0。#includeint fun(int x){int a1;while(x){a * (x % 10);x / 10;}return a;}void main(){int p;printf(请输入一个整数:);scanf(%d,p);printf(%d\n,fun(p));}1.3编写一个函数fun然后设计主函数调用函数fun。函数fun的功能是通过某种方式实现两个变量值的交换。例如变量a中的值原为5b中的值原为3程序运行后a中的值为3b中的值为5。#includevoid fun(int *a,int *b){int p;p*a;*a*b;*bp;}void main(){int x,y;printf(请输入要交换的两个数:);scanf(%d %d,x,y);printf(交换前:);printf(%d %d\n,x,y);fun(x,y);printf(交换后:);printf(%d %d\n,x,y);}1.4编写一个函数fun然后设计主函数调用函数fun。函数fun的功能是求出两个非零正整数的最大公约数(考虑递归和非递归两种方法,任选一种实现)并作为函数值返回。再设计一个函数函数的功能是计算两个非零正整数的最小公倍数。#includeint fun(int u,int v){int y,t,s;su*v;if(u{tu;uv;vt;}while(v){yu%v;uv;vy;}return u;}int fun_(int x,int y){return x*y/fun(x,y);}void main(){int x,y;printf(请输入两个数:);//求最大公因数与最小公倍数//scanf(%d %d,x,y);printf(最大公因数:);printf(MAX:%d\n,fun(x,y));printf(最小公倍数:);printf(min:%d\n,fun_(x,y));}5 用下述公式求π的近似值直到最后一项的绝对值小于指定的数(参数num)为止:Π/4≈1-1/3 1/5- 1/7…… 例如若输入值为0.0001则程序的输出3.1414。#include#includefloat fun(float num){int s;float n,t,pi;t1; pi0; n1; s1;while(fabs(t)num){pipit;nn2;s-s;ts/n;} pipi*4;return pi;}void main(){float n1,n2;/* clrscr ();*/printf(Enter a float number:);scanf(%f,n1);n2fun(n1);printf(%6.4f\n,n2);}2 第二天内容讲解内容:进制转换的基本设计思想循环结构程序设计的一般规律用程序实现数学表达的方法。 练习内容2.1请编写函数float fun(float x, int m)它的功能是将浮点数x保留m位小数(m不大于6)第m1位四舍五入。例如输入123.456保留2位小数应输出123.46(或123.459999)。#include#includedouble fun(double m,int n){m*pow(10,n);if(m-(int)(m)0.5)m;elsemm-(m-(int)(m));m(int)m/(double)pow(10,n);return m;}void main(){double m;int n;scanf(%lf,m);scanf(%d,n);printf(%lf,fun(m,n));}2.2请编写一个函数unsigned fun ( unsigned w ), w是一个大于10的无符号整数若w是n (n≥2)位的整数函数求出w的后n-1位的数作为函数值返回。#include#includeunsigned fun(unsigned w){int n0,t;int mw;while(w){n;tw;w/10;}wm-(t*pow(10,n-1));return w;}void main(){unsigned w;scanf(%d,w);fun(w);printf(%d,w);}2.3编写一个函数fun,函数fun的功能是从低位开始取出长整型变量s中偶数位上的数依次构成一个新数放在t中。例如当s中的数为7654321时t中的数为642.#include#includelong fun(long s){long n0,t1;long t;while(s){s/10;t1s%10;s/10;tt1*pow(10,n);n;}return t;}void main(){long s;scanf(%ld,s);printf(%ld,fun(s));}2.4将十进制正整数转换成k进制(2k9)数的数字输出。例如若输入8和2则应输出1000(即十进制数8转换成二进制表示1000)。#includeint main(){int a,b,c0,d1;scanf(%d,a);scanf(%d,b);for(;a!0;){cca%b*d;aa/b;dd*10;}printf(%d,c);return 0;}2.5求出1!、3!、5!、…、k!(k是小于9的奇数)。例如若k7则应输出 1.00000 6.00000 120.00000 5040.00000。#includevoid main(){double k,d,s1;printf(k是小于9的奇数:);scanf(%lf,k);while(k0){dk;s1;while(d){s*d;d--;}printf(%lf\n,s);k-2;}}2.6求 (此处a和n的值在1至9之间 表示由n个a组成的整数) 例如a2n6则以上表达式为 s222222-22222-2222-222-22-2 其和值是197532。#includevoid main(){int i,j,s0,t;int a,n;scanf(%d %d,a,n);for(i0;i{sa;aa*10;}ts;while(t){t/10;s-t;}printf(%d,s);}2.7编写一个函数float fun(float eps)它的功能是 根据如下公式计算e的值11/1!1/2!1/3!…1/n!… 其中的eps是指定的精度。#includefloat fun(float eps){float e1;float i,j,s1;for(i1;1/ieps;i){ij;while(j){s*j;j--;}e1/s;}return e;}void main(){float h;scanf(%f,h);printf(%f,fun(h));}2.8编写一个函数fun然后设计主函数调用函数fun。 函数fun的功能是统计不超过一个整数m(包括m且m3)的素数个数(不包括1和2)。#includeint fun(int s){int i,j,k;k0;for(i3;is;i){for(j2;j{if(i%j0)break;if(ji-1)k;}}return k;}void main(){int m;scanf(%d,m);printf(%d,fun(m));}3 第三天内容讲解内容指针的概念与运算、指针作函数的参数、一维数组的定义和引用、一维数组和指针的关系、字符数组作字符串变量、指向字符串常量的指针变量、字符串操作函数。重点讲解指针操作数组的思路。 练习内容3.1编写一个函数len其功能是计算出一个字符串中含有的所有字符个数(不使用库函数strlen)。#includeint len(char *s){int n0;while(*s){n;s;}return n;}void main(){char s[100];gets(s);printf(%d\n,len(s));}3.2编写函数fun函数的功能是计算一个字符串s中的所含有的指定字符的个数返回此值。 例如输入字符串Thisisastring被查找字符为’i’则应输出3。#includeint fun(char *s,char k){int n;n0;while(*s){if(*sk)n;s;}return n;}void main(){int s;char a[100],k;gets(a);scanf(%c,k);sfun(a,k);printf(%d,s);}3.3编写程序读入一个英文文本行将其中每个单词的第一个字母改成大写然后输出此文本行(这里的“单词”是指由空格隔开的字符串)。#include#includevoid main(){char a[100];int k,i;while(gets(a)){kstrlen(a);a[0]-32;for(i0;i{if(a[i] )a[i1]-32;printf(%c,a[i]);}printf(\n);}}3.4编写函数fun其功能是删除一个字符串中的所有空格。 例如输入字符串This is a string则应输出Thisisastring。#includevoid fun(char *s){char *p;while(*s){if(*s ){ps;while(*p){*p*(p1);p;}}elses;}}void main(){char a[100];gets(a);fun(a);puts(a);}3.5编写函数fun函数fun 的功能是将字符串a中的所有字符复制到字符串b中要求每复制三个字符之后插入一个空格。#includevoid fun(char *a,char *b){int i;while(*a){for(i0;i3;i){*b*a;if(*a\0)break;a;b;}while(*a!\0){*b ;b;break;}}}void main(){char a[100],b[100];gets(a);fun(a,b);puts(b);}3.6编写函数函数fun的功能是在字符串str中找出ASCII码值最大的字符将其放在第一个位置上并将该字符前的原字符向后顺序移动。#includevoid fun(char *p){char max;int i0,q;maxp[0];while(p[i]){if(max{maxp[i];qi;}i;}while(q){p[q]p[q-1];q--;}p[0]max;}void main(){char str[80];gets(str);fun(str);printf(移动后);puts(str);}3.7编写函数函数fun 的功能是首先把b所指字符串中的字符按逆序存放然后将a所指字符串中的字符和b所指字符串中的字符按排列的顺序交叉合并到c所指数组中过长的剩余字符接在c所指数组的尾部。 例如当a所指字符串中的内容为“abcdefg”b所指字符串中的内容为“1234”时c所指数组中的内容应该为“a4b3c2d1efg”而当a所指字符串中的内容为“1234”b所指字符串中的内容为“abcdefg”时c所指数组中的内容应该为“1g2f3e4dcba”。#include#includevoid fun(char *a,char *b,char *c){int i,j,n,k;int p;char t;k0;jstrlen(b)-1;for(i0;i{tb[i];b[i]b[j];b[j]t;j--;}j0;p0;nstrlen(a)strlen(b);for(i0;in;i){if(i%20){if(a[j]!\0){c[k]a[j];k;j;}if(a[j]\0){c[k]b[p];k;p;}}if(i%21){if(b[p]!\0){c[k]b[p];k;p;}if(b[p]\0){c[k]a[j];j;k;}}}}void main(){char a[100],b[100],c[100];gets(a);gets(b);fun(a,b,c);puts(c);}4 第四天内容讲解内容选择排序法、冒泡排序法、简单插入排序法和查找与替换方法。引导学生考虑设计高效的算法。 练习内容:4.1用选择排序法对数组a的元素从小到大排序。例如输入2 5 4 1 6 2 7 3 2 9 4则应输出1 2 2 2 3 4 5 6 7 9。 选择排序法采取如下思想对数组a的元素从小到大排序 将数组a的元素处理n-1次第k次处理时仅处理前n-k个元素方法是选择出这k个元素中的最大元素并将其与这些元素中的最后一个交换。当然也可以按每次选择最小元素的办法进行选择排序。# includevoid sort(int *a,int n){int i,j,t,m;for (i 0; i n - 1; i){m i;for (j i 1; j n; j)if ( *(aj)m j;if(i!m){t*(ai);*(ai)*(am);*(am)t;}}}void main(){int i,n,a[100];printf(请输入数组个数n:);scanf(%d,n);printf(请输入%d个元素:,n);for(i0;iscanf(%d,a[i]);sort(a,n);for(i0;iprintf(%-7d,a[i]);}4.2下述程序中函数fun的功能是用冒泡法对6个字符串按由小到大的顺序进行排序。 冒泡排序基本思路所谓“冒泡排序”也称“起泡排序”或者“气泡排序”是指这样的一种简单排序方法若被排序的数组元素个数为N可以对此数组做N-1次处理。 在第k次(k0, 1, …, N-1)处理时需比较前N-k个元素方法是连续从前到后比较相邻的两个元素如果后面的元素小于前面的元素则将二者交换否则不变。 可见每经过一次处理至少此次被处理的N-k个元素中的最大元素被移到了本次处理的最后位置而N-1次处理后就使所有的元素被排序。#include #include #include int maopao(int *a,int size){int i,j,t;if(size 0) return -1;if(a NULL ) return -1;for(i0;i{for(j0;j{if(a[j] a[j1]){t a[j] ;a[j] a[j1];a[j1] t;}}}return 0;}int main(int argc, const char *argv[]){int i ,ret,b[10]{0};printf(从终端输入10个数:);for(i0;i10;i){scanf(%d,b[i]);}printf(数组的内容:);for(i0;i10;i){printf(%4d,b[i]);}printf(\n);printf(数组升序排列后:);ret maopao(b,10);if(ret 0 ){printf(maopao is error\n);exit(-1);}for(i0;i10;i){printf(%4d,b[i]);}printf(\n);return 0;}4.3编写函数fun函数fun的功能是利用插入排序法对字符串中的字符按从小到大的顺序进行排序。 插入法的基本算法思路是先对字符串中的头两个元素进行排序。然后把第三个字符插入到前两个字符中插入后前三个字符依然有序再把第四个字符插入到前三个字符中……。待排序的字符串已在主函数中赋值。#include#include#define N 80void fun(char *a){int i,j,n;char ch;nstrlen(a);for(i1;i{cha[i];ji-1;while((j0)(ch{a[j1]a[j];j--;}a[j1]ch;}}void main(){char a[N];gets(a);fun(a);puts(a);}4.4编写一个函数其功能是统计一个子字符串在另一个字符串中出现的次数。例如假定输入的字符串为this is a string子字符串为is则应输出2。 设计思路⑴分析参数与返回值。本例中函数fun的参数的含义为母字符串str和子字符串sub。该函数需要统计子字符串出现的个数返回值是int类型必然是统计后所得的出现次数值观察main函数中的输出也能肯定这一点。⑵整理编程思路。编写该函数需要使用一个循环循环中可以考虑通过一个字符类型的指针在str中由前到后移动每次移动一个字符位且将目前指针位置开始的m个字符与sub所包含的全部m个字符比较(假定sub的长度是m)若二者相同则说明子字符串在母字符串中出现一次进行累计否则不累计。无论如何将指针再移到下一个字符位进行下一次循环比较。⑶细节考虑。首先为了实现两组m个字符的比较一个可行的办法是写一个函数来实现但程序不允许再编写其它函数只能使用库函数或自己构成循环。能够使用的库函数是定义在string.h中的strstr其函数原型如下 char* strstr(char* str, char* sub)#includeint fun(char *a,char *b){char *p;int n0;while(*a){pb;if(*a*p){while(*a*p){a;p;if(*p\0){n;}}}else{a;}}return n;}void main(){char a[100],b[20];gets(a);gets(b);printf(%d\n,fun(a,b));}4.5N个有序整数数列已放在一堆数组中。下述程序中的函数fun的功能是利用折半查找算法查找整数m在数组中的位置。若找到返回其下标值反之返回-1 折半查找设计思想折半查找也称为二分查找或二分检索其基本思想是在一个数组中查找某个值m是否存在时每次查找前先确定数组中待查的范围low和hitgh (low high查找结束。#includeint fun(int *s,int m){int low0,high,mid;highsizeof(s)/2;mid(lowhigh)/2;while(1)if(ms[mid]){lowmid1;mid(lowhigh)/2;}elseif(m{highmid-1;mid(lowhigh)/2;}else{return mid;}return -1;}void main(){int a[100];int b,i;for(i0;i10;i)scanf(%d,a[i]);scanf(%d,b);printf(%d,fun(a,b)); }4.6请编写函数int* fun(char* st)其中st是仅由字符a、b和c组成的字符串。 函数的功能是统计字符串st中’a’、’b’和’c’的个数并分别存入不同的内存区带回内存区的首地址。#includeint* fun(char *st,int a[3]){while(*st){if(*sta){a[0];}if(*stb){a[1];}if(*stc){a[2];}st;}return a;}void main(){char a[100];int b[3]{0,0,0};int i;int *p;gets(a);pfun(a,b);for(i0;i3;i)printf(%d,,*p);}5 第五天内容讲解内容二维数组的定义、引用与初始化、二维数组与指针的关系(二维数组的一维表示、对二维数组的约定、指向一维数组的指针变量、二维数组作函数的参数和用二维数组操作字符串)。 练习内容5.1将数组x的元素倒置输出。例如若输入1 2 3 4 5则应输出5 4 3 2 1。#includevoid main(){int i,n,a[10];printf(请输入数组个数);scanf(%d,n);printf(请输入数组:);for(i0;iscanf(%d,a[i]);for(in-1;i0;i--)printf(%2d,a[i]);}5.2请编写函数void fun ( int aa[ ], int x, int *n )它的功能是删除数组aa中所有与x相等的元素数组元素个数由n传入。#includevoid fun(int aa[],int x,int *n){int i,j;for(i0;i{if(aa[i]x){for(ji;jaa[j]aa[j1];(*n)--;i--;}}}void main(){int a[100],x;int n,i;printf(请输入数组元素个数);scanf(%d,n);printf(请输入数组);for(i0;iscanf(%d,a[i]);printf(请输入删除的元素);scanf(%d,x);fun(a,x,n);for(i0;iprintf(%2d,a[i]);}5.3请编函数void fun(int *a, int *b)它的功能是求出1到100之内被7或11整除的所有整数放在数组a中通过n返回这些数的个数。#include void fun(int *a, int *b){int i;for (i 1; i 100; i)if (i%70 || i%110){*ai;a;(*b);}}int main(){int i,n0;int m[100];fun(m,n);printf(%d\n,n);for(i0;iprintf(%d,m[i]);return 0;}5.4编写函数int fun (int lim, int aa[MAX] )该函数的功能是求出小于lim的所有素数并放在aa数组中该函数返回所求出素数的个数。然后编写主函数调用它。#includeint fun(int lim,int aa[100]){int i,MAX0,j;for(i0;ilim;i){for(j2;j{if(i%j0)break;if(ij1){aa[MAX]i;MAX;}}}return MAX;}void main(){int lim,aa[100];scanf(%d,lim);printf(%d,fun(lim,aa));}5.5输入一个3行3列矩阵的所有元素然后输出对角线元素之和。#includevoid main(){int a[3][3];int i,j,s0;for(i0;i3;i)for(j0;j3;j){scanf(%d,a[i][j]);}for(i0;i3;i){sa[i][i];}printf(%d,s);}5.6编写函数其功能是实现矩阵(3行3列)的转置(即行列互换)。#includevoid main(){int a[3][3],i,j;for(i0;i9;i)scanf(%d,a[0][0]i);printf(原矩阵:\n);for(i0;i9;i){ printf(%2d,a[0][0]i);if(i%32)printf(\n);}printf(转置后矩阵:\n);for(i0;i3;i){for(j0;j3;j){ printf(%2d,a[j][i]);if(j2)printf(\n);}}}6 第六天内容讲解内容递归函数、动态内存管理、结构体类型的定义、结构体变量的定义、结构体变量的成员、整体引用结构体、结构体数据在函数间传递、结构体变量的初始化、结构体数组、结构体指针、单链表。重点讲解链表。 练习内容6.1请编写函数int fun(double a[ ], int k, int m, double x)它的功能是用递归方法在数组a中查找x是否出现其中数组a的元素已按由大到小的次序排序k和m是数组的最小和最大下标函数采用二分查找算法若找到则返回1否则返回0。#include#includetypedef struct node{int data;struct node *next;}NODE;#define LEN sizeof(NODE)NODE *setup( ){NODE *head NULL, *p1,*p2;int n 0;p2 (NODE *)malloc(LEN);p1 p2;scanf(%d,p1-data);while(p1-data){n;if(n1){head p1;}else{p2-next p1;p2 p1;}p1 (NODE *)malloc(LEN);scanf(%d,p1-data);}p2-next NULL;return head;}int main(){NODE *p;p setup();while (p){printf(%d, p-data);p p-next;}}6.2用递归法将一个整数n转换成字符串。例如输入整数483应输出字符串“483”。#includevoid fun(int n){if(n/100){putchar(0n%10);}else{fun(n/10);putchar(0n%10);}}void main(){int m;scanf(%d,m);fun(m);}6.3编写一个函数函数fun的功能是输入一个整数x计算x的平方和立方。 例如输入10则应输出a10 a2100 a31000。#includevoid fun(int s){int i,a[2];a[0]s*s;a[1]s*s*s;for(i0;i2;i)printf(%d\n,a[i]);}void main(){int s;scanf(%d,s);fun(s);}6.4学生的记录由学号和成绩组成N名学生的数据已在主函数中放入结构体数组s中请编写函数fun它的功能是把分数最低的学生数据放在h所指的数组中 注意分数最低的学生可能不止一个函数返回分数最低的学生的人数。#include#define N 3typedef struct Stu{char xuehao[10];int score;} Stu;int fun (Stu *s, Stu * h){Stu min;min s[0];int i,c0;for (i 0; i N; i){if (min.score s[i].score)min s[i];}for (i 0; i N; i){if (s[i].score min.score){*(h c) s[i];c;}}return c;}int main (){Stu s[N] { {181203101, 97}, {181203102, 96}, {181203103, 98} };Stu h[N];int num,i;num fun (s, h);printf (The number is: %d\n, num);for(i0;i{printf(%s %4d\n,h[i].xuehao,h[i].score);}}6.5建立一个单向链表链表中的每个结点有一个int类型的数据域输入0时标志链表建立过程结束。 例如输入1 2 3 4 0则应输出1,2,3,4,。#include#includetypedef struct node{int data;struct node *next;}NODE;#define LEN sizeof(NODE)NODE *setup( ){NODE *head NULL, *p1,*p2;int n 0;p2 (NODE *)malloc(LEN);p1 p2;scanf(%d,p1-data);while(p1-data){n;if(n1){head p1;}else{p2-next p1;p2 p1;}p1 (NODE *)malloc(LEN);scanf(%d,p1-data);}p2-next NULL;return head;}int main(){NODE *p;p setup();while (p){printf(%d, p-data);p p-next;}}第二部分 实用程序设计讲解内容采用c语言进行图形设计的方法和思路。 本部分包含了图形应用程序Turbo C中提供了对图形支持在c环境中通过安装插件实现对标准c图形设计方式的支持采用c环境的同学查找相应插件并完成安装之后采用Turbo C同样的方式完成应用程序设计。 图形系统的有关信息和函数原型都定义于graphics.h中。 1、 初始设置 为了使屏幕能够显示图形首先要调用initgraph()函数进行初始化该函数有三个参数分别对应显示器模式、分辨率、驱动程序路径。 例如#include /图形函数/ …… int GraphDriver DETECT,GraphMode0; /* DETECT表示自动检测显示器*/ initgraph(GraphDriver,GraphMode,) ; /空串表示在当前路径下查找驱动程序/ …… closegraph(); 结束图形程序时应调用closegraph()函数释放为图形系统分配的资源回到字符模式。 可以调用视口函数setviewport在屏幕上开辟一块区域建立一个新的视口。 2、 颜色与填充 前景色设置函数setcolor(int color); 背景色设置函数setbkcolor(int color) 区域填充函数setfillstyle(int patternint color) 例如:setbkcolor(WHITE); setcolor(BLUE); setfillstyle(SOLID_FILL, RED); 3、 基本绘图函数 画直线函数line() 画圆函数circle() 画弧函数arc() 画矩形函数rectangle() 画多边形函数drawpoly()以及fillpoly()后者为带填充的多边形。 设置线宽函数setlinestyle() 4、 在图形模式下输出文本 文本输出模式设置函数settextstyle() 文本输出函数outtext() 在指定位置输出文本outtextxy() 要求所有同学通过自学查找和掌握完成任务所需函数用法。 实验内容(下述内容任选其一)1时钟模拟程序设计设计目标设计一个时钟表盘能及时读取系统的时间并根据当前时间计算并绘制出在时钟表盘上时钟时针、分针和秒针的具体位置形成时钟运转动画。 设计思路参考 (1)以圆形、椭圆或矩形等绘制时钟边框设计时钟指针图形(如采用不同宽度、颜色和长度的直线分别代表时针、分针、秒针)。 (2)读取系统时间转换为时钟时针、分针、秒针当前位置在屏幕上画出时钟指针分别计算时针、分针、秒针移动一次所转动的角度并据此分别计算下一个位置的坐标按各自的时间间隔刷新时钟指针位置。 (3)以图形或文本方式完成时钟表盘数字绘制并添加自己设计的个性化元素美化实现效果。#include pch.h#include #include #include #define PI 3.141592654void Draw_Dial();void Draw_Hand(int hour, int minute, int secend);int main(){initgraph(640, 480);Draw_Dial();setwritemode(R2_XORPEN);SYSTEMTIME time;while (!_kbhit()){GetLocalTime(time);Draw_Hand(time.wHour, time.wMinute, time.wSecond);Sleep(1000);Draw_Hand(time.wHour, time.wMinute, time.wSecond);}closegraph();return 0;}void Draw_Dial(){setcolor(GREEN);circle(320, 240, 160);circle(320, 240, 60)circle(320, 240, 2);setcolor(WHITE);int x, y;for (int i 0; i 60; i){x 320 int(145 * sin(PI * 2 * i / 60));y 240 int(145 * cos(PI * 2 * i / 60));if (i % 15 0)bar(x - 5, y - 5, x 5, y 5);else if (i % 5 0)circle(x, y, 3);elseputpixel(x, y, WHITE);}}void Draw_Hand(int hour, int minute, int second){double h_hour, h_minute, h_second;int x_hour, y_hour, x_minute, y_minute, x_second, y_second;h_second second * 2 * PI / 60;h_minute minute * 2 * PI / 60 h_second / 60;h_hour hour * 2 * PI / 12 h_minute / 12;x_second int(120 * sin(h_second)); y_second int(120 * cos(h_second));x_minute int(100 * sin(h_minute)); y_minute int(100 * cos(h_minute));x_hour int(70 * sin(h_hour)); y_hour int(70 * cos(h_hour));setlinestyle(PS_SOLID, 2);setcolor(RED);line(320 x_second, 240 - y_second, 320 - x_second / 3, 240 y_second / 3);setlinestyle(PS_SOLID, 6);setcolor(YELLOW);line(320 x_minute, 240 - y_minute, 320 - x_minute / 5, 240 y_minute / 5);setlinestyle(PS_SOLID, 7);setcolor(GREEN);line(320 x_hour, 240 - y_hour, 320 - x_hour / 5, 240 y_hour / 5);}2. 五子棋对战游戏设计设计目标实现利用计算机评判两个人五子棋比赛游戏、用C语言提供的图形库函数实现绘制五子棋棋盘实现五子棋规则评判算法。 设计思路参考(A)五子棋对战游戏规则(1)对局双方各执一色棋子。 (2)空棋盘开局。 (3)黑先、白后交替下子每次只能下一子。 (4)棋子下在棋盘的空白点上棋子下定后不得向其它点移动不得从棋盘上拿或拿起另落别处。 (5)黑方的第一枚棋子可下在棋盘任意交叉点上。 (6)当有一方先在行、列、或者斜线上连续下出连续5个棋子可以判定为胜局。(B)游戏的基本流程为启动游戏显示游戏参数设置界面用户输入参数后进入游戏界面显示棋盘及双方博弈过程游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏可选择继续下一局或者退出游戏。(C)设计实现思路及步骤(1)游戏参数设置。定义游戏各项参数如博弈双方用户名背景色先手方。 (2)棋盘绘制 棋盘设计为19×19矩形网格设置背景颜色设置棋盘网格线颜色光标的初始位置在棋盘中间。游戏界面显示博弈双方名称和执子颜色显示当前执子方。 (3)棋子绘制 设计黑白两色圆形棋子做颜色填充可以设计棋子大小。采用二维数组W[L][R]存储,数组的每个元素对应一个网格交叉点。每个数据元素的取值范围可定义为3个数值分别代表3种状态空白、落黑子、落白子。 (4)落子 两色棋子轮流落子。用户单击鼠标(或按键)将光标移至空白的网格交叉点后再次单击(或按键)同一位置落子落子后切换当前执子方。限制光标位置位于棋盘网格内。除了鼠标外落子方式也可选用按键操作如棋手1用Up、Down、Left、Right控制光标移动回车键表示落子。棋手2用W、S、A、D控制光标移动空格键表示落子。一旦接收到回车键或空格键说明棋手落子先判断是否是有效位置也就是说已经有棋子的位置不能重叠落子 (5)输赢判定 落子成功后马上判断以该位置为中心的八个方向上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子如果连成五子则游戏结束输出相应的信息。如果想退出游戏可以按Esc键。#include #include #include #include #define MAXIMUS 15 //定义棋盘大小int p[MAXIMUS][MAXIMUS]; //存储对局信息char buff[MAXIMUS*21][MAXIMUS*43]; //输出缓冲器int Cx,Cy; //当前光标位置int Now; //当前走子的玩家1代表黑2代表白int wl,wp; //当前写入缓冲器的列数和行数位置char* showText; //在棋盘中央显示的文字信息int count;//回合数char* Copy(char* strDest,const char* strSrc) //修改过的字符串复制函数会忽略末端的\0{char* strDestCopy strDest;while (*strSrc!\0){*strDest*strSrc;}return strDestCopy;}void Initialize() //初始化一个对局函数{int i,j; //循环变量showText; //重置显示信息count0; //回合数归零for(i0;i{for(j0;j{p[i][j]0;}}CxCyMAXIMUS/2; //重置光标到中央Now1; //重置当前为黑方}char* getStyle(int i,int j) //获得棋盘中指定坐标交点位置的字符通过制表符拼成棋盘{if(p[i][j]1) //1为黑子return ●;else if(p[i][j]2) //2为白子return ○;else if(i0j0) //以下为边缘棋盘样式return ┏;else if(iMAXIMUS-1j0)return ┓;else if(iMAXIMUS-1jMAXIMUS-1)return ┛;else if(i0jMAXIMUS-1)return ┗;else if(i0)return ┠;else if(iMAXIMUS-1)return ┨;else if(j0)return ┯;else if(jMAXIMUS-1)return ┷;return ┼; //中间的空位}char* getCurse(int i,int j){ //获得指定坐标交点位置左上格的样式通过制表符来模拟光标的显示if(iCx){if(jCy)return ┏;else if (jCy1)return ┗;}else if(iCx1){if(jCy)return ┓;else if (jCy1)return ┛;}return ; //如果不在光标附近则为空}void write(char* c) //向缓冲器写入字符串{Copy(buff[wl]wp,c);wpstrlen(c);}void ln() //缓冲器写入位置提行{wl1;wp0;}void Display() //将缓冲器内容输出到屏幕{int i,lstrlen(showText); //循环变量中间文字信息的长度int OffsetMAXIMUS*22-l/2; //算出中间文字信息居中显示所在的横坐标位置if(Offset%21) //如果位置为奇数则移动到偶数避免混乱{Offset--;}Copy(buff[MAXIMUS]Offset,showText); //讲中间文字信息复制到缓冲器if(l%21) //如果中间文字长度为半角奇数则补上空格避免混乱{*(buff[MAXIMUS]Offsetl)0x20;}system(cls); //清理屏幕准备写入for(i0;iprintf(%s,buff[i]);if(iprintf(\n);}}void Print() //将整个棋盘算出并储存到缓冲器然后调用Display函数显示出来{int i,j; //循环变量wl0;wp0;for(j0;jMAXIMUS;j) //写入出交点左上角的字符因为需要打印棋盘右下角所以很以横纵各多一次循环{for(i0;iMAXIMUS;i){write(getCurse(i,j)); //写入左上角字符if(j0||jMAXIMUS) //如果是棋上下盘边缘则没有连接的竖线用空格填充位置{if(i!MAXIMUS)write( );}else //如果在棋盘中间则用竖线承接上下{if(i0||iMAXIMUS-1) //左右边缘的竖线更粗write(┃);else if(i!MAXIMUS) //中间的竖线write(│);}}if(jMAXIMUS) //如果是最后一次循环则只需要处理边侧字符交点要少一排{break;}ln(); //提行开始打印交点内容write( ); //用空位补齐位置for(i0;i{write(getStyle(i,j)); //写入交点字符if(i!MAXIMUS-1) //如果不在最右侧则补充一个横线承接左右{if(j0||jMAXIMUS-1){write(━); //上下边缘的横线更粗}else{write(—); //中间的横线}}}ln(); //写完一行后提行}Display(); //将缓冲器内容输出到屏幕}int Put(){ //在当前光标位置走子如果非空则返回0表示失败if(p[Cx][Cy]0){p[Cx][Cy]Now; //改变该位置数据return 1; //返回1表示成功}else{return 0;}}int Check() //胜负检查即判断当前走子位置有没有造成五连珠的情况{int w1,x1,y1,z1,i; //累计横竖正斜反邪四个方向的连续相同棋子数目for(i1;i5;i)if(Cyifor(i1;i5;i)if(Cy-i0p[Cx][Cy-i]Now)w;else break; //向上检查if(w5)return Now; //若果达到5个则判断当前走子玩家为赢家for(i1;i5;i)if(Cxifor(i1;i5;i)if(Cx-i0p[Cx-i][Cy]Now)x;else break; //向左检查if(x5)return Now; //若果达到5个则判断当前走子玩家为赢家for(i1;i5;i)if(Cxifor(i1;i5;i)if(Cx-i0Cy-i0p[Cx-i][Cy-i]Now)y;else break;//向左上检查if(y5)return Now; //若果达到5个则判断当前走子玩家为赢家for(i1;i5;i)if(Cxi0p[Cxi][Cy-i]Now)z;else break; //向右上检查for(i1;i5;i)if(Cx-i0Cyiif(z5)return Now; //若果达到5个则判断当前走子玩家为赢家return 0; //若没有检查到五连珠则返回0表示还没有玩家达成胜利}int RunGame() //进行整个对局返回赢家信息(虽然有用上){int input; //输入变量int victor; //赢家信息Initialize(); //初始化对局while(1){ //开始无限回合的死循环直到出现胜利跳出Print(); //打印棋盘inputgetch(); //等待键盘按下一个字符if(input27) //如果是ESC则退出程序{exit(0);}else if(input0x20) //如果是空格则开始走子{if(Put()) //如果走子成功则判断胜负{victorCheck();Now3-Now; //轮换当前走子玩家count;if(victor1) //如果黑方达到胜利显示提示文字并等待一次按键返回胜利信息{showText黑方获得了胜利;Print();if(getch()0xE0){getch();}return Now;}else if(victor2) //如果白方达到胜利显示提示文字并等待一次按键返回胜利信息{showText白方获得了胜利;Display();if(getch()0xE0){getch();}return Now;}else if(countMAXIMUS*MAXIMUS) // 如果回合数达到了棋盘总量即棋盘充满即为平局{showText平局;Display();if(getch()0xE0){getch();}return 0;}}}else if(input0xE0) //如果按下的是方向键会填充两次输入第一次为0xE0表示按下的是控制键{inputgetch(); //获得第二次输入信息switch(input) //判断方向键方向并移动光标位置{case 0x4B://Cx--;break;case 0x48:Cy--;break;case 0x4D:Cx;break;case 0x50:Cy;break;}if(Cx0)CxMAXIMUS-1; //如果光标位置越界则移动到对侧if(Cy0)CyMAXIMUS-1;if(CxMAXIMUS-1)Cx0;if(CyMAXIMUS-1)Cy0;}}}int main() //主函数{system(title 简易五子棋 ——); //设置标题system(mode con cols63 lines32); //设置窗口大小system(color B1); //设置颜色while(1){ //循环执行游戏RunGame();}}3. 计算器程序的设计设计目标实现一个计算器功能的程序。能够用C语言提供的图形库函数绘制计算器界面、基本的运算程序、计算界面数据数据、运算符定位和刷新功能。 设计思路参考 (1)初始化图形系统定义视口确定计算器在屏幕中的位置。 (2)以矩形等形状画出计算器外形设计计算各按钮位置及输出区域位置和效果将表示数字和运算符的符号以文本显示在对应按钮位置接收输入判断其内容是否合法并给出提示若合法将对应信息显示在输出区域 (3)当输入为“等号”时计算结果并将结果显示在输出口。 实现计算函数部分的伪程序如下(入口(left,top)左上角坐标。出口最后一次计算的结果。) double Computer(intleft,int top) { 核对屏幕位置是否可容纳缺省的计算器尺寸; 保存计算器占用的屏幕画面; 画出计算器外形; do { char str1[len],str2[len]; /两个数对应的串/ char popstr[长度]; /可存两串及一个运算符的数组/ double Data1,Data2; /由串转换后的两个数/ int Flag0; /输入的数据个数Flag2时计算/ char oper; /运算符/ oper接收按键; if(oper是09字符) if(在数据的限定长度内) 将oper写入popstr; else 不处理或响铃; else if(oper是非法字符) 不处理或响铃; else /oper是运算符、或为、或为/ { if(operEsc) 中止并返回0; else{ 测试popstr中的字符串; if(是形式) { 计算结果并显示; if(输入为运算符) { strcpy(popstr,计算结果串); 将oper写入popstr;}} else if(是形式) 将oper写入popstr; else 不处理或响铃;} }}while(终止条件); return 最后计算结果;}#includevoid main(void){//简易计算机的设计int c1;float operationA0;float operationB0;int isContinue1;while(isContinue){printf(请选择你要进行的运算类型1加法2减法3乘法4除法\n);scanf(%d,c);printf(请输入第一个运算数字:\t);scanf(%f,operationA);printf(请输入第二个运算数字:\t);scanf(%f,operationB);if(c1){printf(%f %f %f\n,operationA,operationB,operationAoperationB);}else if(c2){printf(%f - %f %f\n,operationA,operationB,operationA-operationB);}else if(c3){printf(%f * %f %f\n,operationA,operationB,operationA*operationB);}else if(c4){while(operationB0){printf(除数不能为零请重新输入第二个数);scanf(%f,operationB);}printf(%f / %f %f\n,operationA,operationB,operationA/operationB);}else{printf(请正确选择运算);}printf(\n\n);printf(你是否还要继续进行运算是1 ? ?否0 \n);scanf(%d,isContinue);if(isContinue0){isContinue0;}}printf(欢迎使用本计算机);}4其它自选程序——扫雷#include#include#include#include#include#define SIZE 10#define N 35char mine[12][12]{{0}};int step65;void gotoxy(int x,int y)//坐标函数{COORD pos ;pos.X x ;pos.Y y ;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE) , pos) ;}void color(int a)//颜色函数{HANDLE hConsole GetStdHandle((STD_OUTPUT_HANDLE)) ;SetConsoleTextAttribute(hConsole,a) ;}void init_mine()//初始化{int count,x,y;for(count0;count{xrand()%101;yrand()%101;if(!mine[y][x]){mine[y][x]1;count;}}gotoxy(3,0);for(x1;xSIZE;x)//设置行标号{color(13);printf(%d ,x);}for(x1;xSIZE;x)//设置列标号{gotoxy(0,x);printf(%d ,x);}for(y1;ySIZE;y)//初始化雷区{gotoxy(2,y);for(x1;xSIZE;x){color(11);printf(□);}}gotoxy(45,0);//设置文字提示color(12);printf(扫雷-);color(14);gotoxy(0,11);printf( Input the position ( x , y )\n\n);color(11);printf( Notice when x0 and y0,the game is over!!!!);}void show_mine(int x,int y){int num;if(mine[y][x])//踩雷了{color(11);gotoxy(x*2,y);printf(●);gotoxy(22,10);for(y1;y11;y)for(x1;x11;x){gotoxy(x*2,y);if(mine[y][x])printf(●);else{nummine[y1][x]mine[y1][x1]mine[y1][x-1]mine[y][x1]mine[y][x-1]mine[y-1][x]mine[y-1][x1]mine[y-1][x-1];printf(%d ,num);}}printf(踩中雷区阵亡请再接再厉!!!);exit(0);}else//未踩雷{nummine[y1][x]mine[y1][x1]mine[y1][x-1]mine[y][x1]mine[y][x-1]mine[y-1][x]mine[y-1][x1]mine[y-1][x-1];gotoxy(x*2,y);printf(%d ,num);gotoxy(53,9);printf(%d,--step);}}main(){ char x,y,x1,y1;x1 c;init_mine(); 初始化游戏界面埋雷初始化显示等gotoxy(23,11); //移动光标到坐标2321for(x0,y0;x1 !0||y1 !0;){Sleep(1000); //延时if(kbhit())//输入坐标{gotoxy(23,11);scanf(%d,x1);gotoxy(27,11);scanf(%d,y1);gotoxy(23,11);printf((x , y ) );}if(x1 0 x1 11 y10 y111( x!x1 || y!y1)){yy1;xx1;show_mine(x,y); //检测有没有踩雷如果踩雷显示雷如果没有显示周围雷的个数}if(!step){gotoxy(10,5);printf(真棒您赢了);exit(0);}}exit(0);}