跳到正文

【C语言资料进阶】分享自己收集整理的计算机二级资料笔记

全国计算机二级C语言等级考试 2016.1.23日晚22:00 数据类型的转换 #include double fun(double e) { int i, k; double s, t, x; s=0; k=1; i=2; /**********found**********/ x=3.0/4;//需要转换成double类型 /**********found**********/ while(x > e)//注意10~-3 = e { s=s+k*x;//求和项 k=k* (-1);//每项的正负 t=2*i;//分母 /**********found**********/ x=(t+1)/(t*t); i++; } return s; } main() { double e=1e-3; printf("\nThe result is: %f\n",fun(e)); } 二维数组的大小比较 #include # define M = 4; Int compare(int a) { Int I, j, max = a; For(I = 0; i<2; i++) { For(j = 0; j =eps) { S1 = s1*n/(2*n + 1); S = s + s1; n++; } Return (2*s); } 2016.1.29日晚22:00 #include void fun(char *s, int *t) { int i, n; n=0; /**********found**********/ for(i=0; s !=0; i++) /**********found**********/ if(s>='0'&&s<= '9') n++;//数字字符是 0 - 9 /**********found**********/ *t = n;//将n的值赋给t所指向的内存空间 } main() { char s="abcdef35adgh3kjsdf7"; int t; printf("\nThe original string is : %s\n",s); fun(s,&t); printf("\nThe result is : %d\n",t); } #include void fun (int *a, int *n) { int i, j; for(i = 1; i<1000; i++) { if (i % 7 == 0 || i % 11 == 0 && i % 77 != 0) { a = i;//把符合条件的i放在数组里面 *n = j; // i++; 这里error // i++; // n++;//计算属于条件的个数 // a = a; } } } main( ) { int aa, n, k ; void NONO ( ); fun ( aa, &n ) ; for ( k = 0 ; k < n ; k++ ) if((k + 1) % 10 == 0) printf("\n") ; else printf("%5d", aa) ; } 2016.1.30日晚22:00 求最大公约数 #include int fun(int a,int b) { int r,t; if(a void fun (int *a, int *n) { int i,j; char s; for(i=0; i == '\0'; i++) if(a != '*') { s = a; } } 字符串的删除 #include void fun( char *a ) { //注意附一个初始值 int i,j = 0; //char s; error for(i=0; a != '\0'; i++)//注意这里的判别条件 if(a != '*') { a = a; } a = '\0';//字符串以‘\0’结尾 } 取余操作 #include unsigned long fun(unsigned long n) { unsigned long x=0; int t; while(n) { t=n%10; /**********found**********/ if(t%2==0) /**********found**********/ x=10*x + t;//将t作为x的个位数,原来x的各个位上升1位,即x=10*x+1 /**********found**********/ n=n / 10;//每循环一次,通过除法运算,去掉数值最后一位。 } //如果知道某数n的各个位的数值,可以得到该数值n, //如n的个位为a、十位为b、百位为c,那么n=c*100+b*10+a。 //如果知道数值n,可以采用求余和除法操作来表示其各个位, //如n%10(取个位)、n/10(取十位), 【三位数】n = c*100 + b*10 + a 【四位数】n = d*100 + c*100 + b*10 + a 取个位十位百位数 个位:a = n % 10; 两位数 十位:b =n/10; 个位:a = n%10三位数 十位:b = n 百位:c = n/100; return x; } 2016.1.31日晚21:00 *t = 0;//error 这里应该给t所指向的内存空间里赋一个初值 while ( s > 0) { d = s%10; /************found************/ if (d%2 == 1)//判断是否为奇数 { *t = d * sl + *t; //把t所指向的内存空间的值不断赋给新位 sl *= 10; } s /= 10; //删除最后一位 } 字符串的插入 int i, j;//逐个遍历两个数组 for(i=0; p1 != '\0'; i++);//这里只循环,不做其他操作,通过i值可以知道字符串结束的位置 for(j=0; p2 != '\0'; j++) p1 = p2;//赋值完成之后,让p1的下标后移一位 p1 = '\0'; 【注意】 //第1个循环的作用是求出第1个字符串的长度, //即将i指到第1个字符串的末尾。 //第2个循环的作用是将第2个字符串的字符连到第1个字符串的末尾。 //最后在第1个字符串的结尾加上字符串结束标识′\0′。 最大值最小值数组元素的筛选 void fun(int a, int n) { int i,j, max, min, px, pn, t; for (i=0; ia) { min = a; pn = j; } } if (pn != i) { t = a; a = min; a = t; if (px == i) px =pn; } if (px != i+1) { t = a; a = max; a = t; } } } 斐波拉契数列的算法实现 #include long fun(int g) { /**********found**********/ switch(g); //waring!!! error//注意switch语句的写法 switch() {} 注意switch()之后不能有符号 switch(g) //true { case 0: return 0; /**********found**********/ case 1 ;case 2 : return 1 ;//error case 1 :case 2 : return 1 ;//在第一项和第二项的的结果都是1 } return( fun(g-1)+fun(g-2) ); } 结构体计算成绩平均值,总和 结构体类型成员运算,指向结构体类型的指针变量作函数参数 #include #define N 8 typedef struct { char num; double s; double ave; } STREC; void fun(STREC *a)//通过结构体变量参数可以获取相应的结构体成员变量 { int i; a->ave = 0.0;//注意这里是double类型,指针类型的结构体不要用“.”,要尽量用“->” for(i=0; iave = a->ave + a->s;//a->ave现在保存了数组元素中各们成绩之和之和 // a->ave = a->ave/N;//error!!!求其平均分 } a->ave = a->ave/N;//注意要在把所有数值的和求出来以后才能求平均值 求其平均分 } main() { STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5}; int i; void NONO ( ); fun( &s ); printf("The %s's student data:\n", s.num); for(i=0;i #include #define N 8 struct slist { double s; struct slist *next; }; typedef struct slist STREC; double fun( STREC *h ) { double ave = 0.0; STREC* p = h->next; //while(h != NULL) error while(p != NULL) { ave = ave + p->s; // p->s = p->next; error p = p->next; } /* int i; for(i=0; is = h->s + h->next; return (h->s / N); */ return ave / 10; } 注意: 1.】遍历链表时应定义一个指向结点的指针p,因为"头结点"中没有数值,所以程序中让p直接指向"头结点"的下一个结点,使用语句STREC *p=h->next 2.】对链表的主要操作有以下几种:建立链表、结构的查找与输出、插入一个结点、删除一个结点 2016.2.12日晚11:00 #include #include char* fun( char tt ) { int i; for( i = 0; tt; i++ ) /**********found***********/ if(( 'a' <= tt )&&( tt <= 'z' ) ) /**********found***********/ tt -= 32; return( tt ); } 素数的判断 #include void fun( int m, int *k, int xx ) { //判定一个数是否为素数,即该数除了能被1和它本身外,不能被任何数整除 int i, j, n = 0; for(i = 4; i1 && i%m != 0 && 1%m != 0) { xx = i; // *k++; //k ++; } } */ 2016.2.13日晚10:00 求ss中指定字符串的个数 #include #include #define M 81 int fun(char *ss, char c) { //c是输入的字符 int i, k = 0; for(i=0; ss != '\0'; i++)//遍历字符串 //判断出现字符数量 { if(ss == c) k++; } return k; } 将一个数组中的字符串和数字字符分开重新存储 #include void fun(char *s) { int i, j=0, k=0; char t1, t2; for(i=0; s!='\0'; i++) if(s>='0' && s<='9') { /**********found**********/ t2=s; j++; } else t1=s; t2=0; t1=0; /**********found**********/ for(i=0; i #include #define MAXLINE 20 fun ( char *pstr) { int i, j ; char *p ; for (i = 0 ; i < 5 ; i++ ) { /**************found**************/ for (j = i + 1; j < 6; j++) { if(strcmp(*(pstr + i), *(pstr + j)) > 0) { //注意指针和指针所指向的内存空间是两个不同的概念 p = *(pstr + i) ; /**************found**************/ *(pstr + i) = *(pstr + j) ; *(pstr + j) = p ; } } } } 2016.2.14日晚11:00 链表的插入、排序操作 #include #include #define N 8 typedef struct list { int data; struct list *next; } SLIST; void fun( SLIST *h, int x) { SLIST *p, *q, *s; s=(SLIST *)malloc(sizeof(SLIST)); /**********found**********/ s->data=x;//将链表节点的数值赋给s指向的数据 q=h; p=h->next; while(p!=NULL && x>p->data) { /**********found**********/ q=p;//实现循环 p=p->next; } s->next=p;//实现节点的插入操作 /**********found**********/ q->next=s; } 计算正整数各位上的数字之积 #include long fun (long num) { /************found************/ long k=1.0;//这里要赋初始值 do { k*=(num%10) ; /************found************/ num/=10 ;//注意除号的写法 } while(num) ; return (k) ; } 将形参a所指向数组中的前半部分元素的值与后半部分元素中的值互换 #include #define N 9 void fun(int a, int n) { int i, t, p; /**********found**********/ p = (n%2==0)?n/2:n/2+1; for (i=0; i #define N 16 typedef struct { char num; int s; } STREC; int fun( STREC *a, STREC *b ) { /* int i, j, k=0; for(i=0; i a.s) { b = a; } } } return k; */ int i, j=0, max = a.s; for(i=0; i a.s) { // max = a.s; b = a; } } return j; int i,j = 0, max = a.s; for(i=0; i #include #define N 5 #define M 10 int fun(char (*ss), int k) { int i,j=0,len; /**********found**********/ for(i=0; i< N ; i++) { len=strlen(ss); /**********found**********/ if(len<= k) /**********found**********/ strcpy(ss, ss); } return j; } 变量初始化,需根据题意确定变量含义,然后对其进行初始化操作;while循环语句。 #include #include void fun(char *p ,char *q, char *c) { /************found************/ int k = 0;//变量k存放数组c的下标,因此应初始化为0。 /************found************/ while( *p || *q )// while循环语句的循环条件是判断两个字符串是否到达结尾。 { if( *p>=*q ) c=*q; else c=*p; if(*p) p++; if(*q) q++; k++; } } for(i=0; a != '\0'; i++) { if(a == '*') { a = a; } } //临时指针p,初始指向原串首地址;(2) 利用循环语句把字符串前导*号拷贝到原串;(3) 继续移动指针,把串中和串尾的非*号字符拷贝到原串; #include void fun( char *a ) { int i=0; char *p =a;//辅助指针变量遍历数组 while(*p != NULL && *p == '*') { a = *p; i++; p++;//指针后移 } while(*p != NULL) { if(*p != '*') { a=*p; i++;//指针地址变化 } p++;//指针后移 } a = '\0';//指针结束的标记 2016.3.3 字符串的移动 #include void fun(char *s) { int i, n, k; char c; n=0; for(i=0; s!='\0'; i++) n++; /**********found**********/ if(n%2==0) k=n- 1;// 统计字符的长度 else k=n-2; /**********found**********/ c=s ;//k的作用后,则将最右边的奇数位置的数赋值给变量c。 for(i=k-2; i>=1; i=i-2) s=s; /**********found**********/ s=c ;//将最后一个下标为奇数的元素移到第一个奇数位置。 } 【警告】 去掉数值n的个位的方法是采用除法运算【/】,如果需要取出个位数才使用求余运算【%】 【参考答案】 void fun(char *tt, int pp) { int i; for(i=0;i<26;i++) pp=0; /*初始化pp数组各元素为0*/ for(;*tt!='\0';tt++)//地址加加 if(*tt>='a'&&*tt<='z') pp++; //用tt指针所指向的内存空间的数值与‘a’的asscii马数值相比较, 并让当前的数值不断后移 } 字符串的删除 #include void fun( char *a ) { int i = 0; char *p = a;//指向数组的首地址 while(*p != '\0') //注意赋值 = 操作和 == 的区别 { p ++;//让指针移动到数组元素的末尾 指向‘\0’ } p--;//让指针指向数组的最后一个元素 while(*p == '*') { p--; //a = *p; //i++; p = '\0'; } } //链表的操作 void fun( SLIST *p) { SLIST *t, *s; t=p->next; s=p; while(t->next != NULL) { s=t; /**********found**********/ t=t->next;//指针不断下移 } /**********found**********/ printf(" %d ",t->data);//输出指针t指向的数据 s->next=NULL; /**********found**********/ free(t);//释放t } 数组元素的交换 #include void fun(int a, int n) { int i,t; /**********found**********/ for (i=0; i int fun( char *p ) { int n; /**********fo 字符'0'的ASCII码,就得到对应的数字。题中给出的是"o",不是"0"。盘【n是个位数】und**********/ n= *p-'0';//(1)"0"和"1"是字符串中的数字字符,为了进行数字运算,必须要将数字字符转换为数字,用数字字符减去 p++; while( *p!=0 ) { /**********found**********/ n=n*8+*p-'0';//(2)要在一个八进制数的最后加上一位,原来各个位上的数上升一位,只需将原数乘以8再加上个位数。 p++; } return n; } 结构体元素的选择筛选 typedef struct { char num; int s; } STREC; STREC fun( STREC *a, char *b ) { int i; STREC str = {'\0', -1};//若没找到指定的学号,在结构体变量中给学号置空串,给成绩置 for(i=0; i #include int fun(char *source, char *target) { FILE *fs,*ft; char ch; /**********found**********/ if((fs=fopen(source, "r"))==NULL)//只读方式 //打开一个文件的调用方式是,fs=fopen(文件名,使用文件方式),以只读的方式打开文件,所以文件打开方式为"r"。 return 0; if((ft=fopen(target, "w"))==NULL)// return 0; printf("\nThe data in file :\n"); ch=fgetc(fs); /**********found**********/ // while(!feof(source))//判断文件是否读取完成,如果文件结束,则返回非0值,否则返回0 while(!feof(fs))//源文件是否读取完成判断 { putchar( ch ); /**********found**********/ // fputc(ch,target);// 将字符ch写到文件指针fp所指向的文件的当前写指针的位置。 fputc(ch, ft);//写入文件 ch=fgetc(fs); } fclose(fs); fclose(ft); printf("\n\n"); return 1; } 二维数组实现矩阵的排列 void fun(int (*t), int m) { int i, j; /**********found**********/ for(i=0; i=0; j--) /**********found**********/ t=t; /**********found**********/ for(j=0; j #include double fun() { //利用递归方法实现函数的计算直到满足条件为止 double x1 = 0.0, x0; /* x0 = x1; x1 = fun(x0); /* f分析:如果在此处通if语句, 则循环语句不好掌握 故可采用使用纬while()语句 if(fabs(x0-x1) < 0.000001) { return x1; } */ do { x0 = x1; x1 = cos(x0); }while(fabs(x0-x1) > 0.000001); return x1; } #include void fun( char *a ) { int i=0,n=0; char *p; p=a;//让指针p指向a的首地址 while (*p=='*') /*判断*p是否是*号,并统计*号的个数*/ { n++;p++;//n记录了‘*’的个数, p移动到了*的位置 } while(*p != NULL) /*将前导*号后的字符传递给a*/ { a=*p;i++;p++;//将p位置之后的内容拷贝到哦a【】数组中去 } while(n!=0) { a='*';i++;n--;//把*放到a数组的后面 } a='\0';//在指针的末尾加上结束标识符 /*int i = 0, j = 0; char *p = a; a = 0; while(p == '*') { // m = p; a = p; i++; } while(p != '\0') { a = p; j++; } a = '\0';*/ } 附加: sl = sl*10;//(2)重新组合一个数,从个位开始,然后十位,依次类推,因此每增加一位数,原数值需乘以10,即s1=s1*10;。 结构体数组的排序筛选操作 int fun( STREC *a, STREC *b ) { int min = a.s; int i,j=0; for(i=0; i void fun( char *a, int n,int h,int e ) { int i, j =0; for(i=h; i max) max = tt; } pp = max; } 结构体数组元素筛选要点 int fun( STREC *a,STREC *b,int l, int h ) { int i, j = 0; for(i=0; i= l && a.s <= h) //注意这里if语句和 while语句的区别 // while(a.s >= l && a.s <= h) error!! { //b.s = a.s;//error b = a;//b.s = a.s是错误的表述 } } // return b; // b.s = '\0'; return j; } void fun(int *a, int n) { int i, j, max, min, px, pn, t; /**********found**********/ for (i=0; i a) { min = a; pn = j; } } ave 如何取出数n的各个位数值 void fun(int a, int b, long *c) { /*b%10 获取b的个位,a/10 获取a的十位,a%10 获取a的个位,b/10 获取b的十位*/ *c=b%10+(a%10)*10+(b/10)*100+(a/10)*1000; //*c = (a/10)*1000 + (a%10)*10 + (b/10)*100 + (b%10)*1; // a 的十位: a /10; a的个位: a % 10; // b 的十位: b /10; b的个位: b % 10; int ge, shi, bai, data; scanf("%d", data); bai = data /100;//百位 shi = data /10 % 10; //十位 ge = data % 10;//个位 printf("ge = %d, shi = %d, bai = %d\n", ge, shi, bai); } 【考点分析】 本题考查:如何取出数n的各个位数值;知道数n的各个位数值,又如何表示该数值;指针型变量的使用。 【解题思路】 本题中主要的问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1,就可得到c的千位数、百位数、十位数和个位数。注意使用c时要进行指针运算。 将指定字符串中奇数位置的字母转换为大写 将指定字符串中奇数位置的字母转换为大写 for(i=0; ss != '\0'; i++) { if(i % 3 == 0 && ss >= 'a' && ss <= 'z') { ss = ss - 32;//转换为大写 } } /**********found**********/ for(i=0; i=1; j--) t=t; /**********found**********/ t=x; } 【参考答案】 int fun( int t) { int f0 = 0, f1 = 1, f ; do { f = f0 + f1 ; f0 = f1 ; f1 = f ; } while(f < t) ; return f ; } 【考点分析】 本题考查:变量数据类型及初始化;循环语句。 【解题思路】 根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把f看成是前两项之和,而f0始终代表第n-2项,f1代表第n-1项。退出循环时得到的数f,就是大于指定数的最小的数

评论

填写昵称与邮箱即可评论,无需登录。

推荐阅读