第1套 除了字符串前导和尾部的*号之外,将串中其他*号全部删除。
/*假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导和尾部的*号之外,
将串中其他*号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。在编写函数时
不得使用c语言提供的字符串函数。
例如:字符串中的内容为:****A*BC*DEF*G******** ,删除后,字符串中的内容应当是:****ABCDEFG********.
在编写函数时,不得使用C语言提供的字符串函数。*/
//我的解法
void fun_1( char* a,char* h,char* p )
{
char* ps = h;
char* pe;
pe=ps+1;
while(pe!=p+1)
{
if(*pe!='*')
{
ps++;
*ps=*pe;
*pe='*';
}
pe++;
}
while(*(pe+1))
{
pe++;
}
while(p!=ps)
{
p--;
pe--;
}
*(pe+1)='\0';
}
//答案解法
void fun_1_2(char* a,char* h,char* p)
{
char *q,*k;
q=h;
while(q<p)
{
if(*q=='*')
{
k=q;
while(*k)
{
*k=*(k+1);
k++;
}
p--;
}
else
q++;
}
}
void main_1()
{
char a[]="****A*BC*DEF*G********";
printf("%c %C\n",a[4],a[13]);
fun_1(a,&a[4],&a[13]);
printf("%s\n",a);
}
第2套 根据以下公式求Π的值
/*根据以下公式求Π的值
请编写一个函数fun,它的功能是:根据以下公式求Π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):
Π/2 = 1 + 1/3 + (1*2)/(3*5) + (1*2*3)/(3*5*7)+ (1*2*3*4)/(3*5*7*9) + ..... + (1*2*...*n)/(3*5*...*(2n+1))
程序运行后,如果输入精度0.0005,则程序输出为3.140578 */
//我的解法
double fun_2( double eps )
{
double k = 1;
int i = 1;
double sum = 0.0;
double x = 1;
double y = 1;
while(k >= eps)
{
sum+=k;
x *= i;
y *= 2*i+1;
k = x/y;
i++;
}
return sum*2;
}
//答案的解法
double fun_2_2( double eps)
{
double pi = 0.0,t=1,up=1.0,dow=1.0,n=1.0;
while(t>=eps)
{
pi+=t;
up*=n;
dow*=2*n+1;
t=up/dow;
n++;
}
return 2*pi;
}
void main_2()
{
double i = 0;
double k = 0;
scanf("%lf",&i);
k = fun_2(i);
printf("%lf\n",k);
}
第3套 比较两个字符串的长度
/*请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较长的字符串。
若两个字符串长度相同,则返回第一个字符串*/
//我的解法
char* fun_3( char* s,char* t )
{
char *p,*q;
p=s;
q=t;
while(*p&&*q)
{
p++;
q++;
}
if(*q=='\0'||(*p=='\0'&&*q=='\0'))
return s;
else
return t;
}
//答案解法
char *fun_3_2(char *s,char *t)
{
int i=0,j=0;
char *p=s,*q=t;
while(*(p++)) i++;
while(*(q++)) j++;
if(i>=j) return s;
else return t;
}
int main_3(){
char a[50]={0};
char b[50]={0};
char* p;
scanf("%s\n%s",a,b);
p = fun_3(a,b);
printf("%s\n",p);
return 0;
}
第4套 若多于n个,则删除多余的*号
/*若多于n个,则删除多余的*号
规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串最前面连续的*号不得多于n个:若多于n个,则删除多余的*号;若少于
或等于n个,则什么也不做,字符串中间和尾部的*号不删除 */
//我的解法
void fun_4( char* a,int n )
{
char *p=a;
int i=0;
while(*(p++)=='*')
{
i++;
}
if(i>n)
{
i=i-n;
while(*(a+i))
{
*a=*(a+i);
a++;
}
}
}
//答案解法
void fun_4_2(char* a,int n)
{
char* p,b[81];
int i=0,j=0;
p=a;
while(*p=='*') //统计前导*的个数
{
i++;
p++;
}
if(i>n)
{
p=a+(i-n); //设置新字符的起点
while(*p) //将结果复制到数组b
{
b[j]=*p;
p++;
j++;
}
b[j]='\0'; //设置字符串结束标志
j=0;
while(b[j]!='\0')//将b数组的内容复制到a数组
{
a[j]=b[j];
j++;
}
a[j]='\0';
}
}
int main_4(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
char a[]="****A*BC*DEF*G********";
int n=0;
scanf("%d",&n);
fun_4(a,n);
printf("%s\n",a);
return 0;
}
第5套 计算n门课程的平均分
/*计算n门课程的平均分,计算结果作为函数值返回
请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函数值返回 */
//我的解法
float fun_5( float* a,int n )
{
float sum=0.0;
int i=n;
while(i--)
{
sum+=*(a++);
}
return sum/n;
}
//答案解法
float fun_5_2( float* a,int n )
{
float ave=0.0;
int i;
for(i=0;i<n;i++)
{
ave+=a[i];
}
ave/=n;
return ave;
}
int main_5(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
float a[10]={90.5,72,80,61.5,55};
float ave = fun_5(a,5);
printf("%.2f\n",ave);
return 0;
}
第6套 求出该学生的平均分放在记录的ave成员中
/*求出该学生的平均分放在记录的ave成员中。某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成员已在主函数中给出。
请编写函数fun,它的功能是:求出该学生的平均分放在记录的ave成员中。 */
typedef struct student_6
{
int id; //学号
float s[8]; //8门课程的分数
float ave; //平均分
}stu_6;
void fun_6( stu_6* p )
{
int i=0;
for(i=0;i<8;i++)
{
p->ave+=p->s[i]/8;
}
}
int main_6(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
float score[8]={85.5,76,69.5,85,91,72,64.5,87.5};
int i = 0;
stu_6 student;
student.id = 37;
for(i=0;i<8;i++)
{
student.s[i]=score[i];
}
student.ave=0.0;
fun_6(&student);
printf("%.3f\n",student.ave);
return 0;
}
第7套 把高于平均分的学生数据放在h所指的数组中
/*把高于平均分的学生数据放在h所指的数组中
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把高于等于平均分的学生数据放在h所指的数组中,高于等于平均分的学生人数通过形参传回,平均分通过函数值返回。 */
typedef struct stu_7
{
int id; //学号
double s;//成绩
}stu_7;
double fun_7( stu_7* a,stu_7* b,int* n )
{
int i = 0;
double ave = 0.0;
*n = 0;
for(i=0;i<5;i++)
{
ave+=a[i].s/5;
}
for(i=0;i<5;i++)
if(a[i].s>=ave)
{
b[*n]=a[i];
(*n)++;
}
return ave;
}
int main_7(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
int i =0;
double score[5]={85.5,76,69.5,85,91};
stu_7 h[5];
double ave = 0.0;
int n=0;
stu_7 s[5];
for(i=0;i<5;i++)
{
s[i].id=i;
s[i].s=score[i];
}
ave = fun_7(s,h,&n);
printf("高于等于平均分的人数:%d\n平均分:%lf\n",n,ave);
printf("成绩高于等于平均分的学生信息:\n\n");
printf("学号\t成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%.2lf\n",h[i].id,h[i].s);
}
return 0;
}
第8套 按分数的高低排列学生的记录
/*按分数的高低排列学生的记录
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的
功能是:按分数的高低排列学生的记录,高分在前。*/
typedef struct stu_8
{
int id; //学号
double s;//成绩
}stu_8;
void fun_8( stu_8* a )
{
stu_8 temp;
int i=0,j=0;
for(i=0;i<5;i++)
for(j=i+1;j<5;j++)
if(a[i].s<a[j].s)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int main_8(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
int i =0;
double score[5]={85.5,76,69.5,85,91};
stu_8 s[5];
for(i=0;i<5;i++)
{
s[i].id=i;
s[i].s=score[i];
}
printf("排列之前:\n");
for(i=0;i<5;i++)
{
printf("%d\t%.2lf\n",s[i].id,s[i].s);
}
fun_8(s);
printf("排列之后:\n");
for(i=0;i<5;i++)
{
printf("%d\t%.2lf\n",s[i].id,s[i].s);
}
return 0;
}
第9套 将两个两位数的正整数a、b合并成一个整数
/*将两个两位数的正整数a、b合并成一个整数
函数fun的功能是:将两个两位数的正整数a,b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位置上。例如:当a=45,b=12.调用函数后,c=2415. */
//我的解法
void fun_9( int a,int b,long *c )
{
*c+=a%10;
*c+=(b%10)*10;
*c+=(a/10%10)*100;
*c+=(b/10%10)*1000;
}
//答案解法
void fun_9_2(int a,int b,long *c)
{
int qw,bw,sw,gw;
bw=a/10;
gw=a%10;
sw=b/10;
qw=b%10;
*c=qw*1000+bw*100+sw*10+gw;
}
int main_9(){
int a =0,b = 0;
long c = 0;
scanf("%d %d",&a,&b);
fun_9( a, b, &c);
printf("%ld\n",c);
return 0;
}
第10套 函数返回指定学号的学生数据
/*函数返回指定学号的学生数据
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:函数返回指定学号的学生数据,指定的学号在主函数中输入。若没找到指定学号,在结构体变量中给学号置空号,给成绩置-1,作为函数值返回。(用于字符串比较的函数是strcmp)*/
typedef struct stu_10
{
char id[10];
float s;
}stu_10;
//我的解法
stu_10 fun_10( stu_10* a,char* b )
{
int i = 0;
stu_10 result={"",-1};
result.s=-1;
for(i=0;i<5;i++)
{
if(!strcmp(a[i].id,b))
return a[i];
}
return result;
}
//答案解法
stu_10 fun_10_2( stu_10* a,char* b )
{
int i;
stu_10 t;
for(i=0;i<5;i++)
if(strcmp(a[i].id,b)==0)
return a[i];
strcpy(t.id,"");
t.s=-1;
return t;
}
int main_10(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
int i =0;
float score[5]={85.5,76,69.5,85,91};
stu_10 s[5]={"1001",85.5,"1002",76,"1003",69.5,"1004",85,"1005",91};
stu_10 result;
for(i=0;i<5;i++)
{
printf("%s\t%.2f\n",s[i].id,s[i].s);
}
printf("----------------------\n");
result = fun_10( s, "1002");
printf("%s\t%.2f\n",result.id,result.s);
return 0;
}
第11套 把指定分数范围内的学生数据放在h所指的而数组中
/*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,
请编写函数fun,它的功能是:把指定分数范围内的学生数据放在h所指的而数组中,分数范围内的学生人数由函数值返回。
例如:输入的分数是60 69,则应当把分数在60到69的学生数据进行输出,包含60分和69分的学生数据。主函数中将把60放在low中,把69放在high中。*/
typedef struct stu_11
{
char id[10];
float s;
}stu_11;
//我的解法
int fun_11( stu_11* s,stu_11* h,float low,float high )
{
int i = 0;
int j = 0;
while(i<9)
{
if(s[i].s>=low && s[i].s<=high)
h[j++] = s[i];
i++;
}
return j;
}
int main_11(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
int i = 0,j = 0;
float low,high;
stu_11 s[9]={"1001",97,"1002",87,"1003",88,"1004",99,"1005",85.5,"1006",76,"1007",69.5,"1008",85,"1009",91};
stu_11 h[9]={0};
scanf("%f %f",&low,&high);
j = fun_11(s,h,low,high);
while(i<j)
{
printf("%s\t%.2f\n",h[i].id,h[i].s);
i++;
}
return 0;
}
第12套 求出平均分
/*N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。
请编写函数fun,它的功能是:求出平均分,由函数值返回。
例如:若学生的成绩是85,7669,85,91,72,64,87;则平均分应当是:78.625。*/
typedef struct stu_12
{
int id; //学号
int s; //成绩
struct stu_12* next;
}stu_12,*stu_12_list;
//我的解法
double fun_12( stu_12* h )
{
stu_12* p;
int n=0;
double ave = 0.0;
p=h->next;
while(p)
{
n++;
ave += p->s;
p = p->next;
}
ave /= n;
return ave;
}
//答案解法
double fun_12_2( stu_12* h )
{
double ave = 0.0;
int n = 0;
stu_12 *p;
p=h->next;
while(p!=0)
{
ave+=p->s;
n++;
p=p->next;
}
ave/=n;
return ave;
}
int main_12(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
int i = 0;
stu_12 *L,*h,*r;
double ave = 0.0;
int score[8] = {85,76,69,85,91,72,64,87};
L = (stu_12 *)malloc(sizeof(stu_12));
h = L;
r = L;
h->next = NULL;
while(i<8)
{
L = (stu_12 *)malloc(sizeof(stu_12));
h->next = L;
h=L;
h->next = NULL;
h->id = i;
h->s = score[i];
i++;
}
ave = fun_12(r);
printf("%.3lf\n",ave);
return 0;
}
第13套 求出W的低n-1位的数作为函数值返回
/*请编写一个函数unsigned fun(unsigned w),w是一个大于10的无符号整数,若w是n(n>=2)位的整数,函数求出W的低n-1位的数作为函数值返回。
例如w的值为5923,则函数返回923;w的值为923,则函数返回23。*/
//我的解法
unsigned fun_13( unsigned w )
{
int i = 0,sum = 1;
unsigned n = w;
while(n)
{
i++;
n/=10;
}
if(i>=2)
{
i=i-1;
while(i)
{
sum*=10;
i--;
}
return w%sum;
}
return 0;
}
//我的解法二
//快速幂
unsigned fastPower_13(unsigned base, unsigned power) {//这里写为函数形式,也可直接放入主函数中
unsigned result = 1;
while (power > 0) {
if (power % 2 == 1) {//判断奇偶
result = result * base;
}
power = power / 2;//指数减半,整型变量不保留小数,奇数也可直接除
base = (base * base) ;//底数平方
}
return result;
}
unsigned fun_13_1( unsigned w )
{
int i = 0;
unsigned n = w;
while(n)
{
i++;
n/=10;
}
printf("%d\n",i);
if(i>=2)
{
i=i-1;
i = fastPower_13(10,i);
return w%i;
}
return 0;
}
//答案解法
unsigned fun_13_2( unsigned w )
{
int t = w,n = 0,k,p = 1,num = 0,x;
while(t>0)
{
t/=10;
n++;
}
for(k=0,x=w;k<n-1;k++)
{
t = x%10;
x /= 10;
num += p*t;
p = 10*p;
}
return num;
}
int main_13(){
unsigned w= 0,i=0;
scanf("%u",&w);
i = fun_13(w);
printf("%u\n",i);
return 0;
}
第14套 求出数组的最大元素在数组中的下标
/*请编写一个函数int fun(int *s,int t,int *k),用来求出数组的最大元素在数组中的下标,用k返回
例如:输入如下整数:876 675 896 101 301 401 980 431 451 777,则输出结果为6,980*/
int fun_14(int *s,int t,int *k)
{
int max = 0;
int i = 0;
*k = 0;
for(i=1;i<t;i++)
{
if(s[*k]<s[i])
*k = i;
}
return *k;
}
int main_14(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
int s[]={876,675,896, 101, 301, 401, 980, 431, 451, 777};
int t = sizeof(s)/sizeof(s[0]);
int k = 0;
fun_14(s,t,&k);
printf("%d %d\n",k,s[k]);
return 0;
}
第15套 将一个数字字符串转换为一个整数
/*将一个数字字符串转换为一个整数
请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提高的将字符串转换为整数的函数)。例如:若输入字符串"-1234",则函数把它转换为整数值 -1234。*/
//我的解法
long fun_15(char *p)
{
long k = 0;
int flag = 1;
if(*p=='-')
{
flag=-1;
p++;
}
while(*p)
{
k *= 10;
k += (*p-48);
p++;
}
k *= flag;
return k;
}
//答案解法
long fun_15_2(char *p)
{
char *q;
long t = 0;
q=p;
while(*q!='\0')
{
if(*q!='-')
{
t=t*10+(*q-'0');
q++;
}
else
q++;
}
if(*p=='-')
return -t; //判断正负号
else
return t;
}
int main_15(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
char p[]="-1234";
long k = 0;
printf("%s\n",p);
k = fun_15( p );
printf("%ld\n",k);
return 0;
}
第16套 求出1到m之内能被7或11整除的所有整数
/*求出1到m之内能被7或11整除的所有整数
请编写一个函数fun,它的功能是:求出1到m之内(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。例如,若传送给m的值为50,则程序输出:
7 11 14 21 22 28 33 35 42 44 49*/
//我的解法(优化版本)
//得到的数组a顺序排列
void fun_16(int m,int *a,int *n)
{
int i = 7;
int j = 14,k = 11;
*n = 0;
while(i<=m)
{
*a=i;
a++;
(*n)++;
if(j<k)
{
i = j;
j += 7;
}
else if(j>k)
{
i = k;
k += 11;
}
else
{
i = j;
j+=7;
k+=11;
}
}
}
//我的解法(得到的数组是乱序的且存在重复值)
/*void fun_16_1(int m,int *a,int *n)
{
int j = 7,k = 11;
*n = 0;
while(j<=m||k<=m)
{
if(j<=m)
{
*a=j;
a++;
(*n)++;
j+=7;
}
if(k<=m)
{
*a=k;
a++;
(*n)++;
k+=11;
}
}
}
*/
//答案解法
void fun_16_2(int m,int *a,int *n)
{
int i;
for(i=1,*n=0;i<=m;i++)
if(i%7==0||i%11==0)
a[(*n)++]=i;
}
int main_16(){
//srand(time(NULL));
//printf("运行时间:%f\n",(double)clock() / CLOCKS_PER_SEC);
int a[100]={0};
int n = 0; //n记录数组中元素的个数
int m = 0;
int i = 0;
scanf("%d",&m);
fun_16( m,a,&n );
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
第17套 找出一维整型数组元素中最大的值和它所在的下标
/*找出一维整型数组元素中最大的值和它所在的下标
请编写一个函数fun,它的功能是:找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。
主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标.*/
void fun_17(int a[],int n,int *max,int *d)
{
int i = 0;
*max = a[0];
*d = 0;
for(i=1;i<n;i++)
{
if(*max<a[i])
{
*max = a[i];
*d = i;
}
}
}
int main_17(){
int x[6]={876,675,896,101,301,401};
int max = 0,index = 0;
fun_17( x,6,&max,&index );
printf("%d %d\n",index,max);
return 0;
}
第18套 将s所指向字符串中下标为偶数的字符删除
/*将s所指向字符串中下标为偶数的字符删除
函数fun的功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成
的新串放在t所指数组中。
例如:当s所指字符串中的内容为:"ABCDEFGHIJK"
在t所指数组中的内容应是:"BDFHJ"*/
void fun_18(char *s,char t[])
{
int i = 0,n = 0;
while(*s)
{
if(i%2!=0)
t[n++] = *s;
i++;
s++;
}
t[n]='\0';
}
void fun_18_1(char *s,char t[])
{
int i = 0;
while(*s++)
{
*t++ = *s++;
}
*t='\0';
}
int main_18(){
char s[]="ABCDEFGHIJ";
char t[30];
fun_18_1(s,t);
printf("%s\n",t);
return 0;
}
第19套 计算......每相邻两个元素之平均值的平方根之和
/*计算......每相邻两个元素之平均值的平方根之和
请编写函数fun,其功能是:计算并输出给定数组(长度为9)中每相邻两个元素之
平均值的平方根之和。
例如:给定数组中的9个元素依次为12.0、34.0、4.0、23.0、34.0、45.0、18.0、3.0、11.0.
输出应为:s=35.951014.*/
double fun_19(double x[9])
{
double k,sum=0.0;
int i = 0;
for(i=1;i<9;i++)
{
k = (x[i-1]+x[i])/2;
sum += sqrt(k);
}
return sum;
}
int main_19(){
double x[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};
double sum;
sum = fun_19(x);
printf("%lf\n",sum);
return 0;
}
第20套 计算并输出下列多项式的值
/*计算并输出下列多项式的值
请编写函数fun,其功能是:计算并输出下列多项式的值:
s=(1-1/2)+(1/3-1/4)+......+(1/(2*n-1)-1/(2*n))
例如,在主函数中从键盘给n输入8后,输出为:s=0.662872.*/
//我的解法1
double fun_20(int n)
{
int i = 0;
double s=0.0;
for(i=1;i<=n;i++)
{
s += 1.0/(2*i-1)-1.0/(2*i);
}
return s;
}
//我的解法2
double fun_20_1(int n)
{
int i = 0,f = 1;
double s=0.0;
for(i=1;i<=2*n;i++)
{
s += f*1.0/i;
f *= -1;
}
return s;
}
int main_20(){
int n = 0;
double ret;
scanf("%d",&n);
ret = fun_20(n);
printf("%lf\n",ret);
return 0;
}