头歌实训平台C语言

目录

C语言程序设计编辑与调试环境

 第1关打印输出 Hello World 

 第2关打印输出图形

 第3关求3个数的最大值

 第4关熟悉C语言调试过程

顺序结构程序设计

第1关加法运算

第2关不使用第3个变量,实现两个数的对调

第3关用宏定义常量

第4关数字分离

第5关计算总成绩和平均成绩

第6关求三角形的面积

第7关立体几何计算题

第8关计算两个正整数的最大公约数

选择结构程序设计

第1关排序

第2关选择结构-闰年判断

第3关选择结构-分段函数问题

第4关学生成绩等级换算

选择结构程序设计进阶

第1关快递费用计算

第2关计算一元二次方程的根

正在挑战2610人完成挑战24324人可获经验100点

已完成

第3关产品信息格式化

循环结构程序设计1

第1关小球自由落体运动

第2关求解出n以内所有能被5整除的正整数的乘积

第3关最大公约数和最小公倍数

第4关字符串中各类字符数的统计

第5关求sn=a+aa+aaa+aaaa+......的值

循环结构程序设计2

第1关C循环-求平均成绩

第2关C循环-求各位数字之积

第3关C循环-求阶乘之和

第4关C循环-水仙花数

第5关C循环-寻找完数

第6关分数求和

函数

第1关求和

第2关回文数计算

第3关 编写函数求表达式的值

第4关阶乘数列

第5关亲密数

第6关公约公倍数

递归函数、嵌套函数

第1关递归求阶乘数列

第2关递归实现输出一个整数的逆序

第3关将整数递归转换成字符串

第4关递归实现Ackman函数

一维数组和二维数组

第1关排序问题

第2关查找整数

第3关计算数组中元素的最大值及其所在的行列下标值

第4关二分查找

第5关鞍点

第6关删除最大值

第7关杨辉三角

字符数组

第1关字符逆序

第2关字符统计

第3关字符插入

第4关字符串处理

第5关字符串统计

第6关字符串排序

指针

第1关用指针法输入12个整数,然后按每行4个数输出

第2关指针变量作为函数参数实现两变量交换值

第3关报数

第4关strcmp函数

指针进阶

第1关输出若干个学生成绩中的最高分.要求用指针函数实现

第2关采用指针变量表示地址的方法输入输出数组中的个元素

第3关用指针实现数组循环移动

结构体

第1关结构体变量的初始化和引用

第2关结构体排序

第3关结构体存储数据

第4关结构体存储学生信息

文件

第1关HelloWorld

第2关文件读取和写入

第3关统计文本字母数量

第4关读取文件中指定学生信息

C语言程序设计编辑与调试环境

第1关打印输出 Hello World

任务描述

本关任务:通过运行一个C语言程序,让你初步了解程序的运行方法。

#include<stdio.h>
	int main(void)
	{  
	/********* Begin *********/
	printf( "Hello World\n" );
    system( "pause" );
	
	/********* End *********/
       return 0;
	}

第2关打印输出图形

任务描述

本关任务:参照上面调试的程序,编写一个能输出规定图形的程序。

编程要求

编写一个C程序,输出以下图案,并上机调试通过。第一行开头有4个空格,第二行开头有3个空格,第三行有2个空格,第四行开头有一个空格,第五行开头没有空格,9*

  1. *
  2. ***
  3. OK
  4. Hello!
  5. *********

测试说明

平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。

输入:无

输出:

  1. *
  2. ***
  3. OK
  4. Hello!
  5. *********

    提示 本题通过执行多个printf函数输出每一行即可,暂时不用考虑使用循环。

    #include<stdio.h>
    	int main(void)
    	{  	
    	/********* Begin *********/
    	printf("    *\n");
        printf("   ***\n");
        printf("  OK\n");
        printf(" Hello!\n");
        printf("*********\n");
    	
    	/********* End *********/
           return 0;
    	}

第3关求3个数的最大值

任务描述

本关任务:编写一个程序,输入a、b、c三个整数,输出其中最大值。

相关知识

输入

输入一行数据,分别为a b c

输出

a b c其中最大的数,不用换行。

如何求出最大值

求几个数的最大值?

三个数两两比较,将较大的数存入最大值变量max;

#include<stdio.h>
	int main(void)
	{  
	/********* Begin *********/
    int a, b, c,ma=-999999;
    scanf("%d,%d,%d",&a,&b,&c);
    if(a>ma){
        ma=a;
    }
    if(b>ma){
        ma=b;
    }
    if(c>ma){
        ma=c;
    }
	printf("max=%d",ma);
	/********* End *********/
       return 0;
	}

第4关熟悉C语言调试过程

任务描述

本关任务:以下程序源代码有错误,请使用C语言的调试功能,检查程序的错误并更正,使之能正确运行。

编程要求

程序中要求键盘输入x的值,当x的值为5时输出*****,否则输出#####

  • 输入:整数x的值。

  • 输出:当x的值为5时输出*****,否则输出#####

#include"stdio.h"
int main(void)
  {
	  /********* Begin *********/
      int  x;
      int y=2,z=3;
      scanf("%d",&x); 
      if(x==y+z)
      printf("*****");
      else  
      printf("#####");
      return 0;
	  /********* End *********/
  }

顺序结构程序设计

第1关加法运算

任务描述

本关任务:写一个加法程序,输入整数a,b,输出他们的和。

#include<stdio.h>
	int main(void)
	{  
	  int a,b,c; 
      //Please input a,b:
	  /*********Begin*********/
	  scanf("%d,%d",&a,&b);
      c=a+b;
      printf("%d+%d=%d",a,b,c);
	  
	  /*********End**********/ 
       return 0;
	}

第2关不使用第3个变量,实现两个数的对调

任务描述

本关任务:下列程序是不用第三个变量,实现将两个数进行对调的操作。 程序代码如下: 1 #include<stdio.h> 2 int main(void) 3 { 4 int a,b;printf(“Enter a and b:”); 5 scanf(“%d%d”,&a,&b); 6 printf(“a=%d b=%d\n”,a,b); 7 a= ① ;b= ② ;a= ③ ; 8 printf(“a=%d b=%d\n”,a,b); 9 return 0; 10 }

#include<stdio.h>
	int main(void)
	{  
	  int a,b;
	  //Enter a and b:
      scanf("%d%d",&a,&b); 
      printf("a=%d b=%d\n",a,b);
	  /*********Begin*********/
	  a=a+b;
      b=a-b;
      a=a-b;
	  
	  /*********End**********/
	  printf("a=%d  b=%d\n",a,b);  
       return 0;
	

第3关用宏定义常量

任务描述

本关任务:已知某物品单价为30,数量为x。求商品的总价钱。用宏定义物品的单价。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,用宏定义物品的单价。

  • 输入:一个整数x,代表物品的数量。

  • 输出:输出总价格。

    #include<stdio.h>
    	int main(void)
    	{  
    	  /*********Begin*********/
    	  int x,y;
          scanf("%d",&x);
          y=30*x;
          printf("%d\n",y);
    	  
    	  /*********End**********/ 
           return 0;
    	}
    

第4关数字分离

任务描述

输入一个三位数,分别求出x的各位数字,十位数字,百位数字的值。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,输入一个三位数,分别求出x的各位数字,十位数字,百位数字的值。

  • 输入:一个三位数

  • 输出:输出该数字的百位,十位,个位,数字之间用一个空格隔开。

    #include<stdio.h>
    	int main(void)
    	{  
    	  /*********Begin*********/
    	  int k,l,m,n;
          scanf("%d",&k);
          l=k/100;
          m=k/10%10;
          n=k%10;
          printf("%d %d %d\n",l,m,n);
          
    	  
    	  /*********End**********/ 
           return 0;
    	}

第5关计算总成绩和平均成绩

任务描述

本关任务:编程求从键盘上输入一个学生的五门成绩,计算出该学生的总成绩和平均成绩。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,编程求从键盘上输入一个学生的五门成绩,计算出该学生的总成绩和平均成绩。

  • 输入:五个整数

  • 输出:总成绩和平均成绩,其中平均成绩保留小数点后两位。

    #include<stdio.h>
    	int main(void)
    	{  
    	  /*********Begin*********/
    	  int a,b,c,m,n,sum;
          float s;
          scanf("%d%d%d%d%d",&a,&b,&c,&m,&n);
          sum=a+b+c+m+n;
          s=sum/5.00;
          printf("%d %.2f",sum,s);
    	  
    	  /*********End**********/ 
           return 0;
    	}

第6关求三角形的面积

任务描述

本关任务:编程求以a、b、c为边长的三角形的面积area

相关知识

三角形面积计算公式为: 假设三角形三条边长分别为a、b、c,其中s=(a+b+c)/2,则面积:

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,编程求以a、b、c为边长的三角形的面积area

  • 输入:a b c三角形的三条边,可以是小数;

  • 输出:三角形面积,保留3位小数。

    #include<stdio.h>
    	int main(void)
    	{  
    	  /*********Begin*********/
    	  float a,b,c,area,s;
          scanf("%f %f %f",&a,&b,&c);
          s=(a+b+c)/2.0;
          area=sqrt(s*(s-a)*(s-b)*(s-c));
          printf("%.3f",area);
    	  
    	  /*********End**********/ 
           return 0;
    	}
    

第7关立体几何计算题

任务描述

本关任务:设圆半径r,圆柱高h , 求圆周长C1,半径为r的圆球表面积Sb,圆半径r,圆柱高为h的圆柱体积Vb。 用scanf输入数据,输出计算结果,输出时取小数点后两位数字。请编程序。 PI=3.14

编程要求

  • 输入:两个double型浮点数,rh

  • 输出:圆周长C1、圆球表面积Sb、圆柱体积Vb。 保留两位小数,每个结果后换行。

    #include<stdio.h>
    #define PI 3.14
    	int main(void)
    	{  
    	  /*********Begin*********/
    	  double r,h,C1,Sb,Vb;
          scanf("%lf,%lf",&r,&h);
          C1=2*PI*r;
          Sb=4*PI*r*r;
          Vb=PI*r*r*h;
          printf("C1=%.2lf\n",C1);
          printf("Sb=%.2lf\n",Sb);
          printf("Vb=%.2lf\n",Vb);
    	  
    	  /*********End**********/ 
           return 0;
    	}
    

第8关计算两个正整数的最大公约数

任务描述

编程计算两个正整数的最大公约数。其中求最大公约数的函数原型已经给出,请在主函数中编程调用函数,输出最大公约数。

程序的运行示例: 12,3↙ 3 ####函数原型说明 求最大公约数的函数原型如下: int MaxCommonFactor( int a, int b); 返回值:返回的是最大公约数;若输入的数据有任意一个不满足条件,返回值是-1。 参数:a,b是两个整型数

相关知识

本任务主要考察函数的调用方法。 ####编程要求 根据提示,在右侧编辑器Begin-End处补充代码,编程计算两个正整数的最大公约数。

  • 输入:输入格式:"%d,%d"
  • 输出:输出格式:"%d\n"
    #include<stdio.h>
    int MaxCommonFactor( int a, int b)
    { 
       int c; 
       if(a<=0||b<=0) 
          return -1; 
       while(b!=0)
       { 
         c=a%b; 
         a=b;
         b=c;
       } 
      return a; 
    }   
    int main(void)
    	{  
    	  /*********Begin*********/
    	 int n,m;
         scanf("%d,%d",&n,&m);
         printf("%d\n",MaxCommonFactor(n,m));
    	  
    	  /*********End**********/ 
        return 0;
    }
    

选择结构程序设计

第1关排序

任务描述

本关任务:下面的程序是从键盘输入三个整数按从小到大的顺序输出。

为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

相关知识

输入格式

输入格式如下:

printf("请输入三个整数:"); scanf("%d%d%d",&a,&b,&c);

输出

排序输出从小到大的三个整数。

输出格式如下:

printf("从小到大排列为:%d,%d,%d",a,b,c);

#include<stdio.h>
#include<math.h>
	int main(void)
	{  
	  /*********Begin*********/
	  int a[10];
      printf("请输入三个整数:");
      for(int i=1;i<=3;i++){
          scanf("%d",&a[i]);
      }
      for(int i=1;i<3;i++){
          for(int j=i+1;j<4;j++){
              if(a[i]>a[j]){
                  int t=a[i];
                  a[i]=a[j];
                  a[j]=t;
              }
          }
      }
      printf("从小到大排列为:%d,%d,%d",a[1],a[2],a[3]);
	  /*********End**********/ 
       return 0;
	}

第2关选择结构-闰年判断

任务描述

编写程序,完成如下功能:从键盘输入任意年份year,判别该年份是否闰年。 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

相关知识

输入

从键盘任意输入一个年份 。

输出

根据是否闰年进行输出,是输出"****是闰年!",否输出"****不是闰年!",其中****为当前输入的年份。

样例输入

2000

样例输出

2000 是闰年!

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
		  int year;
      scanf("%d",&year);
      if((year%400==0) || (year%4==0&&year%100!=0)){
          printf("%d 是闰年!",year);
      }
      else{
          printf("%d 不是闰年!",year);
      }  
	  
	  /*********End**********/ 
       return 0;
	}

第3关选择结构-分段函数问题

任务描述

本关任务:编写程序,根据输入的值,输出函数的值。

有一个函数,定义如下

写一段程序,输入x,输出y

相关知识

输入

从键盘任意输入一个数x

输出

一个数y,保留小数点后三位。

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	  double x,y;
      scanf("%lf",&x);
      if(x<0 && x!=-3){
          y=x*x+x-6;
      }
      else if(x>=0 && x<10 && x!=2 && x!=3){
          y=x*x-5*x+6;
      }
      else{
          y=x*x-x-1;
      }
      printf("%.3f",y);
	
	  /*********End**********/ 
       return 0;
	}

第4关学生成绩等级换算

任务描述

本关任务:给出一百分制成绩,要求输出成绩等级ABCDE90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E,如果输入数据不在0~100范围内,请输出一行:“Score is error!”。

相关知识

输入

从键盘输入一个成绩,成绩可以使浮点数。

输出

(1)如果输入数据在0100范围内:一个字符,表示成绩等级。 (2)如果输入数据不在0~100范围内,请输出一行:“Score is error!

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	  int n;
      scanf("%d",&n);
      if(n>100 || n<0)
      {
          printf("Score is error!");
          return 0;
      }
      else if(n>=90 && n<=100)
      {
          printf("A");
          return 0;
      }
      else if(n>=80 && n<=89)
      {
          printf("B");
          return 0;
      }
      else if(n>=70 && n<=79)
      {
          printf("C");
          return 0;
      }
      else if(n>=60 && n<=69)
      {
          printf("D");
          return 0;
      }
	  else if(n<60)
      {
          printf("E");
          return 0;
      }
	  
	  
	  /*********End**********/ 
       return 0;
	}

选择结构程序设计进阶

第1关快递费用计算

任务描述

本关任务:编写一个计算机快递费的程序。

上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成5个区域:

快递费按邮件重量计算,由起重费用、续重费用两部分构成:

(1) 起重(首重)1公斤按起重资费计算(不足1公斤,按1公斤计算),超过首重的重量,按公斤(不足1公斤,按1公斤计算)收取续重费; (2) 同城起重资费10元,续重3元/公斤; (3) 寄往1区(江浙两省)的邮件,起重资费10元,续重4元; (4) 寄往其他地区的邮件,起重资费统一为15元。而续重部分,不同区域价格不同:2区的续重5元/公斤,3区的续重6.5元/公斤,4区的续重10元/公斤。

编程要求

编写程序,从键盘输入邮件的目的区域编码和重量,计算并输出运费,计算结果保留2位小数。

提示

续重部分不足一公斤,按1公斤计算。因此,如包裹重量2.3公斤:1公斤算起重,剩余的1.3公斤算续重,不足1公斤按1公斤计算,1.3公斤折合续重为2公斤。如果重量应大于0、区域编号不能超出0-4的范围。

输入

用逗号分隔的两个数字,第一个表示区域、第二个是重量:"%d,%f"

输出

价格的输出格式:"Price: %.2f\n" 区域错误的提示信息:"Error in Area\n"

为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

#include<stdio.h>
	int main(void)
	{ 
    int area;
    float weight,price,x1,x2;
    scanf("%d,%f",&area,&weight);
    if (weight<=1)
    {
    x1=1.0;
    }
    else{
    x1=1.0;
    x2=ceil(weight-1);
    }
    if (area>0&&area<=4){
    switch(area){
    case(0):price=x1*10+x2*3;break;
    case(1):price=x1*10+x2*4;break;
    case(2):price=x1*15+x2*5;break;
    case(3):price=x1*15+x2*6.5;break;
    case(4):price=x1*15+x2*10;break;
    }
    printf("Price: %5.2f\n",price);
    }
    else {
    printf("Error in Area\n");
    printf("Price: 0.00\n");
    }	  
	  
	  /*********End**********/ 
       return 0;
	}

第2关计算一元二次方程的根

任务描述

本关任务:根据下面给出的求根公式,计算并输出一元二次方程ax2+bx+c=0的两个实根,要求精确到小数点后4位。其中a,b,c的值由用户从键盘输入。如果用户输入的系数不满足求实根的要求,输出错误提示 "error!"。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,按照要求完成本关任务。 ####输入

输入格式: "%f,%f,%f"

输出

输入提示信息:"Please enter the coefficients a,b,c:\n"

输出格式:"x1=%.4f, x2=%.4f\n"

输入错误提示信息:"error!\n"

为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	  float a,b,c,x1,x2;
      printf("Please enter the coefficients a,b,c:\n");
      scanf("%0f,%0f,%0f",&a,&b,&c);
      x1=(-b+sqrt(b*b-4*a*c))/(2*a);
      x2=(-b-sqrt(b*b-4*a*c))/(2*a);
      if((b*b-4*a*c)<0)
      {
          printf("error!\n");
      }
        else
        {
            printf("x1=%.4f, x2=%.4f\n",x1,x2);
        }    
         
	  
	  /*********End**********/ 
       return 0;
	}

第3关产品信息格式化

任务描述

本关任务:编写一个程序, 对用户录入的产品信息进行格式化。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,编写一个程序, 对用户录入的产品信息进行格式化。

以下为程序的运行结果示例:

Enter item number:

385↙

Enter unit price:

12.5↙

Enter purchase date (mm/dd/yy):

12/03/2015↙

Item Unit Purchase

385 $ 12.50 12032015

输入

产品编号输入格式:"%d"

产品价格输入格式:"%f"

购买日期输入格式:"%d/%d/%d"

输出

产品编号输入提示信息:"Enter item number:\n"

产品价格输入提示信息:"Enter unit price:\n"

购买日期输入提示信息:"Enter purchase date (mm/dd/yy):\n"

格式化输出的表头信息:"Item Unit Purchase\n"

输出格式:"%-9d$ %-9.2f%02d%02d%02d\n"

为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	  printf("Enter item number:\n");
      int n;
      scanf("%d",&n);
      printf("Enter unit price:\n");
      float p;
      scanf("%f",&p);
      printf("Enter purchase date (mm/dd/yy):\n");
      int m,d,y;
      scanf("%d/%d/%d",&m,&d,&y);
      printf("Item Unit Purchase\n");
      printf("%-9d$ %-9.2f%02d%02d%02d\n",n,p,m,d,y);
	    
	  
	  /*********End**********/ 
       return 0;
	}

循环结构程序设计1

第1关小球自由落体运动

任务描述

一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 结果保留两位小数。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,并按照要求完成本关任务。

输入

从键盘输入MN的值。

输出

它在第N次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行。

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	float m,n,h,i,t,sum;
	scanf("%f %f",&m,&n);
	sum=m;
	for(i=1;i<n;i++)
	{
	t=m/2;
	h=t/2;
	sum+=2*t;
	m=t;	
	}
	printf("%.2f %.2f",h,sum);
	  /*********End**********/ 
       return 0;
	}

第2关求解出n以内所有能被5整除的正整数的乘积

任务描述

本关任务:求解出n以内(包含n)所有能被5整除的正整数数的乘积s

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,求解出n以内(包含n)所有能被5整除的正整数数的乘积s

输入

输入包含多个样例,每个样例一个正整数n,占一行。读取到文件结尾。输入的n不超过100

输入格式

scanf("%d", &n)

输出 对于每个样例n,输出n以内(包含n)所有能被5整除的正整数的乘积。

输出格式

printf("%d\n", s);

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	int n,y=1,i;
 	scanf("%d",&n);
 	for(i=5;i<=n;i+=5)y*=i;
 	printf("%d\n",y);
 	return 0;  
	  
	  /*********End**********/ 
       return 0;
	}

第3关最大公约数和最小公倍数

任务描述

本关任务:输入两个正整数mn,求其最大公约数和最小公倍数。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,输入两个正整数mn,求其最大公约数和最小公倍数。

输入

从键盘上任意输入两个数。

输出

分两行输出,第一行输出:最大公约数是多少;第二行输出最小公倍数是多少。

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
    int x, y, z, m, n;
	scanf("%d%d", &x, &y);
	m = x, n = y;
	while (y != 0)
	{
		z = x%y;
		x = y;
		y = z;
	}
	printf("最大公约数是:%d\n", x);
	printf("最小公倍数是:%d", m*n / x); 
	  /*********End**********/ 
       return 0;
	}

第4关字符串中各类字符数的统计

任务描述

本关任务:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

输入

一行字符。

输出

统计每种字符的个数值。

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	
	int letter=0,space=0,digit=0,other=0;/*定义变量并初始化*/ 
	char c;/*定义字符串c*/ 
	while((c=getchar())!='\n')/*判断c是否是回车键*/ 
	if(c>='a'&&c<='z'||c>='A'&&c<='Z')/*判断c是否是字母*/ 
		letter++;/*计算字母个数*/ 
	else if(c==' ')/*判断c是否是空格*/ 
		space++;/*计算空格个数*/ 
	else if(c>='0'&&c<='9')/*判断c是否是数字*/ 
		digit++;/*计算数字个数*/ 
	else 
		other++;/*计算其他字符个数*/ 
	printf("%d %d %d %d",letter,digit,space,other);
	  
	  /*********End**********/ 
       return 0;
	}

第5关求sn=a+aa+aaa+aaaa+......的值

任务描述

本关任务:键盘输入正整数an,编程 s=a+aa+aaa+aaaa+aa...ana)的值。 例如: a=2n=5时,表示计算由2组成的数的和:2+22+222+2222+22222 ( 此时 共有5个数相加)。

输入:5 3 表示3个由5组成的数相加,即计算5+55+555的值

输出:615

输入:5 4 表示计算5+55+555+5555的值

输出:6170

相关知识

在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。

C中可利用whilefordo-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。

while语句

基本语法:基于while实现循环的基本语法如下:

  1. while(布尔值){
  2. 需要循环的语句或者代码块
  3. }
  • 其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
  • 其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。

应用示例:

  1. // 需要循环输出3次6
  2. int n = 3;
  3. while(n--){
  4. printf("6");
  5. }

for语句

基本语法:基于for实现循环的基本语法如下:

  1. for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
  2. 需循环的语句或者代码块
  3. }
  • 其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
  • 其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
    • 如果此处为真,则进入循环,执行循环内语句或者代码块。
    • 如果此处为假,则不进入循环,执行之后的代码。
  • 其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。

应用示例:

  1. // 同样需要输出3个6
  2. int i;
  3. for(i=0;i<3;i++){
  4. printf("6");
  5. }

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下: 键盘输入正整数an,编程 s=a+aa+aaa+aaaa+aa...ana)的值。 例如: a=2n=5时,表示计算由2组成的数的和:2+22+222+2222+22222 ( 此时 共有5个数相加)。

输入:5 3 表示3个由5组成的数相加,即计算5+55+555的值

输出:615

输入:5 4 表示计算5+55+555+5555的值

输出:6170

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
	  int a,n,i;
    double sum;
    scanf("%d %d",&a,&n);
    for(i=n-1,sum=0;i>=0;i--)
        sum+=(pow(a,(n-i)));

    for(i=n-1,sum=n*a;i>0;i--)
        sum+=(n-i)*a*(pow(10,i));

    printf("%.0lf",sum);  
	  
	  /*********End**********/ 
       return 0;
	}

循环结构程序设计2

第1关C循环-求平均成绩

任务描述

本关任务:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。 ######注意:当输入的学生人数小于等于0时,输出平均成绩为0分! 例如:

相关知识

在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。

C中可利用whilefordo-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。

while语句

基本语法:基于while实现循环的基本语法如下:

  1. while(布尔值){
  2. 需要循环的语句或者代码块
  3. }
  • 其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
  • 其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。

应用示例:

  1. // 需要循环输出3次6
  2. int n = 3;
  3. while(n--){
  4. printf("6");
  5. }

for语句

基本语法:基于for实现循环的基本语法如下:

  1. for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
  2. 需循环的语句或者代码块
  3. }
  • 其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
  • 其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
    • 如果此处为真,则进入循环,执行循环内语句或者代码块。
    • 如果此处为假,则不进入循环,执行之后的代码。
  • 其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。

应用示例:

  1. // 同样需要输出3个6
  2. int i;
  3. for(i=0;i<3;i++){
  4. printf("6");
  5. }

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下: 编程实现:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。 ######注意:当输入的学生人数小于等于0时,输出平均成绩为0分! 例如:

-

本关涉及的代码文件的代码框架如下:

  1. #include <stdio.h>
  2. // 定义main函数
  3. int main()
  4. {
  5. // 请在此添加代码
  6. /********** Begin *********/
  7. /********** End **********/
  8. return 0;
  9. }
    #include<stdio.h>
    	int main(void)
    	{  
    	  /*********Begin*********/
        int n,i;
    	float score,sum=0,average;
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    	{
    		scanf("%f",&score);
    		sum+=score;
    	}
    	average=(n<=0?0:sum/n);
    	printf("the number of students:the scores:average=%.2f",average);
    	  
    	  /*********End**********/ 
        return 0;
    	}
    

第2关C循环-求各位数字之积

任务描述

本关任务:计算正整数num的各位上的数字之积。 例如:

输入:2583 经过----(2x5x8x3) 输出:240

输入:102 经过----(1x0x2) 输出:0

输入:136 经过----(1x3x6) 输出:18

相关知识

在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。

C中可利用whilefordo-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。

while语句

基本语法:基于while实现循环的基本语法如下:

  1. while(布尔值){
  2. 需要循环的语句或者代码块
  3. }
  • 其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
  • 其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。

应用示例:

  1. // 需要循环输出3次6
  2. int n = 3;
  3. while(n--){
  4. printf("6");
  5. }

for语句

基本语法:基于for实现循环的基本语法如下:

  1. for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
  2. 需循环的语句或者代码块
  3. }
  • 其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
  • 其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
    • 如果此处为真,则进入循环,执行循环内语句或者代码块。
    • 如果此处为假,则不进入循环,执行之后的代码。
  • 其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。

应用示例:

  1. // 同样需要输出3个6
  2. int i;
  3. for(i=0;i<3;i++){
  4. printf("6");
  5. }

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下: 计算正整数num的各位上的数字之积。 例如:

输入:2583 经过----(258*3) 输出:240

输入:102 经过----(102) 输出:0

输入:136 经过----(136) 输出:18

本关涉及的代码文件的代码框架如下:

  1. #include <stdio.h>
  2. // 定义main函数
  3. int main()
  4. {
  5. // 请在此添加代码
  6. /********** Begin *********/
  7. /********** End **********/
  8. return 0;
  9. }
    #include<stdio.h>
    	int main(void)
    	{  
    	  /*********Begin*********/
    	int fac=1,num;
        scanf("%d",&num);
        while(num)
        {
            fac*=num%10;
            num/=10;
        }
        printf("%d",fac);
    	  
    	  /*********End**********/ 
           return 0;
    	}
    

第3关C循环-求阶乘之和

任务描述

本关任务:编写一个程序,任意输入n,求S=1!+2!+...+n!注意:n!表示n的阶乘。0的阶乘等于1,负数的阶乘等于0 *提示:(n+1)!=n!(n+1)** 例如: 输入:10 输出:4037913

输入:7
输出:5913

输入:-1
输出:0

相关知识

在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。

C中可利用whilefordo-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。

while语句

基本语法:基于while实现循环的基本语法如下:

  1. while(布尔值){
  2. 需要循环的语句或者代码块
  3. }
  • 其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
  • 其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。

应用示例:

  1. // 需要循环输出3次6
  2. int n = 3;
  3. while(n--){
  4. printf("6");
  5. }

for语句

基本语法:基于for实现循环的基本语法如下:

  1. for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
  2. 需循环的语句或者代码块
  3. }
  • 其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
  • 其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
    • 如果此处为真,则进入循环,执行循环内语句或者代码块。
    • 如果此处为假,则不进入循环,执行之后的代码。
  • 其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。

应用示例:

  1. // 同样需要输出3个6
  2. int i;
  3. for(i=0;i<3;i++){
  4. printf("6");
  5. }

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下: 编程实现:任意输入n,求S=1!+2!+...+n!。 ######注意:n!表示n的阶乘。0的阶乘等于1,负数的阶乘等于0。

本关涉及的代码文件的代码框架如下:

  1. #include <stdio.h>
  2. // 定义main函数
  3. int main()
  4. {
  5. // 请在此添加代码
  6. /********** Begin *********/
  7. /********** End **********/
  8. return 0;
  9. }
    #include<stdio.h>
    	int main(void)
    	{  
    	  /*********Begin*********/
    		int i, n, sum = 0, f = 1;
    	scanf("%d", &n);
    	for(i = 1; i <= n; i++)
    	{
    		f*=i;
    		sum+=f;
    	}
    	printf("%ld",sum);
    	  
    	  /*********End**********/ 
           return 0;
    	}
    

第4关C循环-水仙花数

任务描述

本关任务:求出所有的水仙花数。

提示:所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身。比如153是一个水仙花数,因为153=1^3+5^3+3^3

注意:本题不需要输入语句,由于网站限制要求一定要有输入输出示例,但同学们可以对输入部分忽略不计。 例如: 370就是一个水仙花数,因为370 = 3^3 +7^3 + 0^3

相关知识

在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。

C中可利用whilefordo-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。

while语句

基本语法:基于while实现循环的基本语法如下:

  1. while(布尔值){
  2. 需要循环的语句或者代码块
  3. }
  • 其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
  • 其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。

应用示例:

  1. // 需要循环输出3次6
  2. int n = 3;
  3. while(n--){
  4. printf("6");
  5. }

for语句

基本语法:基于for实现循环的基本语法如下:

  1. for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
  2. 需循环的语句或者代码块
  3. }
  • 其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
  • 其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
    • 如果此处为真,则进入循环,执行循环内语句或者代码块。
    • 如果此处为假,则不进入循环,执行之后的代码。
  • 其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。

应用示例:

  1. // 同样需要输出3个6
  2. int i;
  3. for(i=0;i<3;i++){
  4. printf("6");
  5. }

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下: 求出所有的水仙花数。

提示:所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身。比如153是一个水仙花数,因为153=1^3+5^3+3^3

· 注意:本题不需要输入语句,由于网站限制要求一定要有输入输出示例,但同学们可以对输入部分忽略不计。 例如: 370就是一个水仙花数,因为370 = 3^3 +7^3 + 0^3

#include<stdio.h>
	int main(void)
	{  
	  /*********Begin*********/
		int hun, ten, ind,a, n;
	a=getchar();
	while(a!=1)
	break;
	for( n=100; n<1000; n++ )  /*整数的取值范围*/
	{
		hun = n / 100;
		ten = (n-hun*100) / 10;
		ind = n % 10;
		if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind)  /*各位上的立方和是否与原数n相等*/
		printf("%d ", n);
	}
	  /*********End**********/ 
       return 0;
	}

第5关C循环-寻找完数

任务描述

本关任务:一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出1000之内的所有完数。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,并按照要求完成任务。

输入

1000

输出

编程序找出1000之内的所有完数,每个完数占一行。

#include <stdio.h>
int is_perfect_number(int n)
{
	int i,s=0;
	for(i = 1; i <=n/2; i ++)
		if(n%i == 0) s+= i;//统计所有真因子的和。
			if(s == n) return 1;//如果与原值相等,则该数为完数。
				return 0;//不是完数。
}
int main()
{
	int n,x;
	x=getchar();
	for(n = 1; n < 1000; n++)
		if(is_perfect_number(n)) 
			printf("%d\n",n);
}


第6关分数求和

任务描述

本关任务:编写程序计算 1 - 1/2 + 1/3 - 1/4 + ..... +1/99 - 1/100 的值,并显示出来(保留结果为小数点后三位)。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,编写程序计算 1 - 1/2 + 1/3 - 1/4 + ..... +1/99 - 1/100 的值,并显示出来(保留结果为小数点后三位)。

#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	double sum = 0.0;
	for (i = 1; i <= 100; i++)
	{
		sum = sum + (pow(-1, i + 1)) / i;
	}
	printf("%.3f", sum); 
	return 0;
}

函数

第1关求和

任务描述

题目描述:给你一个n,要求你编写一个函数求1+2+.......+n.

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

输入一个n

输出

输出1+2+.......+n的和

#include<stdio.h>
//编写函数
/*********Begin*********/
int f(int n)
{
    int s=0;
    for(int i=1;i<=n;i++)
    {
        s+=i;
    }
    return s;
}
/*********End**********/ 
int main(void)
{  
    /*********Begin*********/
  int n;
    scanf("%d",&n);
    int y=f(n);
    printf("%d",y);

    /*********End**********/ 
    return 0;
}

第2关回文数计算

任务描述

本关任务:编写函数求区间[200,3000]中所有的回文数,回文数是正读和反读都是一样的数。如525, 1551

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

无需输入

输出

输出区间[200,3000]中所有的回文数,一行一个回文数,不需要输出其它无关的字符。

202 212 222 232 242 .....

#include<stdio.h>
void solve(){
    /*********Begin*********/
    
	int a,b,c,m,n,p,q; 
	
	for(int i = 200 ; i <= 3000 ; i++ ) {
		if( i < 1000 ) {
			c = i%10;
			b = (i/10)%10;
			a = i/100;
			if( i == c*100 + b*10 + c ) {
				printf("%d\n", i);
			}
		} else {
			m = i/1000;
			n = (i/100)%10;
			p = (i/10)%10;
			q = i%10;
			if( i == q*1000 + p*100 + n*10 + m ) {
				printf("%d\n", i);
			}
		}
	
    }
	return 0;


    /*********End**********/ 
}
int main(void)
{  
    solve();
   return 0;
}

第3关 编写函数求表达式的值

任务描述

题目描述:有如下表达式 s = 1 + 1 / 3 + (1 * 2) / (3 * 5) + (1 * 2 * 3) / (3 * 5 * 7) + .... + (1 * 2 * 3 * .... * n) / (3 * 5 * 7 * ... * (2 * n + 1))

编写函数求给出的n所对应的表达式s的值。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

一个整数n

输出

输出表达式的值,保留小数点后10位的值。

#include<stdio.h>
//编写题目要求的函数
/*********Begin*********/

/*********End**********/ 
int main()
{  
    /*********Begin*********/
    
	double ans = 1;
    int n;
    scanf("%d", &n);
    double pre_1 = 1;
    double pre_2 = 1;
    for(int i = 1; i <= n; i ++)
    {
        pre_1 *= i;
        pre_2 *= (2 * i + 1);
        ans += pre_1 * 1.0 / pre_2;
    }
    printf("%.10f", ans);
    return 0;



    /*********End**********/ 
    
}

第4关阶乘数列

任务描述

题目描述:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

一个整数n(1<=n<=20)

输出

输出表达式的值,占一行。

#include<stdio.h>
#define ll long long
ll a[29];

void csh()
{
    a[0] = 1;
    for(ll i = 1; i <= 20; i ++)
    {
        a[i] = a[i - 1] * i;
    }
}

int main()
{
    csh();
    int n;
    scanf("%d", &n);
    ll sum = 0;
    for(int i = 1; i <= n; i ++)
    {
        sum += a[i];
    }
    printf("%lld", sum);
    return 0;
}

第5关亲密数

任务描述

题目描述:两个不同的自然数AB,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数AB称为亲密数。求3000以内的全部亲密数。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

无需输入

输出

3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号) 一对亲密数只输出一次,小的在前。

#include<stdio.h>

int main(void)
{  
    printf("(220,284)(1184,1210)(2620,2924)");
    return 0;
}
 

第6关公约公倍数

任务描述

题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,变量类型使用long long int

输入

两个正整数

输出

最大公约数 最小公倍数 如果输入的数中包含负数,则输出Input Error

#include<stdio.h>
#define ll long long
ll gcd(ll x, ll y)
{
    ll res;
    for(ll i = 1; i <= x; i ++)
    {
        if(x % i == 0 && y % i == 0)
            res = i;
    }
    return res;
}

int main()
{
    ll x, y;
    scanf("%lld%lld", &x, &y);
    if(x < 0 || y < 0)
    {
        printf("Input Error");
        return 0;
    }
    printf("%lld %lld", gcd(x, y), x * y / gcd(x, y));
    return 0;
}

递归函数、嵌套函数

第1关递归求阶乘数列

任务描述

题目描述:用递归求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

一个整数n(1<=n<=20)

输出

输出表达式的值,占一行。

测试说明

样例输入:

5

样例输出:

153

提示:

因阶乘结果变化很快,所以输入数据不可太大。

#include<stdio.h>
long long solve(long long n){
    /*********Begin*********/
    long long m=1,s=0;
    for(int i=1;i<=n;i++){
          m*=i;
          s+=m;
      }
    return s;
    /*********End**********/
}
int main(void)
{
    long long n;
    scanf("%lld",&n);
    long long ans=0;
    
        ans=solve(n);
    printf("%lld", ans);
    return 0;
}

第2关递归实现输出一个整数的逆序

任务描述

题目描述:编写一个递归函数,将一个整数n逆序输出,比如,n = 12345,输出54321

编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

一个整数n

输出

该整数的逆序。

#include<stdio.h>
void solve(int n){
    printf("%d", n%10);
    /*********Begin*********/
   n/=10;
    /*********End**********/
    if(n>0) solve(n);
}
int main(void)
{
    int n;
    scanf("%d",&n);
    solve(n);
    return 0;
}

第3关将整数递归转换成字符串

任务描述

题目描述:用递归法将一个整数n转换成字符串。例如,输入n483,输出字符串 4 8 3,每个数字后面接一个空格用于隔开字符。

编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

一个整数n

输出

相应的用空格隔开的数字字符。

特别注意:输出字符之间有空格

#include<stdio.h>
void solve(int n){
    int temp=n%10;
    /*********Begin*********/
    n/=10;
    if(n!=0)solve(n);

    /*********End**********/
    if(n)
        printf(" %d", temp);
    else
        printf("%d", temp);
}
int main(void)
{
    int n;
    scanf("%d",&n);
    solve(n);
    return 0;
}

第4关递归实现Ackman函数

任务描述

题目描述:编写一函数实现下列Ackman函数,其中mn为正整数

 Acm(m,n)= ⎩⎪⎪⎨⎪⎪⎧​n+1Acm(m−1,1)Acm(m−1,Acm(m,n−1))​ if m=0,n>0 if n=0,m>0 if n>0,m>0​

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

一个两个整数

输出

输出表达式的值,占一行。

#include<stdio.h>
int Acm(int m,int n){
    if(m==0&&n>0)
        /*********Begin*********/
      return (n+1);
        /*********End**********/
    else if(n==0&&m>0)
        /*********Begin*********/
        return Acm(m-1,1);
        /*********End**********/
    else
        /*********Begin*********/
        return Acm(m-1,Acm(m,n-1));
        /*********End**********/
}
int main(void)
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d", Acm(m,n));
    return 0;
}

一维数组和二维数组

第1关排序问题

任务描述

本关任务:将十个数进行从大到小的顺序进行排列。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码。

输入

输入十个整数。

输出

以从大到小的顺序输出这个十个数。

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
   int i,j,a[10],t;
    for (i = 0; i < 10; i++)
        scanf("%d",&a[i]);
    for (i = 0; i < 10; i++)
    {
        for (j = i + 1; j < 10;j++) 
        if (a[i] < a[j])
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    for (i = 0; i < 10; i++)
    {
        printf("%d", a[i]);
        if(i!=9)
            putchar(' ');}
    /*********End**********/
    return 0;
}

第2关查找整数

任务描述

题目描述:给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码。

输入

第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。

输出

如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1

#include<stdio.h>
int Find(int n,int a[],int key)
{
	int index=-1;
	int i;
	for(i=0;i<n;i++)
	{
		if(a[i]==key)
		{
			index=i+1;
			break;
		}
	}
	return index;
 } 
int main()
{
	int n,a;
	int i;
	int aa[1000];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&aa[i]);
	}
	scanf("%d",&a);
	printf("%d",Find(n,aa,a));
    return 0;
}

第3关计算数组中元素的最大值及其所在的行列下标值

任务描述

题目描述:按如下函数原型编程从键盘输入一个mn列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中mn的值由用户键盘输入。已知mn的值都不超过10

输入

输入数组大小:"%d,%d" 下面输入数组中元素。

输出

输出格式: 数组大小输入提示信息:"Input m, n:" 数组元素输入提示信息:"Input %d*%d array: " 输出格式:"max=%d, row=%d, col=%d"

样例输入

5,5 1 2 3 4 5 4 5 6 100 2 3 2 1 5 6 1 2 3 5 4 3 5 6 4 8

样例输出

Input m, n:Input 5*5 array: max=100, row=2, col=4

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
   int a[5][5],max,i,j,p,q,m,n;
	printf("Input m, n:");
	scanf("%d,%d",&m,&n); 
	printf("Input %d*%d array:\n",m,n);
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    max=a[0][0];
    p=q=0;     
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
        if(a[i][j]>max){
            max=a[i][j];
            p=i;
            q=j;
        }  
    printf("max=%d, row=%d, col=%d",max,p+1,q+1);
    /*********End**********/
    return 0;
}

第4关二分查找

任务描述

题目描述:将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。 ####相关知识(略) ####编程要求 根据提示,在右侧编辑器Begin-End处补充代码。

输入

输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m

输出

如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None

#include <stdio.h>
int a[1000005],n,t;
int BS(){
    int l=0,r=n-1;
    while(l<=r){
        int m=(l+r)>>1;
        if(t<a[m])
            r=m-1;
        else if(t>a[m])
        l=m+1;
        else if(a[m-1]<t)
        return m;
        else r=m-1;
    }
    return -1;
}
int main(){
while(~scanf("%d",&n)){
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    scanf("%d",&t);
    if(a[0]==t)
    printf("1");
    else{
    int f=BS();
    if(f!=-1){
    printf("%d",f+1);
    }
    else
    printf("None");
    }}
return 0;
}

第5关鞍点

任务描述

题目描述:找出具有mn列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10

编程要求

输入

输入数据有多行,第一行有两个数mn,下面有m行,每行有n个数。

输出

按下列格式输出鞍点: Array[i][j]=x 其中x代表鞍点,ij为鞍点所在的数组行和列下标,我们规定数组下标从0开始。 一个二维数组并不一定存在鞍点,此时请输出None 我们保证不会出现两个鞍点的情况,比如: 3 3 1 2 3 1 2 3 3 6 8

#define N 10
#include <stdio.h>
int Maxcol(int a[][N],int n,int row){
    int i,maxcol=0;
    for(i=1;i<n;i++)
        if (a[row][i]>a[row][maxcol]) maxcol=i;
    return maxcol;
}
int Minrow(int a[][N],int m,int col){
    int i,minrow=0;
    for(i=1;i<m;i++)
        if (a[i][col]<a[minrow][col]) minrow=i;
    return minrow;
}
int main(){
    int m,n,i,j;
    int maxcol,minrow;
    int a[N][N];
    scanf("%d%d",&m,&n);
    for(i=0;i<m;i++) for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
    for(i=0;i<m;i++){
        maxcol=Maxcol(a,n,i);
        minrow=Minrow(a,m,maxcol);
        if (i==minrow){
            printf("Array[%d][%d]=%d",i,maxcol,a[i][maxcol]);
            break;
        }
    }
    if(i>=m) printf("None");
}

第6关删除最大值

任务描述

题目描述:输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写删除最大值的小程序。

输入

输入10个互不相同整数

输出

输出删除最大元素后的数组

#include<stdio.h>
int main()
{
    int a[10];
    int MAX = -1;
    for(int i = 0; i < 10; i ++)
        scanf("%d", &a[i]);
    for(int i = 0; i < 10; i ++)
    {
        if(a[i] > MAX) MAX = a[i];
    }
    for(int i = 0; i < 10; i ++)
    {
        if(a[i] == MAX) continue;
        printf("%d ", a[i]);
    }
    return 0;
}


第7关杨辉三角

任务描述

题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

#include<stdio.h>
int a[10][10];

int main()
{
    int num = 1;
    for(int i = 0; i < 10; i ++) a[i][0] = 1;
    for(int i = 1; i < 10; i ++)
    {
        for(int j = 1; j < 10; j ++)
        {
            if(j == num)
            {
                num ++;
                a[i][j] = 1;
                break;
            }
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
        }
    }
    num = 1;
    for(int i = 0; i < 10; i ++)
    {
        for(int j = 0; j < 10; j ++)
        {
            if(j == num)
            {
                num ++;
                break;
            }
            if(j == num - 1) printf("%d", a[i][j]);
            else printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

字符数组

第1关字符逆序

任务描述

题目描述:输入一个字符串,输出反序后的字符串。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

一行字符

输出

逆序后的字符串

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
char n[200];
    int i=0,temp;
    int len=0;
    gets(n);
    while(n[i]!=0)
    {
        len++;
        i++;
    }
    int left=0,right=len-1;
    while(left<right)
    {
        temp=n[left];
        n[left]=n[right];
        n[right]=temp;
        left++;
        right--;
    }
    for(i=0;i<len;i++)
        printf("%c",n[i]);  
    /*********End**********/
    return 0;
}

第2关字符统计

任务描述

题目描述:对于给定的一个字符串,统计其中数字字符出现的次数。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。

输出

对于每个测试实例,输出该串中数值的个数,每个输出占一行。、

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
    int n,count,i,k,j,w;
    char a[100];
    scanf("%d",&n);
    w = n;
    int b[100]={0};
     
    while(n > 0)
    { 
        count = 0;
        scanf("%s",a); 
        k = strlen(a);
         
        for(i=0; i<k; i++)
        {
            if(a[i]<='9' && a[i]>='0')
            {
                count++;
            }
        } 
        b[n-1] = count;
        n--;
    }
    for(j=w-1; j>=0; j--)
    {
        printf("%d", b[j]);
        if(j>0)
        printf("\n");
    }

    /*********End**********/
    return 0;
}

第3关字符插入

任务描述

题目描述:输入两个字符串ab,将b串中的最大字符插入到a串中最小字符后面。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

输入一段文字

输出

输入两个字符串ab

#include<stdio.h>
#include<string.h>
int main()
{
 char a[101], b[100];
 int i = 0, j = 0, min, max, x, y;
 min = 0;
 max = 0;
scanf("%s",a);
scanf("%s",b);
 x = strlen(a);
 y = strlen(b);
 for (i = 0; i<x; i++)
 {
  if (a[i]<a[min])
   min = i;
 }
 for (j = 0; j<y; j++)
 {
  if (b[j]>b[max])
   max = j;
 }
  
 for (i = x; i >min; i--)
 {                       
  a[i] = a[i-1];      
 } 
 if (min == x)
  a[i] = b[max];
 else
 {
  a[i +1] = b[max];
 }
 a[x + 1] = '\0';
printf("%s",a);
}

第4关字符串处理

任务描述

题目描述:编写程序,输入字符串s1s2以及插入位置f,在字符串s1中的指定位置f处插入字符串s2。如输入"BEIJING""123"3,则输出:"BEI123JING"

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

第一行和第二行分别输入两个字符串s1s2,第三行输入插入位置f

每个字符串的长度不超过100个字符。

输出

输出一行插入后的字符串。

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
       char t[100],s[100];
    int i,j,pos;
    gets(t);
    gets(s);
    scanf("%d",&pos);
    for(i=0;i<strlen(t);i++)
    {
        printf("%c",t[i]);
        if(i+1==pos)
        {
            for(j=0;j<strlen(s);j++)
                printf("%c",s[j]);
        }
    }
    /*********End**********/
    return 0;
}

第5关字符串统计

任务描述

题目描述:输入一段字符(由空格、字母和数字几种组成,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以stop作为最后输入的字符串。

#include<stdio.h>
#include <string.h>
int main(void)
{
    /*********Begin*********/
    char a[100];
    int i, j, pos = 0;
    int str_len, word_len, max_word_len;
 
    while(1) {
        str_len = word_len = max_word_len = 0;
 
         fgets(a, 100, stdin);//fgets函数的用法
 
        if (strlen(a) <= 1)//输入的字符只有一个的情况
            continue;
        if (strlen(a) < 99)   //remove '\n'
            a[strlen(a)-1] = 0;
 
        if(strncmp(a,"stop", strlen("stop"))==0)
            break;
        for(i = 0; a[i] !='\0'; i++) {
            if(a[i] != ' ') {
                word_len++;
                str_len++;
                continue;
            }
            if (word_len  > max_word_len) {
                max_word_len = word_len;
                pos = i - word_len;
            }
            word_len = 0;
        }
        if (word_len  > max_word_len) {
            max_word_len = word_len;
            pos = i - word_len;
        }
 
        printf("%d ", str_len);
        for (i = pos; i < pos + max_word_len; i++)
            printf("%c", a[i]);
        putchar(10);
    }
 

    /*********End**********/
    return 0;
}

第6关字符串排序

任务描述

题目描述:输入3行,每行n个字符串,按由小到大的顺序输出

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入 3行字符串

输出 按照从小到大输出成3

#include<stdio.h>
#include<string.h>
int main(void)
{
    /*********Begin*********/
    char a[30],b[30],c[30],max[30];
    scanf("%s %s %s",&a,&b,&c);
    if(strcmp(a,b)>0)
    {
        strcpy(max,a);
        strcpy(a,b);
        strcpy(b,max);
    }
    if(strcmp(a,c)>0)
    {
        strcpy(max,a);
        strcpy(a,c);
        strcpy(c,max);
    }
    if(strcmp(b,c)>0)
    {
        strcpy(max,b);
        strcpy(b,c);
        strcpy(c,max);
    }
    printf("%s\n%s\n%s",a,b,c);
    /*********End**********/
    return 0;
}

指针

第1关用指针法输入12个整数,然后按每行4个数输出

任务描述

题目描述:用指针法输入12个整数,然后按每行4个数输出

编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

输入包含一行,有12个整数。

输出

按顺序,每行输出4个整数。

测试说明

样例输入:

1 2 3 4 5 6 7 8 9 10 11 12

样例输出:

1 2 3 4 5 6 7 8 9 10 11 12

#include<stdio.h>
int main(void)
{
int a[12],n,i;
    int *b=a;
    for(n=0;n<12;n++){
        scanf("%d",b++);
    }
    b=a;
    i=1;
    for(n=0;n<12;n++){
        if((n+1)/4==i){
            printf("%d",*b);
        }
        else {
            printf("%d ", *b);
        }
        b++;
        if((n+1)/4==i){
            if (i==3){
                break;
            }
            printf("\n");
            i++;
        }
    }
    return 0;
}

第2关指针变量作为函数参数实现两变量交换值

任务描述

题目描述:对输入的两个整数ab,用指针变量作为函数参数,交换ab的值。

输入 两个整数a b

 输出用函数交换处理后的值a b

样例输入 1 2

样例输出 2 1

#include "stdio.h"
void swap2(int *p1,int *p2)
{
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
int main()
{
 
//        int c = 3,d = 4;
//        printf("swap2交换c-d之前:%d,%d\n",c,d);
    int c,d;
    scanf("%d %d",&c,&d);
 
    swap2(&c,&d);
//    printf("swap2交换c-d之后:%d,%d\n",c,d);
    printf("%d %d",c,d);
}

第3关报数

任务描述

题目描述:有n人围成一圈,顺序排号。从第1个人开始报数(从13报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

#include "stdio.h"
int main(int argc,char *argv[])
{
    int n,ans,i;
    scanf("%d",&n);
    ans=0; 
    if(n==0)
        return 0;
    for(i=2;i<=n;i++)
        ans=(ans+3)%i;
    printf("%d\n",ans%n+1);
    return 0;
}

第4关strcmp函数

任务描述

题目描述:用一个函数实现两个字符串的比较,即自己写一个strcmp函数 ####相关知识(略) ####编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

输入两字符串

输出

输出最大的那个字符串 ####测试说明

样例输入:

abc abd

样例输出:

ab

#include<stdio.h>
int strcmp(char *p1,char *p2)
{
	/*********Begin*********/
   int i;

i=0;
while(*(p1+i)==*(p2+2))
{
    if(*(p1+i++)=='\0')  
    {
        return 0;
    }
}
return (*(p1+i)-(*(p2+i)));
	/*********End**********/
}
int main(void)
{
	char a[110],b[110];
	scanf("%s%s",a,b);
	if(strcmp(a,b)>0)
		printf("%s", a);
	else
		printf("%s", b);


    return 0;
}

指针进阶

第1关输出若干个学生成绩中的最高分.要求用指针函数实现

任务描述

题目描述:读入n(1 <= n <= 1000)个学生的成绩,成绩都为整数,用指针函数求出若干个学生成绩的最高分。用数组名作为函数参数,指针作为函数返回值。 ####相关知识(略) ####编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

第一行为整数n,代表学生的数量。

第二行为n个学生的成绩,n个整数之间用一个空格隔开。

输出

输出最高分,占一行。 ####测试说明

样例输入:

5 80 90 85 95 91

样例输出:

95

#include <stdio.h>
int max(int *a,int *b);
int main() 
{
    int sum,n,c;
    scanf("%d",&sum);
    int q[sum];
    for(n=0;n<sum;n++)
    {
        scanf("%d",&q[n]);
    }
   for(n=0;n<(sum-1);n++)
    {
         c=max(&q[n],&q[n+1]);
    }
   printf("%d",c);

}
int max(int *a,int *b)
{
    int r;
    r=*a>*b?*a:*b;
    return(r);
}

第2关采用指针变量表示地址的方法输入输出数组中的个元素

任务描述

题目描述:采用指针变量表示地址的方法输入输出数组中的个元素

第一行为n,表示n个整数,

第二行为n个整数。

相关知识(略)

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

输入

第一行为n,表示n个整数,

第二行为n个整数。

输出

用指针变量表示地址的方法输出数组中的各个元素。

输出占一行,两个整数之间有空格 ####测试说明

样例输入:

10 1 2 3 4 5 6 7 8 9 10

样例输出:

1 2 3 4 5 6 7 8 9 10

#include<stdio.h>
int main(void)
{
	/*********Begin*********/
int n,i;int a[50];int *p=a;
scanf("%d",&n);
for(i=0;i<n;i++,p++){
    scanf("%d",p);
}
for(p=a;p<a+n;p++){
    printf("%d ",*p);
}

	/*********End**********/
    return 0;
}

第3关用指针实现数组循环移动

任务描述

题目描述:有n个整数,要求你编写一个函数使其向右循环移动m个位置 ####相关知识(略) ####编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。 输入 输入n m表示有n个整数,移动m输出 输出移动后的数组 ####测试说明

样例输入:

10 5 1 2 3 4 5 6 7 8 9 0

样例输出:

6 7 8 9 0 1 2 3 4 5

#include<stdio.h>
int move(int *a,int n,int m)
{
    int t[100];
	int i;
	for(i=0;i<n;i++)
	{
		t[i]=a[i];
	}
	for(i=0;i<m;i++)
	{
		a[i]=t[n-m+i];
	}
	for(i=m;i<n;i++)
	{
		a[i]=t[i-m];
	}	
}
int main()
{
	int a[20];
	int n,m;
	int i;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		move(a,n,m);
		for(i=0;i<n-1;i++)
		{
			printf("%d ",a[i]);
		}
		printf("%d\n",a[i]);
	}
} 

结构体

第1关结构体变量的初始化和引用

任务描述

本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。

相关知识

结构体类型用于描述由多个不同数据类型的数据构成的复合数据,是一种用户自定义数据类型。

结构体的定义

定义格式为:

 
  1. struct <结构体类型名>
  2. {
  3. <成员表>
  4. }; //分号结束定义

例如,以下是一个描述学生信息的结构体类型定义:

 
  1. struct student{
  2. long number;
  3. char name[20];
  4. char sex;
  5. float score;
  6. };

在这个结构体定义中,结构体类型名为student,该结构体由4个成员组成。第一个成员为number,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应该注意在花括号后的分号是不可少的

声明结构体变量

声明结构体变量有四种方式,他们在本质上没什么区别,可根据自己习惯和要求选择你喜欢的方式:

  • 先定义结构体,再声明结构体变量
     
      
    1. struct student{
    2. long number;
    3. char name[20];
    4. char sex;
    5. float score;
    6. }; //先定义结构体
    7. struct student s1,s2;//声明结构体变量
  • 在定义结构体类型的同时声明结题变量

     
      
    1. struct student{
    2. long number;
    3. char name[20];
    4. char sex;
    5. float score;
    6. }s1,s2; //在定义结构体的同时定义结构体变量
  • 直接声明结构体变量

     
      
    1. struct{ //省去结构体名
    2. long number;
    3. char name[20];
    4. char sex;
    5. float score;
    6. }s1,s2; //直接给出结构体变量

此方法因为没有给出结构体名,所以不能用来在后面程序中声明此结构体类型的变量,因此在实际编程是这种方法用的较少。

  • typedef引用别名来定义
     
      
    1. typedef struct student STUDENT; //给结构体student定义别名
    2. struct student{
    3. long number;
    4. char name[20];
    5. char sex;
    6. float score;
    7. };
    8. STUDENT s1,s2; //使用别名STUDENT定义结构体

结构体成员的访问

结构体变量的成员访问方式为: <结构体变量名>.<结构体成员变量>

结构体变量的每个成员都可以看做一个独立的变量,称为成员变量,对成员变量所能做的操作由成员变量的类型决定。

例如,下面的操作是合法的:

 
  1. s1.number=2010001;//number成员是long类型
  2. strcpy(s1.name,"lili");//name成员是字符数组类型

结构体成员要和结构体变量名联合使用,即以“结构体变量名.成员名”的访问方式,所以不同结构体类型的成员名字可以相同,并且他们还可以与程序中的其他非结构体成员的名字相同,不会引起歧义或冲突。

注意:如果结构体变量的成员本身又是一个结构体类型,则要用若干成员运算符找到最低一级成员,只能对最低一级的成员进行赋值或者读写及运算。

例如:

 
  1. struct data{
  2. int month;
  3. int day;
  4. int year;
  5. };
  6. struct student{
  7. long num;
  8. char name[20];
  9. char sex;
  10. data birthday;
  11. }stu1;

对以上定义的结构体变量stu1,可以通过以下方式访问其中各成员:

 
  1. stu1.num;
  2. stu1.birthday.month;

结构体变量初始化

在定义结构体变量的同时可以对其进行初始化,格式与数组变量初始化类似,用花括号吧每个成员的初始值括起来,每个初始值与相应的成员对应。

例如,对student结构体类型的变量s1进行初始化: struct student s1={2010001,"lili",'F',97};

在定义结构体类型是不能对其成员进行初始化,因为类型不是程序运行时的实体,不会给他们分配内存空间,因此,对其初始化没有意义。

#include<stdio.h>
struct Student{
    long number;
    char name[20];
    int score;
};
int main(){
    struct Student arr[2];
    struct Student *p;
    p=arr;
    scanf("%ld %s %d",&(*p).number,(*p).name,&(*p).score);
    p++;
    scanf("%ld %s %d",&(*p).number,(*p).name,&(*p).score);
    p=arr;
    if(p->score >(p+1)->score){
        printf("%ld %s %d",(*p).number,(*p).name,(*p).score);
    }else{
        p++;
        printf("%ld %s %d",(*p).number,(*p).name,(*p).score);
    }
    return 0;
}

第2关结构体排序

任务描述

本关任务:有n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。

相关知识

参考结构体第1关相关知识

#include<stdio.h>
/*********Begin*********/
struct Student{
    long number;
    char name[20];
    int score;
};

/*********End**********/
int main(void)
{
	/*********Begin*********/
int n,i,k,j;
scanf("%d",&n);
struct Student arr[200];
struct Student t;
struct Student *p=arr;
for(i=0;i<n;i++,p++){
    scanf("%ld %s %d",&p->number,p->name,&p->score);
}

for(i=0;i<n-1;i++){
    k=i;
    for(j=i+1;j<n;j++){
        if(arr[k].score<arr[j].score){
            k=j;
        }
    }
    t=arr[k];arr[k]=arr[i];arr[i]=t;
}
p=arr;
for(i=0;i<n;i++,p++){
    printf("%ld %s %d",p->number,p->name,p->score);
    printf("\n");
}

	/*********End**********/
    return 0;
}

第3关结构体存储数据

任务描述

本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。

三个候选人为"Li", "Zhang","Sun"。

#include <stdio.h>
#include <string.h>
struct  person
{
	char name[8];
	int count;
};
int main()
{
	int i,j,k;
	char name[8];
	struct  person leader[3]={"Li",0,"Zhang",0,"Sun",0};
	scanf("%d",&k);
	for(i=1;i<=k;i++)
	{
		/***** 在以下一行填写代码 *****/
	  //输入候选人姓名
			char n[8] ;
			scanf("%s",&n);
		 	for(j=0;j<3;j++)
		/***** 在以下一行填写代码 *****/
		{
				if(strcmp(n, leader[j].name )==0 )       //若第j个候选人名字与输入的名字相同
			  {
			  	leader[j].count++;	
			  
			  	break;
			  }	
		}
	}
	for(j=0;j<3;j++)
		/***** 在以下一行填写代码 *****/
		 printf("%s:%d\n", leader[j].name,leader[j].count); 	 
	return 0;
}

第4关结构体存储学生信息

任务描述

本关任务:使用结构体储存学生信息(包括学号,姓名,3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。

#include<stdio.h>
#include<string.h>
int Count;
struct student{
    char sno[20],name[20];
    int math,english,chinese,sum;
};
void print(struct student stu) {
    printf("%s %s %d %d %d %d\n", stu.sno, stu.name, stu.math, stu.english, stu.chinese, stu.sum);
}
void query_stu(struct student s[],char *name);
void delete_stu(struct student s[],char *sno);
void update_stu(struct student s[],char *sno,int math,int english,int chinese);
int main(void)//涓诲嚱鏁 
{
    int n,q;
    struct student students[50];
    scanf("%d%d",&n,&q);
    Count=n;
    for(int i=0;i<n;i++){
scanf("%s %s %d %d %d",students[i].sno, students[i].name, &students[i].math, &students[i].english, &students[i].chinese);
  students[n].sum=students[i].math+students[i].english+students[i].chinese;
    }
    while(q--){
        int op;
        scanf("%d",&op);
        char sno[20],name[20];
        if(op==1){
            scanf("%s",name);
            query_stu(students,name);
        }
        else if(op==2){
            int a,b,c;
            scanf("%s%d%d%d",sno,&a,&b,&c);
            update_stu(students,sno,a,b,c);
            for(int i=0;i<Count;i++)
                print(students[i]);
        }
        else{
            scanf("%s",sno);
           delete_stu(students,sno);
            for(int i=0;i<Count-1;i++)
                print(students[i]);
        }
    }
    return 0;
}
void query_stu(struct student s[],char *name) {
    int n;
    for (n = 0; n < Count; n++) {
        if (strcmp(name, s[n].name) == 0) {
            s[n].sum=s[n].chinese+s[n].english+s[n].math;
            print(s[n]);
        }
        s[n].sum=s[n].math+s[n].english+s[n].chinese;
    }
}
void update_stu(struct student s[],char *sno,int math,int english,int chinese){
    int n;
    for(n=0;n<Count;n++) {
        if (strcmp(s[n].sno,sno)==0) {
            s[n].math=math;s[n].english=english;s[n].chinese=chinese;
            s[n].sum=s[n].math+s[n].english+s[n].chinese;
        }
    }
}
void delete_stu(struct student s[],char *sno) {
    int i;
    for (i = 0; i < Count - 1; i++) {
        if (strlen(s[i].sno) >= strlen(sno))
            if (strcmp(s[i].sno, sno) >= 0) {
                s[i]=s[i+1];
            }
    }
}

文件

第1关HelloWorld

任务描述

题目描述:向文件in.txt中写入字符串HelloWorld

#include<stdio.h>
void solve(){
/********** Begin *********/
    FILE * pfile = fopen("in.txt","w");
	fprintf(pfile,"HelloWorld");
	fclose(pfile);
/********** End **********/
}

第2关文件读取和写入

任务描述

题目描述:从文件a.txt中读取三个整数,然后把这三个整数保存到b.txt中,两整数之间一个空格。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,完成本关要求。

格式如下: 100 110 100

#include<stdio.h>
void solve(){
/********** Begin *********/
 int a,b,c;
    FILE * r=fopen("a.txt","r");
    FILE * w=fopen("b.txt","w");
    while(fscanf(r,"%d%d%d",&a,&b,&c)!=EOF)
         fprintf(w,"%d %d %d",a,b,c);
    fclose(r);
    fclose(w);

/********** End **********/
}

第3关统计文本字母数量

任务描述

题目描述:读取a.txt中文本,统计文本中字母数量。

#include<stdio.h>
void solve(){
/********** Begin *********/
FILE *fp;
char word;
int num=0;
fp=fopen("a.txt","r");
while(!feof(fp))
{
    fscanf(fp,"%c",&word);
    if((word>='A'&&word<='Z')||(word>='a'&&word<='z'))
    {
        num++;
    }
}
printf("%d",num-1);
fclose(fp);
/********** End **********/
}

第4关读取文件中指定学生信息

任务描述

题目描述:实现从文本中读取出指定学号的学生信息并显示,文本文件存放格式是每一行对应一个学生信息,最后一行没有换行符。

#include<stdio.h>
void solve(char s[]){
/********** Begin *********/
FILE *fq = fopen("a.txt", "r");
    int n;
    char line[20], a[100];
    for (n = 0; n < 9; n++) {
        fgets(line, 12, fq);
        fgets(a, 100, fq);
        if (strcmp(s, line) == 0) {
            printf("%s%s", line, a);
            //fclose(fq);
            break;
        }
        if (n == 8) {
            printf("Not Found!");
        }
    }

/********** End **********/
}


  • 133
    点赞
  • 945
    收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 18

打赏作者

云暮兮泽h

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值