目录

表达式语句实训

第1关 整型数据的运算:剩下的苹果哪去了

第2关 浮点型数据的运算:你的身材标准吗

第3关 字符型数据的运算:循环加密是怎么实现的

第4关 二进制数据的位运算:字符是怎么存储的

C&C++控制结构实训

第1关 分支结构:是闰年吗

第2关 分支结构:一年中的第几天

第3关 分支结构:重排最大数

第4关 循环结构:黑洞陷阱

第5关 循环结构:是素数吗

第6关 循环结构:素数和

C&C++函数实训

第1关 登月纸桥

第2关 几点几分了?

第3关 这天星期几?

第4关 打印日历

第5关 拆开了输出整数

第6关 递归求P函数


表达式语句实训

第1关 整型数据的运算:剩下的苹果哪去了

// 包含标准输入输出函数库
#include <stdio.h>

// 定义main函数
int main()
{
    // 定义变量,m-苹果数,n-人数,x-人均苹果数
    int m, n, x;
    // 请在Begin-End之间添加代码,计算人均苹果数
    /********** Begin *********/
	scanf("%d%d",&m,&n);
    x = m/n;
    
    
    /********** End **********/
    // 输出人均苹果数
    printf("人均苹果数为:%d",x);
    return 0;
}

第2关 浮点型数据的运算:你的身材标准吗

// 包含标准输入输出函数库
#include <stdio.h>

// 定义main函数
int main()
{
    float up, low;
    // 请在Begin-End之间添加代码,计算标准身材的体重上下限
    /********** Begin *********/
	float height;
	scanf("%f", &height);
	up = (height - 100) * 0.99;
	low = (height - 100) * 0.81;
    
    /********** End **********/
    // 输出标准身材的体重上下限
    printf("体重范围为:%.2f -- %.2f\n",low,up);
    return 0;
}

第3关 字符型数据的运算:循环加密是怎么实现的

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    // c-存储输入的大写字母,d-存储加密后的大写字母
    char c, d;
    // step-秘钥,往前走的步数,大于等于 1,小于 26
    int step;
    // 请在Begin-End之间添加代码,计算密文存入 d 中
    /********** Begin *********/
	cin >> c >> step;
	d = (c + step >= 'Z') ? 'A' + (c + step) % 'Z' - 1 : c + step ;
    
    
    /********** End **********/
    // 输出密文
    cout << d;
    return 0;
}

第4关 二进制数据的位运算:字符是怎么存储的

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    char c;     // c-存储输入的字符
    cin >> c;     // 输入字符
    // 请在Begin-End之间添加代码,输出 c 的 8 位二进制表示
    /********** Begin *********/
	cout << (int)(bool)(c & 0x80) 
		 << (int)(bool)(c & 0x40)
		 << (int)(bool)(c & 0x20)
		 << (int)(bool)(c & 0x10)
		 << (int)(bool)(c & 0x08)
		 << (int)(bool)(c & 0x04)
		 << (int)(bool)(c & 0x02)
		 << (int)(bool)(c & 0x01)
		 << endl;
    /********** End **********/
    return 0;
}

C&C++控制结构实训

第1关 分支结构:是闰年吗

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int year;
    // 请在此添加代码,判断输入的年份是否位闰年,是则输出"Yes",否则输出"No"
    /********** Begin *********/
	
     cin >> year;

     if(year % 400 == 0)

          cout << "Yes" << endl;

     else

            if(year % 4 == 0)

                  if(year % 100 != 0)

                        cout << "Yes" << endl;

           else

                   cout << "No" << endl;

            else

                   cout << "No" << endl;

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

第2关 分支结构:一年中的第几天

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    // y-年,m-月,d-日,n-第几天
    int y, m, d, n;
    // 请在此添加代码,计算并输出指定日期是第几天
    /********** Begin *********/
	scanf("%d %d %d", &y, &m, &d);
    n = d;
    switch(m)
    {
        case 12:
            n += 30;
        case 11:
            n += 31;
        case 10:
            n += 30;
        case 9:
            n += 31;
        case 8:
            n += 31;
        case 7:
            n += 30;
        case 6:
            n += 31;
        case 5:
            n += 30;
        case 4:
            n += 31;
        case 3:
            if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
                n += 29;
            else
                n += 28;
        case 2:
            n += 31;
        case 1:;
    }

    
    /********** End **********/
    printf("%d-%d-%d是第%d天\n",y,m,d,n);
    return 0;
}

第3关 分支结构:重排最大数

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    // n-输入的数,m-重排后的数
    int n, m;
    // 请在此添加代码,输入一个小于1000的正整数,重排出最大的数存入m中
    /********** Begin *********/
    int max, mid, min;

	cin >> n;

	int a = n / 100;// 百位数
	int b = n / 10 % 10;//十位数
	int c = n % 10;//个位数

	//比较三位数的大小,最大值赋给max,中间值赋给mid,最小值赋给min。
	if (a <= b)
	{
		if (c >= b)
		{
			mid = b;
			max = c;
			min = a;
		}
		else if (c >= a)
		{
			mid = c;
			max = b;
			min = a;
		}
		else
		{
			mid = a;
			max = b;
			min = c;
		}
	}
	else
	{
		if (c < b)
		{
			mid = b;
			max = a;
			min = b;
		}
		else if(c < a)
		{
			mid = c;
			max = a;
			min = b;
		}
		else if (c > a)
		{
			mid = a;
			max = c;
			min = b;
		}
	}
	//扩大max到百位,mid到十位,min到个位
	m = max * 100 + mid * 10 + min;
	

    
    
    /********** End **********/
    // 输出重排后的数
    cout << m << endl;
    return 0;
}

第4关 循环结构:黑洞陷阱

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int n;
    // 请在此添加代码,输出整数进入黑洞过程
    /********** Begin *********/
    int h, l;
		int max, mid, min;
		int i = 0;

		cin >> n;

	while(n != 495)
	{
		int a = n / 100;
		int b = n / 10 % 10;
		int c = n % 10;

	
		if (a <= b)
		{
			if (c >= b)
				{
					mid = b;
					max = c;
					min = a;
				}
			else if (c >= a)
				{
					mid = c;
					max = b;
					min = a;
				}
			else
				{
					mid = a;
					max = b;
					min = c;
				}
		}
		else
		{
			if (c < b)
			{
				mid = b;
				max = a;
				min = b;
			}
			else if(c < a)
			{
				mid = c;
				max = a;
				min = b;
			}

			else if (c > a)
			{
				mid = a;
				max = c;
				min = b;	
			}
		}
		h = max * 100 + mid * 10 + min;
		l = min * 100 + mid * 10 + max;

		i ++;

		n = h - l;

		std::cout << i << ":" << h << "-" << l << "=" << n << std::endl;
	}
	
    /********** End **********/
    return 0;
}

第5关 循环结构:是素数吗

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int n;

    // 请在此添加代码,输入正整数n,如果n是素数则输出“Yes”,否则输出“No”
    /********** Begin *********/
int m, sum = 0;
	cin >> n;

	if (n < 2)
		cout << "the number is not primer number / Ce nombre n'est pas prime\n" << endl;
	else 
	{
		for (int i = 2; i < n + 1; i ++)
		{
			m = n % i;
			if (m == 0)
				sum++;
		}
	}

	if (sum > 1)
		cout << "No" << endl;
	else
		cout << "Yes" << endl;



    /********** End **********/

    return 0;
}

第6关 循环结构:素数和

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int n, k;
    // 请在此添加代码,输入n和k,并输出n以内k个素数以及它们的和
    /********** Begin *********/
int sum = 0, s = 0;
	int l = 0;

	cin >> n >> k;


	for(int j = n; j >= 2; j--)
	{
		for (int i = 2; i < j + 1; i ++)
		{
			int m = j % i;
			if (m == 0)
				sum++;
		}
		if (sum <= 1)
		{
			if (s == k)
				break;
			s++;
			l += j;
			cout << j << " ";
		}
		sum = 0;
	}
	cout << l << endl;


    /********** End **********/

    return 0;
}

C&C++函数实训

第1关 登月纸桥

#include <iostream>
using namespace std;

// foldTimes-计算建纸桥的折叠次数
// 参数:dis-星际距离(千米),thick-纸的厚度(毫米)
// 返回值:建桥需要折叠的次数
int foldTimes(double dis, double thick);

int main()
{
    double dis, thick;
    cin >> dis >> thick;
    cout << "需要折叠" << foldTimes(dis,thick) << "次" << endl;
    return 0;
}

int foldTimes(double dis, double thick)
{
    // 请在这里补充代码,实现函数foldTimes
    /********** Begin *********/
    int sum = 0;
	dis = 1000000 * dis;
	while (thick < dis)
	{
		thick *= 2 ;
		sum++;
	}
	return sum;
    
    
    /********** End **********/
}

第2关 几点几分了?

#include <iostream>
using namespace std;

void whatTime(int secs, int &h, int &m, int &s)
{
    // 请在这里补充代码,设计并实现函数whatTime,使main函数中的函数调用正确
    /********** Begin *********/
     h = secs / 3600;
	m = (secs / 60) - (h * 60);
	s = secs % 60;
    
    
    /********** End **********/
}

int main()
{
    int secs;     // secs秒表上的秒数   
    int h, m, s;     // 当前时间:h-小时,m-分,s-秒
    cin >> secs;     // 输入秒表上的秒数
    whatTime(secs,h,m,s);     // 计算当前时间
    cout << h << ":" << m << ":" << s << endl;     // 输出当前时间
    return 0;
}

第3关 这天星期几?

#include <iostream>
using namespace std;

// 函数leapYear
int leapYear(int y)
{
    if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}

// 函数whatDay:计算某年某月某日是星期几
// 参数:year-年,month-月
// 返回值:--7分别表示星期一到星期日
int whatDay(int year, int month)
{
    // 请在这里补充代码,实现函数whatDay
    /********** Begin *********/
     int all_day = 0;
    for (int i=1;i<year;i++){
        if(leapYear(i)){
            all_day += 366;
        }
        else{
            all_day += 365;
        }
    }
    int m[]={0,31,28,31,30,31,30,31,31,30,31,30};
    for (int j=0;j<month;j++){
        if(leapYear(year) && j==2){
            all_day += 29;
        }
        all_day += m[j];
    }
    
    int wday = (all_day+1)%7;
    if(wday == 0){
        wday = 7;
    }
    return wday;

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

int main()
{
    int y, m, xq;     // 年、月、星期几
    cin >> y >> m;     // 输入年月
    xq = whatDay(y,m);     // 计算星期几
    cout << y << "年" << m << "月1日是星期";     // 输出星期
    if(xq == 7)
        cout << "日" << endl;
    else
        cout << xq << endl;
    return 0;
}

第4关 打印日历

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

// 函数printMonth:按要求的格式打印某年某月的日历
// 参数:year-年,month-月
// 返回值:无
void printMonth(int year, int month);

// leapYear:判断闰年
// 参数:y-年
// 返回值:1-是闰年,0-不是闰年
int leapYear(int y)
{
    if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}

// 函数whatDay:计算某年某月的1号是星期几
// 参数:year-年,month-月
// 返回值:1到7--星期1到星期日
int whatDay(int year, int month)
{
    // 1年月日是星期一
    int w = 1;
    int i;

    // 1到year-1都是全年
    for(i = 1; i < year; i++)
    {
        if(leapYear(i))
            w += 366;
        else
            w += 365;
    }
    switch(month)
    {
    case 12: // 加月的
        w += 30;
    case 11: // 加月的
        w += 31;
    case 10: // 加月的
        w += 30;
    case 9:  // 加月的
        w += 31;
    case 8:  // 加月的
        w += 31;
    case 7:  // 加月的
        w += 30;
    case 6:  // 加月的
        w += 31;
    case 5:  // 加月的
        w += 30;
    case 4:  // 加月的
        w += 31;
    case 3:  // 加月的
        if(leapYear(year))
            w += 29;
        else
            w += 28;
    case 2:  // 加月的天
        w += 31;
    case 1:  // 1月不加了
        ;
    }

    // 得到-6,其中为星期天
    w = w % 7;

    // 调整星期天
    if(w == 0)
        w = 7;
    return w;
}

// 请在下面补充代码,实现函数printMonth
/*************** Begin **************/
void printMonth(int y,int m){
    int month_day[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    printf("  一  二  三  四  五  六  日\n");
    int w=0;
    for(int i=1;i<whatDay(y,m);i++){
        printf("    ");
        w++;
    }
    int day = 1;
    while(day <= month_day[m-1]){
        printf("%4d",day);
        day ++;
        w++;
        if(w%7 == 0)    printf("\n");
    }
    
}

/*************** End **************/

int main()
{
    // 年、月
    int y, m;

    // 输入年月
    cin >> y >> m;

    // 输出该年月的日历
    printMonth(y,m);

    return 0;
}

第5关 拆开了输出整数

#include <iostream>
using namespace std;

// 递归函数splitNum:顺序输出n的各位数字,每个数字占一行
// 返回值:无
void splitNum(unsigned int n)
{
    // 请在这里补充代码,实现递归函数splitNum
    /********** Begin *********/
	if(n < 10)  printf("%d\n",n);
    else {
        int m = n%10;
        n = n/10;
        if(n > 9)   splitNum(n);
        else printf("%d\n",n);
        printf("%d\n",m);
    }  
    /********** End **********/
}

int main()
{
    unsigned n;
    cin >> n;     // 输入正整数n
    splitNum(n);     // 调用splitNum函数,顺序输出n的各位数字
    return 0;
}

第6关 递归求P函数

#include <iostream>
using namespace std;

// 函数funP:实现数学函数P函数
// 返回值:返回P(n,x)的值
double funP(int n, double x)
{
    // 请在这里补充代码,实现递归函数funP
    /********** Begin *********/
     if(n == 0)  return 1;
    else if(n == 1)  return x;
    else{
        return ((2*n-1)*funP(n-1,x) - (n-1)*funP(n-2,x))/n;
    }  
    
    
    /********** End **********/
}

int main()
{
    int n;
    double x;
    cin >> n >> x;     // 输入n、x
    cout << "P("<<n<<", "<<x<<")=" << funP(n,x) << endl;
    return 0;
}