全国计算机二级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,就是大于指定数的最小的数
评论
填写昵称与邮箱即可评论,无需登录。