【整合贴】c语言期末复习

沈阳航空航天大学习题的整理,仅供参考。

注:此贴为沈阳航空航天大学大一习题汇总贴,包括【选择结构】、【单循环结构】、【三种控制结构】、【多重循环】、【数组】、【函数】、【结构体】、【链表、文件】、【程序设计实验】九个部分。内容与之前发布的文章内容相同,请放心食用。

一、程序设计基础A

选择结构

编程题

1.求圆柱体体积

【问题描述】输入圆柱体的底半径及高度,求体积,体积公式为3.14 * r * r * h。

【输入形式】从键盘输入圆柱体底的半径和高度,以回车结束。

【输出形式】圆柱体体积

【样例输入】2.6 3.21

【样例输出】68.14

【样例说明】输出结果保留两位小数

#include<stdio.h>
int main()
{
	double r, h, t = 0;
	scanf("%lf%lf", &r, &h);
	t = 3.14 * r * r * h;
	printf("%.2f", t);
	return 0;
}

2.找出能够组成的最大三位数

【问题描述】输入三个正整数,这三个整数数值范围在0到9之间,且互不相同,请找出由这三个整数组成的最大三位整数。

【输入形式】输入三个整数,不考虑输入错误的情况,数据之间用单个空格隔开。

【输出形式】输出组成的最大三位整数。

【样例输入】1 2 3

【样例输出】321

#include <stdio.h>
int main()
{
	int a, b, c, t;
	scanf("%d%d%d", &a, &b, &c);
	if (a < b)
	{
		t = a;
		a = b;
		b = t;
	}
	if (b < c)
	{
		t = b;
		b = c;
		c = t;
	}
	if (a < b)
	{
		t = a;
		a = b;
		b = t;
	}
	t = a * 100 + b * 10 + c;
	printf("%d", t);
	return 0;
}

3.判断闰年

【问题描述】写一程序,从键盘上输入年份year(大于400),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。

【输入形式】输入一个大于400的正整数,以回车结束。

【输出形式】输出判断结果。

【样例输入】2000

【样例输出】2000 is

【样例输入】2015

【样例输出】2015 not

#include<stdio.h>
int main()
{
	int year;
	scanf("%d", &year);
	if ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0))
		printf("%d is", year);
	else
		printf("%d not", year);
	return 0;
}

4.比较三个数的大小,并计算三个数的和、积和平均值

【问题描述】编一个程序,从键盘中输入三个整数 a, b, c;比较三个数的大小,然后输出其中最大的数、最小的数、三个数的和、积和平均值。

【输入形式】输入三个整数 a b c

【输出形式】 输出最大数,最小数,三个数的和,三个数的积,平均值。

【样例输入】1 4 2

【样例输出】4 1 7 8 2.33

【样例说明】平均值保留小数点后2位。

#include<stdio.h>
int main()
{
	int a, b, c, t, num, ji;
    float ave;
	scanf("%d%d%d", &a, &b, &c);
	if (a < b)
	{
		t = a;
		a = b;
		b = t;
	}
	if (b < c)
	{
		t = b;
		b = c;
		c = t;
	}
	if (a < b)
	{
		t = a;
		a = b;
		b = t;
	}
    num = a + b + c;
    ji = a * b * c;
    ave = ( a + b + c ) / 3.0;
	printf("%d %d %d %d %.2f", a, c, num, ji, ave);
	return 0;
}

5.判断水仙花数

【问题描述】判断一个三位正整数是否是水仙花数。水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身,例如153。

【输入形式】输入一个三位正整数 n

【输出形式】输出 n is narcissistic number 或 n is not narcissistic number

【样例输入】153

【样例输出】153 is narcissistic number

【样例输入】100

【样例输出】100 is not narcissistic number

#include<stdio.h>
int main()
{
	int a, b, c, n;
	scanf("%d", &n);
	a = n / 100;
	b = n % 100 / 10;
	c = n % 10;
	if (n == a * a * a + b * b * b + c * c * c)
		printf("%d is narcissistic number", n);
	else
		printf("%d is not narcissistic number", n);
	return 0;
}

6.判断一个整数能否被3,7整除

【问题描述】编一个程序,输入一个整数 n,判断它能否被3,7整除;

若能同时被3,7整除则输出 n is divisible by 3 and 7;

能被其中一个数整除输出 n is divisible by 3 or 7;

不能被3,7整除输出 n is not divisible by 3 or 7。

【输入形式】输入正整数 n

【输出形式】 输出提示信息。

【样例输入】2

【样例输出】2 is not divisible by 3 or 7

【样例输入】7

【样例输出】7 is divisible by 3 or 7

【样例输入】105

【样例输出】105 is divisible by 3 and 7

#include<stdio.h>
int main()
{
	int a;
	scanf("%d", &a);
	if (a % 3 == 0)
	{
		if (a % 7 == 0)
			printf("%d is divisible by 3 and 7", a);
		else
			printf("%d is divisible by 3 or 7", a);
	}
	else
	{
		if (a % 7 == 0)
			printf("%d is divisible by 3 or 7", a);
		else
			printf("%d is not divisible by 3 or 7", a);
	}
	return 0;
}

7.根据年和月的值输出该月的天数

【问题描述】从键盘输入年和月的值,然后输出该月的天数。

【输入形式】<年值><空格><月值>

【输出形式】<天数值>

【样例输入】2012 2

【样例输出】 February 2012 has 29 days

【样例输入】2011 7

【样例输出】July 2011 has 31 days

#include<stdio.h>
int main()
{
    int year, month;
    scanf("%d %d", &year, &month);
    switch (month)
    {
    case 2:if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
        printf("February %d has 29 days\n", year);
          else
        printf("February %d has 28 days\n", year);
        break;
    case 1:printf("January %d has 31 days\n", year); break;
    case 3:printf("March %d has 31 days\n", year); break;
    case 5:printf("May %d has 31 days\n", year); break;
    case 7:printf("July %d has 31 days\n", year); break;
    case 8:printf("August %d has 31 days\n", year); break;
    case 10:printf("October %d has 31 days\n", year); break;
    case 12:printf("December %d has 31 days\n", year); break;
    case 4:printf("April %d has 30 days\n", year); break;
    case 6:printf("June %d has 30 days\n", year); break;
    case 9:printf("September %d has 30 days\n", year); break;
    case 11:printf("November %d has 30 days\n", year); break;
    }
    return 0;
}

片段题

1.判断一个整数的正负

【问题描述】判断一个整数的正负。输入1个整数。如果输入的为正,则输出1;如果输入的为负则输出-1;如果输入的为0,则输出0。

【输入形式】1个整数

【输出形式】1个整数

【样例输入】-5

【样例输出】-1

#include <iostream>
#include <stdio.h>
int main()
{
    int a, b;
    scanf("%d", &a);
    if (a < 0)
    {
        b = -1;
    }
    else if (a == 0)
    {
        b = 0;
    }
    else
    {
        b = 1;
    }
    printf("%d", b);
	return 0;
}

2.一个简单计算器

【问题描述】一个简单计算器,根据用户输入的操作数和操作类型进行算术运算,最后打印计算结果。

【输入形式】2*2

【输出形式】4.000000

【评分标准】程序每个注释found下面有一个错误,共2处错误,其他内容保持不变,使之功能符合要求。

#include <iostream>
#include<stdio.h>
int main(void)
{
    float x, y, z = 0;
    /*************found************/
    char n;
    scanf("%f%c%f", &x, &n, &y);
    /*************found************/
    switch (n)
    {
    case '+':  z = x + y;  break;
    case '-':  z = x - y;  break;
    case '*':  z = x * y;  break;
    case '/':  z = x / y;  break;
    }
    printf("%f", z);
    return 0;
}

3.将输入的小写英文字母修改为大写英文字母

【问题描述】输入1个字符,如果是小写英文字母,则将其修改为大写英文字母,并输出该大写字母;如果是其它字符,则保持不变,原样输出。

【输入形式】1个字符

【输出形式】1个字符

【样例输入】e

【样例输出】E

【样例输入】6

【样例输出】6

#include <iostream>
#include <stdio.h>
int main()
{
    char w;
    scanf("%c", &w);
    if (w >= 'a' && w <= 'z')
        w = w - 32;
    printf("%c", w);
	return 0;
}

4.输入一个五分制的考试成绩输出对应的百分制分数段

【问题描述】输入一个五分制的考试成绩(大写字母A~E),输出对应的百分制分数段。

A对应90~100,

B对应80~89,

C对应70~79,

D对应60~69,

E对应<60,

其它对应error。

【输入形式】1个字符

【输出形式】1个字符串

【样例输入】D

【样例输出】60~69

#include <iostream>
#include <stdio.h>
int main()
{
    char grade;
    scanf("%c", &grade);
    switch (grade)
    {
    case 'A':printf("90~100"); break;
    case 'B':printf("80~89"); break;
    case 'C':printf("70~79"); break;
    case 'D':printf("60~69"); break;
    case 'E':printf("<60"); break;
    default:printf("error");
    }
	return 0;
}

单循环结构

编程题

1.求水仙花数的个数

【问题描述】输出区间[a, b]内所有水仙花数的个数。(水仙花数指一个三位数其各位的立方和等于该数,如:153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3。)

【输入形式】包含2个正整数a, b(a <= b; 例如:[100, 999])

【输出形式】输出区间[a, b]内的所有水仙花数个数

【样例输入】100 200

【样例输出】1

#include<stdio.h>
int main()
{
	int m, n, a, b, c, i = 0;
	scanf("%d%d", &m, &n);
	while (m <= n)
	{
		a = m / 100;
		b = m % 100 / 10;
		c = m % 10;
		if (m == a * a * a + b * b * b + c * c * c)
			i++;
		m++;
	}
	printf("%d\n", i);
	return 0;
}

2.完数判断程序

【问题描述】一个数如果恰好等于它的真因子之和,这个数就称为"完数"。例如,6的真因子有1、2、3,而6=1+2+3,因此6是"完数"。从键盘输入一个正整数m,判断其是否是完数,并按下面格式输出判断结果:

1、m是完数:6=1+2+3

2、m不是完数,真因子之和小于m:4>1+2

2、m不是完数,真因子之和大于m:12<1+2+3+4+6

【输入形式】输入正整数m。

【输出形式】判断m是否为完数并输出可能的结果。

【样例输入】6

【样例输出】6=1+2+3

【样例输入】4

【样例输出】4>1+2

【样例输入】12

【样例输出】12<1+2+3+4+6

#include <stdio.h>
int main()
{
    int n, i, sum = 0;
    scanf("%d", &n);
    for (i = 1; i < n; i++)
    {
        if (n % i == 0)
            sum += i;
    }
    if (n == sum)
    {
        printf("%d=1", n);
        for (i = 2; i < n; i++)
        {
            if (n % i == 0)
                printf("+%d", i);
        }
    }
    else if (n > sum)
    {
        printf("%d>1", n);
        for (i = 2; i < n; i++)
        {
            if (n % i == 0)
                printf("+%d", i);
        }
    }
    else if (n < sum)
    {
        printf("%d<1", n);
        for (i = 2; i < n; i++)
        {
            if (n % i == 0)
                printf("+%d", i);
        }
    }
    return 0;
}

3.整数反序输出

【问题描述】输入一个正整数m,将该数反序输出,如1234,反序输出为4321。

【输入形式】输入正整数m。

【输出形式】反序输出m。

【样例输入】1234

【样例输出】4321

【样例输入】100

【样例输出】1

#include <stdio.h>
int main()
{
	int a, b, sum = 0;
	scanf("%d", &a);
	b = a;
	while (b != 0)
	{
		sum = sum * 10 + b % 10;
		b = b / 10;
	}
	printf("%d", sum);
	return 0;
}

片段题

1..求多项式1+2+3+...+n 的前n项之和

【问题描述】求多项式 1+2+3+...+n 的前n项之和。n值由键盘输入(n不大于100)。

【输入形式】1个整数

【输出形式】1个整数

【样例输入】3

【样例输出】6

#include <iostream>
#include <stdio.h>
int main()
{
    int i, n, sum;
    sum = 0;//1
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
        sum = sum + i;//2
    printf("%d", sum);
    return 0;
}

2.某序列求和

【问题描述】从键盘输入正整数 n,编程实现序列 2/1,3/2,5/3,8/5,13/8,21/13 ...... 的前 n 项之和。

【输入形式】输入正整数 n。

【输出形式】输出求和结果,保留小数点后两位。

【样例输入】1

【样例输出】2.00

【样例输入】25

【样例输出】40.75

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n;
    double sum = 0;

    scanf("%d", &n);
    int i;
    double x = 2, y = 1, t;
    for (i = 1; i <= n; i++)
    {
        sum += x / y;
        t = x;          //把分子的值赋给t
        x = y + x;      //把x+y的值赋给分母x 
        y = t;          //把t的值赋给分子
    }
    printf("%.2lf", sum);
    return 0;
}

三种控制结构

编程题

1.温度转换

【问题描述】输入一个以摄氏度表示的温度,根据公式转换为华氏度并输出,结果保留小数点后两位。

F=1.8C+32

【输入形式】输入摄氏度以回车结束

【输出形式】输出华氏度

【样例输入】10.5

【样例输出】50.90

#include <stdio.h>
int main()
{
	float f, c;
	scanf("%f", &c);
	f = 1.8 * c + 32;
	printf("%.2f", f);
	return 0;
}

2.计算天数

【问题描述】输入年、月、日,用程序计算一下该日期是这一年的第几天。

【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。

【输出形式】输出计算的结果

【样例输入】2015 2 1

【样例输出】32

#include <stdio.h>
int main()
{
	int y, m, d, t, i;
	scanf("%d%d%d", &y, &m, &d);
	for (t = 1; t < m; t++)
	{
		switch (t)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:i += 31; break;
		case 4:
		case 6:
		case 9:
		case 11:i += 30; break;
		case 2:if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
		{
			i += 29;
			break;
		}
			  else
		{
			i += 28;
			break;
		}
		}
	}
	i += d;
	printf("%d", i);
	return 0;
}

3.沈阳市居民生活用电阶梯电价收费问题

【问题描述】沈阳市居民生活用电已经实行阶梯电价,用户每月耗电第一档电量为180度及以内,每度电0.50元;第二档电量为180度以上至280度,每度电0.55元;第三档电量为280度及以上,每度0.85元。现要求输入某居民用电量,输出其应缴费用,小数点后保留1位。

【输入形式】<非负整数><enter>

【输出形式】<浮点数>

【样例输入】180

【样例输出】90.0

【样例输入】280

【样例输出】145.0

【样例输入】380

【样例输出】230.0

#include <stdio.h>
int main()
{
	float a, b;
	scanf("%f", &a);
	if (a <= 180)
		printf("%.1f", b = a * 0.5);
	if (a > 180 && a <= 280)
		printf("%.1f", b = (a - 180) * 0.55 + 180 * 0.5);
	if (a > 280)
		printf("%.1f", b = (a - 280) * 0.85 + 100 * 0.55 + 180 * 0.5);
	return 0;
}

4.计算战机需要的加油量

【问题描述】不同的战机飞行时平均油耗是不同的,歼十百公里耗油是142升,F16百公里耗油是146升,苏27百公里耗油是312升,现知道飞机型号和所需飞行的公里数,请计算一下,该战机所需的油量是多少?(注:百公里耗油是指一百公里需要的油量)

【输入形式】输入两个数据,第一个整数表示战机的型号,整数1代表歼十,整数2表示F16,整数3表示苏27;第二个实数表示飞机将要飞行的公里数。

【输出形式】输出所需的油量,输出保留两位小数。

【样例输入】2 300

【样例输出】438.00

【样例输入】4 100

【样例输出】error

【样例输入】1 -100

【样例输出】error

【样例说明】程序中实数定义统一用double类型。

#include <stdio.h>
int main()
{
	int a;
	double b;//a战机//b公里数
	scanf("%d%lf", &a, &b);
	if (a > 3 || a < 1 || b < 0)
		printf("error");
	else
	{
		switch (a)
		{
		case 1:printf("%.2lf", b / 100 * 142); break;
		case 2:printf("%.2lf", b / 100 * 146); break;
		case 3:printf("%.2lf", b / 100 * 312); break;
		}
	}
	return 0;
}

5.统计一行字符中不同字符个数

【问题描述】输入一行字符,分别统计其中的英文字母、空格、数字和其它字符的个数。

【输入形式】一行字符,以回车结束

【输出形式】<字母数> <空格数> <数字数> <其它字符数>

【样例输入】hello world 2015!

【样例输出】10 2 4 1

#include<stdio.h>
int main()
{
    int c = 0, space = 0, num = 0, other = 0;
    char ch;
    while ((ch = getchar()) != '\n')
    {
        if (ch <= 'z' && ch >= 'a' || ch <= 'Z' && ch >= 'A')
        {
            c++;
        }
        else if (ch <= '9' && ch >= '0')
        {
            num++;
        }
        else if (ch == ' ')
        {
            space++;
        }
        else
        {
            other++;
        }
    }
    printf("%d %d %d %d", c, space, num, other);
	return 0;
}

6.电文加密

【问题描述】某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后再除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

【输入形式】输入原码,以回车结束。

【输出形式】输出密文

【样例输入】1234

【样例输出】9876

【样例输入】9876

【样例输出】1234

#include<stdio.h>
int main()
{
	int a, ge, shi, bai, qian;
	scanf("%d", &a);
	ge = ( a % 10 + 5 ) % 10;
	shi = ( a / 10 % 10 + 5 ) % 10;
	bai = ( a / 100 % 10 + 5 ) % 10;
	qian = ( a / 1000 % 10 + 5 ) % 10;
	printf("%d", ge * 1000 + shi * 100 + bai * 10 + qian);
	return 0;
}

7.统计N以内的完全平方数

【问题描述】统计N(N<100000)以内的完全平方数的个数(一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数,也叫做平方数,比如:0,1,4,9,16,25,36等。)

【输入形式】整数N

【输出形式】个数

【样例输入】25

【样例输出】6

#include<stdio.h>
int main()
{
	int N, i, n = 0;
	scanf("%d", &N);
	for (i = 0; i * i <= N; i++)
		n++;
	printf("%d", n);
	return 0;
}

片段题

1.输出休息或者上班

【问题描述】用户输入一个介于 [0,100] 区间的任意整数a后,程序将a对7进行取模运算后,转换为一个介于 [1,7] 区间的整数b。如果b是6或者是7,则打印“休息”;否则打印“上班”。

【输入形式】1个整数

【输出形式】1个字符串

【样例输入】0

【样例输出】上班

#include <iostream>
#include "stdio.h"
int main()
{
    int a, b;
    printf("输入介于[0,100]区间的任意整数:");
    scanf("%d", &a);
    b = a % 7 + 1;
    if (b != 6 && b != 7)
        printf("上班");
    else
        printf("休息");
	return 0;
}

2.求整数中特定位的数字并输出

【问题描述】输入2个正整数n和k,返回n中从右向左数第k位数字的值。

【输入形式】输入两个正整数,正整数之间用单个空格隔开。

【输出形式】输出一个正整数

【样例输入】231456 3

【样例输出】4

【样例输入】1456 5

【样例输出】0

#include <iostream>
#include <stdio.h>
int main()
{
    long n;
    int m, k;
    int i = 0;
    scanf("%ld%d", &n, &k);
    while (i < k)
    {
        m = n % 10;
        n = n / 10;
        i++;
    }
    printf("%d", m);
    return 0;
}

多重循环

编程题

1.百钱百鸡问题

【问题描述】原始题目:一只公鸡 5 文钱,一只母鸡 3 文钱,三只小鸡 1 文钱,用 100 文钱买 100 只鸡,请问公鸡,母鸡,小鸡各多少只?现要求钱数和要买的鸡的数量由键盘输入,列举出所有可能的购买情况。

【输入形式】输入两个正整数 m 和 c,分别表示准备的钱数和要买的鸡的总量。

【输出形式】输出所有可能的购买情况(每种购买情况占一行,按照公鸡数量递增显示;每行显示顺序为公鸡数量、母鸡数量、小鸡数量;不考虑无解情况)。

【样例输入】100 100

【样例输出】备注:输出时行与行之间无空行。

cock=4 hen=18 chicken=78

cock=8 hen=11 chicken=81

cock=12 hen=4 chicken=84

【样例说明】友情提示:购买方案不会出现 0 只,小鸡数量一定是 3 的倍数。可以用三重循环,但也完全可以用二重循环!

#include<stdio.h>
int main()
{
	int m, c, cock, hen, chicken;
	scanf("%d%d", &m, &c);
	for (cock = 1; cock <= m / 5; cock++)
	{
		for (hen = 1; hen <= m / 3; hen++)
		{
			chicken = c - cock - hen;
			if (5 * cock + 3 * hen + chicken / 3 == m && chicken % 3 == 0)
				printf("cock=%d hen=%d chicken=%d\n", cock, hen, chicken);
		}
	}
	return 0;
}

2.组成三位数问题

【问题描述】1、2、3、4、5组成互不相同且无重复数字的三位数。

【输出形式】输出的三位数按由小到大排序,数据之间用两个空格隔开。

#include<stdio.h>
int main()
{
	int g, s, b;
	for (b = 1; b <= 5; b++)
		for (s = 1; s <= 5; s++)
			for (g = 1; g <= 5; g++)
				if (b != s && s != g && b != g)
					printf("%d  ", b * 100 + s * 10 + g);
	return 0;
}

3.九九乘法表

【问题描述】输出乘法表。

【输入形式】输入要输出的乘法表行数。

【输出形式】输出相应的乘法表。

【样例输入】3

【样例输出】

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

【样例说明】

1、输入的整数应在1-9之间;

2、输出同一行的两个算式之间用两个空格隔开。

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

4.取任意个红白黑球,共有多少种解决方案?

【问题描述】从3个红球、5个白球和6个黑球中任意取出M个球,其中必须至少有1个红球,输出共有多少种可能方案。

【输入形式】输入整数M

【输出形式】解决方案的数目sum或错误信息”The value of M is wrong!"

【样例输入】8

【样例输出】sum=17

【样例输入】1

【样例输出】sum=1

【样例输入】-2

【样例输出】The value of -2 is wrong!

【样例输入】0

【样例输出】The value of 0 is wrong!

【样例输入】15

【样例输出】The value of 15 is wrong!

#include<stdio.h>
int main()
{
	int M, h, b, e, sum = 0;
	scanf("%d", &M);
	if (M < 1 || M > 14)
		printf("The value of %d is wrong!", M);
	else
	{
		for (h = 1; h <= 3; h++)
			for (b = 0; b <= 5; b++)
				for (e = 0; e <= 6; e++)
					if (h + b + e == M)
						sum++;
		printf("sum=%d", sum);
	}
	return 0;
}

片段题

1.判断强数

【问题描述】强数(strong number)的意思就是,一个正整数的各位阶乘之和等于它自身。输入任一个正整数,判断它是否是强数,是则输出'y',否则'n'。

【输入形式】一个正整数

【输出形式】y||n

【样例1输入】145

【样例1输出】y

【样例2输入】200

【样例2输出】n

#include <iostream>
#include <stdio.h>
int main()
{
	int n, i, p, sum, t;
	scanf("%d", &n);
	t = n;
	while (t != 0)
	{
		p = t % 10;
		for (i = p - 1; i > 1; i--)
			p = p * i;
		sum += p;
		t /= 10;
	}
	if (n == sum)
		printf("y");
	else printf("n");
	return 0;
}

2.求 [2,n] 区间所有素数之和

【问题描述】输入不小于2的正整数n,求 [2,n] 区间所有素数之和。其中n不大于100。

【输入形式】1个整数

【输出形式】1个整数

【样例输入】5

【样例输出】10

(1)使用sqrt
#include <iostream>
#include <stdio.h>
#include <math.h>
int main()
{
    int m, i, k, n, sum = 0;
    scanf("%d", &n);
    for (m = 2; m <= n; m++)//1
    {
        k = sqrt((double)m);
        for (i = 2; i <= k; i++)
            if (m % i == 0) 
                break;//2
        if (i >= k + 1)
            sum = sum + m;
    }
    printf("%d", sum);
	return 0;
}
(2)不使用sqrt
#include<stdio.h>
int main()
{
	int n, i, k, sum = 0;
	scanf("%d", &n);
	for (i = 2; i <= n; i++)
	{
		for (k = 2; k < i; k++)
		{
			if (i % k == 0)//不是素数
				break;
		}
		if (k == i)//是素数
			sum += i;
	}
	printf("%d", sum);
	return 0;
}

数组

编程题

1.求多个学生的平均成绩

【问题描述】一个学习小组有5个人,每个人有三门课(高数、英语和C语言)的考试成绩,求每人的平均成绩。按行输出每个学生的各科成绩及平均成绩。

【输入形式】按高数、英语和C语言课程顺序输入每个学生的成绩。
【输出形式】按行输出每个同学每个同学的每门课成绩及平均成绩。
【样例输入】

95 84 74 60 35

87 67 98 78 69

98 89 78 76 67
【样例输出】

95 87 98 93.33

84 67 89 80.00

74 98 78 83.33

60 78 76 71.33

35 69 67 57.00
【样例说明】输出每个同学信息各占一行,且平均成绩保留两位小数

#include<stdio.h>
int main()
{
	int a[3][5], m, n;
	float sum;
	for (m = 0; m < 3; m++)
		for (n = 0; n < 5; n++)
			scanf("%d", &a[m][n]);
	for (n = 0; n < 5; n++)
	{
		sum = 0;
		for (m = 0; m < 3; m++)
		{
			printf("%d ", a[m][n]);
			sum += a[m][n];
		}
		printf("%.2f\n", sum / 3);
	}
	return 0;
}

2.顺序查找

【问题描述】输入一组整数和一个待查数据,在一组整数中查找待查数据是否存在。
【输入形式】输入一个整数n,表示一组整数的个数(个数不会超过50个),输入n个整数,输入一个待查数据。
【输出形式】如果查找成功,返回该数据在数组中的下标;如果查找失败,输出no。
【样例输入】5  34 23 12 14 76 12
【样例输出】2

【样例输入】7  4  2  32  41 47  61  81  90
【样例输出】no
【样例说明】数据之间用空格隔开

#include<stdio.h>
int main()
{
	int n, arr[50], i, x;//x查找数
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	scanf("%d", &x);
	for (i = 0; i < n; i++)
	{
		if (x == arr[i])
		{
			printf("%d", i);
			break;
		}
		if (i == n - 1)
			printf("no");
	}
	return 0;
}

3.数组最大、最小元素与第一个和最后一个元素的对调

【问题描述】输入n个整数,其中n为大于等于2 的正整数。将数组中最大元素与第一个元素对调,最小元素与最后一个元素对调,并输出新数组。
【输入形式】n及n个整数
【输出形式】n个整数
【样例输入】10 1 2 3 4 5 6 7 8 9 10
【样例输出】10 2 3 4 5 6 7 8 9 1

#include<stdio.h>
int main()
{
	int n, arr[100], i, s;//a最大下标,m最小下标,s换数
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	int max = arr[0], a = 0;
	for (i = 0; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			a = i;
		}
	}
	s = arr[0];
	arr[0] = arr[a];
	arr[a] = s;
	int min = arr[0], m = 0;
	for (i = 0; i < n; i++)
	{
		if (arr[i] < min)
		{
			min = arr[i];
			m = i;
		}
	}
	s = arr[n - 1];
	arr[n - 1] = arr[m];
	arr[m] = s;
	for (i = 0; i < n; i++)
		printf("%d ", arr[i]);
	return 0;
}

4.院士名单排序

【问题描述】2019年11月22日,中国科学院、中国工程院公布了2019年两院院士增选结果。共选举产生64名科学院院士和75名工程院院士、20名外籍科学院院士和29名外籍工程院院士。其中来自航空航天领域的新科学院院士有2名,分别是李东旭(女)和祝学军(女)。新工程院院士共8人,分别是曹喜滨、向锦武、肖龙旭、朱广生、魏毅寅、宫声凯、曹建国、李贤玉(女)。请输入某两位院士的汉语拼音,按照字典次序进行排列并输出排列结果。

【输入形式】输入两个院士名字的汉语拼音,中间用空格隔开,不包含空格。

【输出形式】排序后的两个院士的名字的汉语拼音,中间用空格隔开。

【样例输入】lidongxu zhuxuejun

【样例输出】lidongxu zhuxuejun

【样例输入】caoxibin caojianguo

【样例输出】caojianguo caoxibin

(1)使用字符串库函数
#include<stdio.h>
#include<string.h>
int main()
{
	char name1[50], name2[50];
	scanf("%s %s", name1, name2);
	int cmp = strcmp(name1, name2);
	if (cmp <= 0)
		printf("%s %s", name1, name2);
	else
		printf("%s %s", name2, name1);
	return 0;
}
(2)不使用字符串库函数
#include<stdio.h>
int main()
{
	int i, t;
	char a[50], b[50];
	scanf("%s %s", a, b);
	for (i = 0; i < 50; i++)
	{
		if (a[i] > b[i])
		{
			t = 1;
			break;
		}
		if (a[i] < b[i])
		{
			t = 0;
			break;
		}
	}
	if (t == 0)
		printf("%s %s", a, b);
	if (t == 1)
		printf("%s %s", b, a);
	return 0;
}

5.计算两个二维数组的差

【问题描述】输入两个同为m*n的二维整数数组A和B(m,n<10),计算A-B的差并输出。
【输入形式】m|n|第1个m*n二维数组A|第2个m*n二维数组B
【输出形式】m*n二维数组C
【样例输入】

2

3

1 2 3

4 5 6

-1 -2 -3

-4 -5 -6

【样例输出】

2 4 6

8 10 12

#include<stdio.h>
int main()
{
	int m, n;
	int a[10][10], b[10][10], c[10][10];
	int i, j;
	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++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &b[i][j]);
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			c[i][j] = a[i][j] - b[i][j];
			printf("%d ", c[i][j]);
		}
		printf("\n");
	}

	return 0;
}

6.将数组按照每5个一组分组,求其平均值

【问题描述】输入一个整数的数组,按从前到后次序进行分组,每组包含5个数,剩余不足5个数自成一组。分别对每组数计算其平均值。
【输入形式】首先输入数组个数n,再分别输入n个数组元素,数据之间用空格隔开。数组元素不超过50个。
【输出形式】输出求出的若干个平均值,每个数据之间用空格隔开,平均值用double表示,保留两位小数。
【样例输入】8 7 6 5 1 12 4 5 11
【样例输出】6.20 6.67

#include <stdio.h>
int main()
{
    int n, i, j, count;
    double sum = 0, avg;
    int arr[100];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < n; i += 5)
    {
        count = 0;
        for (j = i; j < i + 5 && j < n; j++)
        {
            sum += arr[j];
            count++;
        }
        avg = sum / count;
        printf("%.2f ", avg);
        sum = 0;
    }
    return 0;
}

7.折半查找

【问题描述】输入一组有序整数和一个待查整数,用折半查找法查找待查数据是否在这有序数中。
【输入形式】输入整数n代表有序数的个数(n不超过50),接着输入n个按升序排列的整数,最后输入一个待查数据。
【输出形式】如果查找成功,返回待查数据在数组中的下标;如果查找失败,输出“no“。
【样例输入】5 3 6 8 9 12 9
【样例输出】3

【样例输入】6 3 6 8 9 12 19 5
【样例输出】no
【样例说明】输入的数据之间用空格隔开

#include<stdio.h>

void zb(int x, int a[], int n)
{
	int ji = 0, high = n - 1, low = 0, mid;
	while (high >= low)
	{
		mid = (high + low) / 2;
		if (x < a[mid])
			high = mid - 1;
		else if (x > a[mid])
			low = mid + 1;
		if (x == a[mid])
		{
			printf("%d", mid);
			ji = 1;
			break;
		}
	}
	if (!ji)
		printf("no");
}

int main()
{
	int n, i, x, a[50];
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	scanf("%d", &x);
	zb(x, a, n);
	return 0;
}

8.十进制转换为R进制

【问题描述】输入一个十进制整数,将其转换成N进制数(1<N<=16)

【输入形式】一个十进制数 整数N

【输出形式】数字或字母由 (0-9,A,B,C,D,E,F)

【样例输入】300 16

【样例输出】12C

【样例输入】100 2

【样例输出】1100100

#include<stdio.h>
int main()
{
	int num, n, i, j, sum = 0;
	int s[1000] = { 0 };
	scanf("%d%d", &num, &n);
	for (i = 0; num != 0; i++)
	{
		sum = num % n;
		num = num / n;
		s[i] = sum;
	}
	for (j = i - 1; j >= 0; j--)
	{
		if (s[j] >= 10)
			printf("%c", s[j] + 55);
		else
			printf("%d", s[j]);
	}
	return 0;
}

9.求整数数组组中特定值K出现次数

【问题描述】求整数数组组中特定值出现次数。
【输入形式】输入N个整数,以-1作为结束(-1不记在数组中),然后输入一个整数K,数据以空格隔开

【输出形式】整数K在N个整数中出现的次数C
【样例输入】3 1 1 2 2 3 -1 2
【样例输出】2
【样例输入】3 1 1 2 2 3 -1 0
【样例输出】0

【特殊说明】数组元素个数不超过50个

#include<stdio.h>
int main()
{
	int arr[50], K, c = 0, i, N;
	for (i = 0; i < 50; i++)
	{
		scanf("%d", &arr[i]);
		if (arr[i] == -1)
			break;
	}
	N = i;
	scanf("%d", &K);
	for (i = 0; i < N; i++)
		if (arr[i] == K)
			c++;
	printf("%d", c);
	return 0;
}

10.把字符串中的小写字符转换为大写字母

【问题描述】输入一段字符存在数组,将其中的小写字母转化为大写字母,最后将转化后的字符串输出。
【输入形式】输入一串字符,一回车作为结束
【输出形式】输出不包含小写字母的字符串,其他字符不变。
【样例输入】aBcdEFg
【样例输出】ABCDEFG

#include<stdio.h>
int main()
{
	char c, str[66];
	int i;
	gets(str);
	for (i = 0; (c = str[i]) != '\0'; i++)
	{
		if (c >= 'a' && c <= 'z')
			c -= 32;
		str[i] = c;
	}
	puts(str);
	return 0;
}

11.冒泡排序

【问题描述】对数据进行数据排序(冒泡排序),其中数组有10个整数
【输入形式】输入数组
【输出形式】排序好的数组
【样例输入】10 1 2 7 6 8 9 3 4 5
【样例输出】1 2 3 4 5 6 7 8 9 10

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

12.数组前半部分按升序排列,后半部分按降序排列

【问题描述】输入一串整数,以-1为结束(-1不记在数组中),数组前半部分用按升序排列,后半部分按降序排列。
【输入形式】输入一串整数,以-1为结束
【输出形式】输出排序好的数组
【样例输入】3 5 2 1 21 34 2 1 12 -1
【样例输出】1 2 3 5 21 34 12  2 1

【样例说明】如果数组个数是奇数,则中间的数据两边排序都不参加;数组元素个数不超过50。

#include<stdio.h>
int main()
{
	int i, j, n, a[100], t;
	for (i = 0; i < 100; i++)
	{
		scanf("%d", &a[i]);
		if (a[i] == -1)
			break;
	}
	n = i;
	for (j = 0; j <= n / 2; j++)
		for (i = 0; i < n / 2 - 1; i++)
			if (a[i] > a[i + 1])
			{
				t = a[i];
				a[i] = a[i + 1];
				a[i + 1] = t;
			}
	for (j = n - 1; j >= n / 2; j--)
		for (i = n - 1; i > n / 2 + 1; i--)
			if (a[i] > a[i - 1])
			{
				t = a[i];
				a[i] = a[i - 1];
				a[i - 1] = t;
			}
	for (i = 0; i < n; i++)
		printf("%d ", a[i]);
	return 0;
}

片段题

1.输入包含3种括号的的字符串,编写算法判断其各对括号是否匹配

【问题描述】输入可能包含'{'、‘}’、'['、']'、'('、')'这6种字符的字符串(不超过20个,不考虑空字符串),如果3种左右括号出现的次数能够匹配——比如出现3个左花括号和3个右花括号,2个左方括号和2个右方括号等,则认为匹配,否则不匹配。只考虑3种括号的匹配,其他字符不予考虑。    

【输入形式】<字符串><enter>
【输出形式】matched||unmatched
【样例1输入】123avd{[()]}!@#
【样例1输出】matched

【样例2输入】??@{[(()]}]]]]@??
【样例1输出】unmatched

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#define N 20
int  main()
{
	char ss[N];
	//a[2][3]用来分别存放6种括号的个数,第0行和第1行的第0列分别存放第1种左右括号的个数,第0行和第1行的第1列分别存放第2种左右括号的个数……
	int a[2][3] = { 0 };
	int i, j;
	scanf("%s", ss);
	for (i = 0; ss[i] != '\0'; i++)
	{
		if (ss[i] == '{')
			a[0][0]++;
		if (ss[i] == '}')
			a[1][0]++;
		if (ss[i] == '[')
			a[0][1]++;
		if (ss[i] == ']')
			a[1][1]++;
		if (ss[i] == '(')
			a[0][2]++;
		if (ss[i] == ')')
			a[1][2]++;
	}
	int flag = 1;
	for (j = 0; j <= 2; j++)
	{
		if (a[0][j] != a[1][j])
		{
			flag = 0;
			break;
		}
	}
	if (flag == 1)
		printf("matched\n");
	else printf("unmatched\n");
	return  0;
}

2.将任意输入的一串英文字母按字典顺序排序并输出

【问题描述】输入输入一串英文字母,按ASCII顺序排序后输出。

【输入形式】<字符串>
【输出形式】<字符串>

【样例输入】ertSAuqW
【样例输出】ASWeqrtu

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
int main()
{
	char  s[N], t;
	int  i, j, SIZE;
	gets(s);//注:若该步骤无法运行则改为gets_s(s)
	SIZE = strlen(s);
	for (i = 1; i < SIZE; i++)
		for (j = 0; j < SIZE - 1; j++)
		{
			if (s[i] < s[j])
			{
				t = s[i];
				s[i] = s[j];
				s[j] = t;
			}
		}
	puts(s);
	return 0;
}

3.删除字符串中特定字符,并输出

【问题描述】任意输入一串字符s1,以回车键结束;再输入一个字符ch,把s1中所有ch删除,然后输出新字符串。

【输入形式】<字符串> <字符>
【输出形式】<字符串>

【样例输入】abcd*1@?/wdsd

           d
【样例输出】abc*1@?/ws

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
int main()
{
    char s1[N], s2[N] = "\0", ch;
    int i, j;
    gets(s1);//若无法运行则改为gets_s(s1)
    fflush(stdin);
    ch = getchar();
    i = 0; j = 0;
    while (s1[i] != '\0')
    {
        if (s1[i] != ch)
        {
            s2[j] = s1[i];
            j++;
        }
        i++;
    }
    puts(s2);
    return 0;
}

4.向一个升序整数数组中插入一个整数,使之仍然保持原有序列

【问题描述】任意输入一个保持升序的整数数组a,以-1结束;再输入一个整数x,编写算法将x插入数组a中,使之仍然保持升序,并输出新升序数组。

【输入形式】升序数组 整数x
【输出形式】新升序数组,以空格隔开。
【样例输入】

1 2 3 5 6 -1

4
【样例输出】

1 2 3 4 5 6
【样例说明】数组总长度不超过20。

#include <iostream>
#include <stdio.h>
#define N 20
int main()
{
    int a[N], i;
    int x, t, j;
    int len;
    for (i = 0;; i++)
    {
        scanf("%d", &t);
        if (t != -1)
            a[i] = t;
        else break;
    }
    len = i;
    scanf("%d", &x);
    for (i = 0; i < len; i++)
    {
        if (x <= a[i])
            break;
    }
    for (j = len - 1; j >= i; j--)
    {
        a[j + 1] = a[j];
    }
    a[i] = x;
    for (i = 0; i < len + 1; i++)
        printf("%d ", a[i]);
    return 0;
}

填空题

1.评分统计程序

共有8个评委打分,统计时,去掉一个最高分和去掉一个最低分,其余6个分数的平均分即是最后得分,程序最后应显示这个得分,显示精度为1位整数,两位小数,程序如下,请将程序补充完整。

#include"stdio.h"
void main()
{
	float x[8] = { 9.2,9.5,9.8,7.4,8.5,9.1,9.3,8.8 };
	float aver, max, min;
	int i;
	for (aver = 0, i = 0; i < 8; i++)
		aver += x[i];
	max = x[0];
	min = max;
	for (i = 1; i < 8; i++)
	{
		if (max < x[i])
			max = x[i];
		if (min > x[i])
			min = x[i];
	}
	aver = (aver - max - min) / 6;
	printf("average=%4.2f\n", aver);
	return 0;
}

函数

片段题

1.求三个数的最大公约数

【问题描述】写一函数fun,求三个数的最大公约数。如果输入的数据非法输出-1。 

【输入形式】<a> <b> <c>

【输出形式】<最大公约数>

【样例输入】 8 16 32 

【样例输出】 8

【样例输入】 -8 16 32 

【样例输出】 -1

#include<stdio.h>
#include<iostream>

using namespace std;

int fun2(int x, int y, int z);

int main()
{
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	printf("%d", fun2(a, b, c));
	return 0;
}

int fun2(int x, int y, int z)
{
	int i, t, num;
	if (x > y)
	{
		t = x; x = y; y = t;
	}
	if (x > z)
	{
		t = x; x = z; z = t;
	}
	if (y > z)
	{
		t = y; y = z; z = t;
	}
	if ((x > 0 && y > 0 && z > 0) || (x < 0 && y < 0 && z < 0))
	{
		for (i = 1; i <= x; i++)
		{
			if (x % i == 0 && y % i == 0 && z % i == 0)
			{
				num = i;
			}
		}
		return num;
	}
	else
		return -1;
}

2.判断点的位置

【问题描述】输入一个二维坐标,判断该坐标与圆x2+y2=4的关系。用函数完成坐标与圆之间的关系。坐标的输入及关系结果的输出在主函数完成。
【输入形式】输入二维坐标值,double类型
【输出形式】在圆内输出in,在圆外输出out,在圆上输出on
【样例输入】2 2(数据之间用单个空格隔开)
【样例输出】out

【样例输入】1.25 1.25
【样例输出】in

#include <stdio.h>
#include<iostream>

using namespace std;
//编写判断函数
int judge(double a, double b)
{
	if ((a * a + b * b) > 4)
		return 1;
	if ((a * a + b * b) == 4)
		return 2;
	if ((a * a + b * b) < 4)
		return 3;
}

int main()
{
	double x, y;
	scanf("%lf%lf", &x, &y);
	//函数调用及最终结果输出
	if (judge(x, y) == 1)
		printf("out");
	if (judge(x, y) == 2)
		printf("on");
	if (judge(x, y) == 3)
		printf("in");

	return 0;
}

3.编写函数求分段函数

【问题描述】有分段函数:当x<-5时,y=|x|+10; 当-5≤x≤5时,y=x/2;当x>5时,y=2x-10.

编一函数 void fun5(double x) ; 求上述分段函数值,并在主函数中调用。结果保留4位小数。

【输入形式】x值

【输出形式】y值

【样例输入】-10.2

【样例输出】20.2000

#include <stdio.h>
#include<iostream>

using namespace std;

void fun5(double x);

int main()
{
	double x;
	scanf("%lf", &x);
	fun5(x);
	return 0;
}

void fun5(double x)
{
	double y;
	if (x < -5)
	{
		y = -x + 10;
		printf("%.4f", y);
	}
	if (-5 <= x && x <= 5)
	{
		y = x / 2;
		printf("%.4f", y);
	}
	if (x > 5)
	{
		y = 2 * x - 10;
		printf("%.4f", y);
	}
}

4.奇数求和

【问题描述】从键盘输入两个正整数 m 和 n(m<n),计算 m 到 n(包括 m 和 n)之间的所有奇数的和,输出求和结果。

【输入形式】输入两个正整数 m 和 n。

【输出形式】输出奇数求和结果。

【样例输入】3 12

【样例输出】35(求和过程:3+5+7+9+11=35)

【样例输入】6 15

【样例输出】55

#include <stdio.h>
#include <math.h>
#include<iostream>

using namespace std;

//对大于等于small小于等于big之间所有奇数求和,返回求和结果。
int fun1(int small, int big);

int main()
{
    int m, n;
    scanf("%d%d", &m, &n);
    m = fun1(m, n);
    printf("%d", m);
    return 0;
}

int  fun1(int  small, int  big)
{
    int m = 0;
    for (int i = small; i <= big; i++)
        if (i % 2 != 0)
            m += i;
    return m;
}

5.编写函数求小球经过多少米

【问题描述】一个球从m米高度自由落下,每次落地后又反跳回原高度的一半,再落下,再反弹。编写函数fun3, 求它在第 n 次落地时共经过多少米。结果保留4位小数。

【输入形式】<m高度> <n次>

【输出形式】<距离>

【样例输入】10 1

【样例输出】10.0000

【样例输入】10 2

【样例输出】20.0000

【样例输入】100 10

【样例输出】299.6094

#include<stdio.h>
#include<iostream>

using namespace std;

double fun3(double x, int y);

int main()
{
    double m;
    int n;
    scanf("%lf", &m);
    scanf("%d", &n);
    printf("%.4f", fun3(m, n));
    return 0;
}

double  fun3(double  x, int  y)
{
    double s = x;
    for (int i = 2; i <= y; i++)
    {
        x /= 2;
        s += x * 2;
    }
    return s;
}

6.验证哥德巴赫猜想

【问题描述】验证哥德巴赫猜想:任一大于2的偶数,可以用两个素数之和表示。

【输入形式】一个大于2的偶数

【输出形式】每行一对素数,小的素数在前,以一个空格隔开,多组用多行表示,不考虑两个素数相等的情况。

【样例输入】10

【样例输出】3 7

【样例输入】20

【样例输出】

3 17

7 13

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//素数判断函数,是素数返回非0值,不是素数返回0。
int isPrime(int n);

int main()
{
	int m, i, n;
	scanf("%d", &n);
	for (i = 2; i < n / 2; i++)
	{
		//调用素数判断函数输出满足条件的结果进行验证
		m = n - i;
		if (isPrime(m) && isPrime(i))
		{
			printf("%d %d\n", i, m);
		}
	}
	return 0;
}

int isPrime(int n)
{
	int flag = 1;//假设是素数
	for (int i = 2; i <= sqrt(n); i++)
	{
		if (n % i == 0)//不是素数
		{
			flag = 0;
			break;
		}
	}
	return flag;
}

7.编写函数求某正整数m中数字n的个数

【问题描述】在键盘上输入一个正整数m,编一个函数计算该数字中数字n的个数。

【输入形式】<m> <n>

【输出形式】<n的个数>

【样例输入】12222 2

【样例输出】4

【样例输入】12222 -2

【样例输出】0

#include<stdio.h>
#include<iostream>

using namespace std;

int fun1(int x, int y);

int main()
{
    int m, n;
    scanf("%d%d", &m, &n);
    printf("%d", fun1(m, n));
    return 0;
}

int fun1(int x, int y)
{
    int count = 0;
    while (x != 0)
    {
        if (x % 10 == y)
            count++;
        x /= 10;
    }
    return count;
}

8.求3至N之间的所有素数

【问题描述】输入一个大于 3 的正整数 n,打印 3 到该数之间的所有素数,用函数实现判断一个数是否是素数。

【输入形式】输入一个正整数。

【输出形式】输出所有素数。

【样例输入】50

【样例输出】3 5 7 11 13 17 19 23 29 31 37 41 43 47

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>

using namespace std;

int func(int m);

int main()
{
    int i, n;
    scanf("%d", &n);
    for (i = 3; i < n; i++)
    {
        if (func(i) == 1)
            printf("%d ", i);
    }
    if (func(n) == 1)
        printf("%d", n);

    return 0;
}

int func(int m)
{
    int i;
    if (m <= 1)
        return 0;
    else if (m == 2)
        return 1;
    else if (m % 2 == 0)
        return 0;
    else {
        for (i = 3; i * i <= m; i += 2)
        {
            if (m % i == 0)
                return 0;
        }
    }
    return 1;
}

9.谁考了第 k 名

【问题描述】在某一次考试中,假设每个学生的成绩都不相同,从键盘输入 n 个学生的成绩(1<n<100),输入 k (k<n),输出成绩排名第 k 名的学生成绩。

【输入形式】输入正整数 n 和 k,再输入 n 个学生的成绩。

【输出形式】输出成绩排名第 k 名的学生成绩。

【样例输入】

5 2

31 97 60 88 75

【样例输出】88

【样例说明】备注:输入时行与行之间无空行。

#include <stdio.h>
#include <math.h>
#include<iostream>

using namespace std;

//输入n个有效的学生成绩
//找到第k名的成绩并返回
int fun3(int n, int k);

int main()
{
    int n, k;
    scanf("%d%d", &n, &k);
    n = fun3(n, k);
    printf("%d", n);
    return 0;
}

int fun3(int n, int k)
{
    int i, arr[100];
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for (int j = 0; j < n - 1; j++)
    {
        for (i = 0; i < n - j - 1; i++)
        {
            if (arr[i] < arr[i + 1])
            {
                int t = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = t;
            }
        }
    }
    return arr[k - 1];
}

10.用递归求两个数的最大公约数

【问题描述】用递归方法求两个数的最大公约数。
【输入形式】输入两个正整数,用空格隔开
【输出形式】两个正整数的最大公约数
【样例输入】4 2
【样例输出】2
【评分标准】必须用递归完成

#include<stdio.h>
#include<iostream>

using namespace std;
//添加代码,递归函数求两个数最大公约数
int Gcd(int m, int n)
{
    int i = 0;
    while (i = m % n)
    {
        return Gcd(n, i);
    }
    return n;
}

int main()
{
    int m, n, gcd;
    scanf("%d%d", &m, &n);
    //调用求最大公约数函数
    gcd = Gcd(m, n);
    printf("%d", gcd);
}

11.求整数中的特定位数字

【问题描述】编写函数int digit(long n,int k),函数返回n中从右边开始的第k为数字的值。
【输入形式】输入两个正整数,正整数之间用单个空格隔开
【输出形式】输出一个正整数
【样例输入】231456 3
【样例输出】4

【样例输入】1456 5
【样例输出】0

#include <stdio.h>
#include<iostream>

using namespace std;

//编写函数体
int digit(long n, int k)
{
    long a[100];
    for (int i = 0; i < 100; i++)
    {
        a[i] = n % 10;
        n /= 10;
    }
    return a[k - 1];
}
int main()
{
    long n;
    int k;
    scanf("%ld%d", &n, &k);
    //调用函数并输出结果
    int a;
    a = digit(n, k);
    printf("%d", a);
    return 0;
}

填空题

1.求最大公约数函数

编写求最大公约数函数gcd:功能是求两数的最大公约数,并返回该数。

main函数中调用该函数,并输出最大公约数。

#include<stdio.h>
int gcd(int m, int n)//求m,n的公约数的函数
{
    int r;
    r = m;// r 是公约数,初值为 m
    while ((m % r != 0) || (n % r != 0))//当 r 不是公约数时,循环直至找到公约数
        r--;//  r 减小1
    return r;
}

int main()
{
    int m, n;
    printf("请输入两个数");
    scanf("%d%d", &m, &n);
    printf("最大公约数%d\n", gcd(m, n));//调用gcd函数
    return 0;
}

2.完数判断

一个正整数如果恰好等于它的除自身外的因数之和,这个数称为“完数”。

例如,6的因数有1、2、3,且6=1+2+3,因此6是“完数”。

编写判别完数的函数wanshu(int x):功能判断x是否为完数,如果是,则返回1,不是,则返回0。

编写main()中让x从1循环至1000,并调wanshu函数,如果返回值为1,则输出该数。

#include <stdio.h>

int wanshu(int x)
{
    int i, r = 0;
    for (i = 1; i < x; i++)
    {
        if (x % i == 0)//判断x能整除i? 即判断i是否是x的因数
            r = r + i;//将因数累加进r中
    }
    if (r == x)//判断因数和是否等于x,是则返回1,不是,返回0                     
        return 1;
    else
        return 0;
}

int main()
{
    int i;
    for (i = 1; i <= 1000; i++)
    {
        if (wanshu(i) == 1) //调用wanshu函数,根据函数值,判断i是否为完数,
            printf("%d是完数\n", i);
    }
    return 0;
}

结构体

编程题

1.生日相同问题

【问题描述】

在一个有n个学生的大班级中,存在两个学生生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。(只有一组生日相同的情况,不存在多组)

【输入形式】

第1行为正整数n,表示有n个学生,n≦100。

此后n行,每行包含一个字符串和两个正整数,分别表示学生的名字(名字中不含空格,且长度小于20)和出生月m、出生日d,1≦m≦12,1≦d≦31,名字、月、日之间用一个空格分隔。

【输出形式】

每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对生日相同的名字,按输入顺序输出。如果没有生日相同的学生,输出“None”。
【样例输入】

6

Avril 3 2

Candy 4 4

Tim 3 2

Sufia 4 5

Lagrange 4 7

Bill 3 2
【样例输出】

3 2 Avril Tim Bill

#include<stdio.h>
#include<string.h>
struct stu
{
	char name[20];
	int m, d;
};
int main()
{
	int n, i, j;
	scanf("%d", &n);
	stu s[100] = { 0 };
	for (i = 0; i < n; i++)
	{
		scanf("%s %d %d", s[i].name, &s[i].m, &s[i].d);
	}
	int flag = 0;
	int m = 0;
	for (i = 0; i < n; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (s[i].m == s[j].m && s[i].d == s[j].d)
			{
				if (flag == 0)
				{
					printf("%d %d %s %s ", s[i].m, s[i].d, s[i].name, s[j].name);
					flag = 1;
					strcpy(s[j].name, " ");
				}
				else
				{
					printf("%s ", s[j].name);
					strcpy(s[j].name, " ");
				}
			}
		}
		printf("\n");
	}
	if (!flag)
		printf("None");
	return 0;
}

2.某班劳动之星选举程序

【问题描述】某班劳动之星选举程序

某班学生信息包括以下几项:学号、姓名和性别。定义一个结构体数组来保存学生信息,从键盘输入学生数 n 和 n 个学生的数据;再输入一组投票数据:学生的学号,非正数代表输入结束。输出得票数最高的学生信息,同票的要全部输出(最多两人同票),各占一行。

【输入形式】输入学生数 n 和 n 个学生的数据;再输入一组投票数据:学生的学号。

【输出形式】输出得票数最高的学生信息。

【样例输入】

3

101 jhko F

102 it99 M

103 oiug M

101 101 101 101 103 103 102 101 0

【样例输出】

101 jhko F

【样例输入】

4

5 K F

6 T F

8 A M

9 V M

5 6 8 9 8 8 5 5 -1

【样例输出】

5 K F

8 A M

【样例说明】提示:n 个学生按照得票数进行降序排序后再输出满足条件的学生信息。不定义结构体数组0分。

#include <stdio.h>

// 定义学生结构体
typedef struct
{
    int id;
    char name[20];
    char gender;
} Student;

int main()
{
    int n, vote;
    scanf("%d", &n);

    // 创建并初始化学生信息数组
    Student students[100];
    for (int i = 0; i < n; ++i)
    {
        scanf("%d %s %c", &students[i].id, students[i].name, &students[i].gender);
    }

    // 初始化投票计数器
    int votes[100];
    for (int i = 0; i < n; ++i)
    {
        votes[i] = 0;
    }

    // 输入投票数据并统计票数
    while (1)
    {
        scanf("%d", &vote);
        if (vote <= 0)
        {
            break;
        }
        for (int i = 0; i < n; ++i)
        {
            if (students[i].id == vote)
            {
                votes[i]++;
                break;
            }
        }
    }

    // 找出得票最多的学号及其票数
    int max_votes = 0, max_count = 0;
    for (int i = 0; i < n; ++i)
    {
        if (votes[i] > max_votes)
        {
            max_votes = votes[i];
            max_count = 1;
        } else if (votes[i] == max_votes)
        {
            max_count++;
        }
    }

    // 输出得票最多的学生信息
    for (int i = 0; i < n; ++i)
    {
        if (votes[i] == max_votes)
        {
            printf("%d %s %c\n", students[i].id, students[i].name, students[i].gender);
        }
    }

    return 0;
}

3.谁的年龄是居中年龄

【问题描述】设有n个人的姓名和年龄存在数组中,输出这些人年龄居中的年龄,和同年龄的所有人姓名(如多人,姓名按字母顺序排序),如偶数算中间两人平均值,没有相同年龄则输出error。
【输入形式】人数 姓名 年龄
【输出形式】年龄 姓名
【样例输入】
5

Ewry 32

Jdkfg 54

Dfhsj 20

Kvirk 32

Sgkf 53 

【样例输出】32 Ewry Kvirk

#include<stdio.h>
#include<stdlib.h>

struct man
{
	char name[50];
	int age;
};
struct man s[10];
int main() {
	int n, i, j;
	int arr[10] = { 0 };
	int a = 1, f1 = 0, f2 = 0;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%s %d", s[i].name, &s[i].age);
		arr[i] = s[i].age;
	}
	int t;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
	if (n % 2 != 0 && n != 1)
	{
		printf("%d ", arr[(n - 1) / 2]);
		for (i = 0; i < n; i++)
		{
			for (j = i + 1; j < n; j++)
			{
				if (s[i].age == s[j].age)
				{
					f1 = 1;
					printf("%s %s", s[i].name, s[j].name);
				}
			}
		}
		if (f1 == 0)
		{
			for (i = 0; i < n; i++)
			{
				if (s[i].age == arr[(n - 1) / 2])
				{
					printf("%s", s[i].name);
					a = 0;
				}
			}
			if (a)printf("error");
		}
	}
	if (n == 1)
	{
		printf("error");
	}
	if (n % 2 == 0)
	{
		a = (arr[n / 2 - 1] + arr[n / 2]) / 2;
		printf("%d ", a);
		for (i = 0; i < n; i++)
		{
			for (j = i + 1; j < n; j++)
			{
				if (s[i].age == s[j].age)
				{
					f2 = 1;
					printf("%s %s", s[i].name, s[j].name);
				}
			}

		}
		if (f2 == 0)
			printf("error");
	}
	return 0;
}

4.奖金计算

【问题描述】

单位根据员工的销售成绩计算发给员工的奖金,A商品(单价100元)销售到达200以上,奖励总销售额的10%,200到100之间奖励总销售额的5%,100以下无奖励;B商品销售到达200以上,奖励2000元,200到100之间奖励1000,100以下奖励500;请计算给出每个员工获得的奖金数目。

【输入形式】姓名 A数量 B数量

当输入姓名为"#"时表示输入结束。

【输出形式】姓名 奖金
【样例输入】

zs 320 270

lis 207 388

we 188 46

ss 34 300

sd 56 170

# 0 0 0

【样例输出】

zs 5200

lis 4070

we 1440

ss 2000

sd 1000

#include<stdio.h>
#include<math.h>
#include<string.h>
struct
{
	char name[50];
	char s[50];
	int m;
	long a, b;
}q[50];
int main()
{

	int i, j = 0;
	char x[2] = { '#','\0' };
	for (i = 0;; i++)
	{
		scanf("%s %ld %ld\n", q[i].name, &q[i].a, &q[i].b);
		if (strcmp(q[i].name, x) == 0)
			break;
		j++;
	}
	for (i = 0; i < j; i++)
	{
		if (q[i].a > 200 && q[i].b > 200)
			q[i].m = q[i].a * 100 * 0.1 + 2000;

		if (q[i].a > 200 && q[i].b >= 100 && q[i].b <= 200)
			q[i].m = q[i].a * 100 * 0.1 + 1000;

		if (q[i].a > 200 && q[i].b < 100)
			q[i].m = q[i].a * 100 * 0.1 + 500;

		if (q[i].a >= 100 && q[i].a <= 200 && q[i].b > 200)
			q[i].m = q[i].a * 100 * 0.05 + 2000;

		if (q[i].a >= 100 && q[i].a <= 200 && q[i].b >= 100 && q[i].b <= 200)
			q[i].m = q[i].a * 100 * 0.05 + 1000;

		if (q[i].a >= 100 && q[i].a <= 200 && q[i].b < 100)
			q[i].m = q[i].a * 100 * 0.05 + 500;

		if (q[i].a < 100 && q[i].b>200)
			q[i].m = 2000;

		if (q[i].a < 100 && q[i].b >= 100 && q[i].b <= 200)
			q[i].m = 1000;

		if (q[i].a < 100 && q[i].b < 100)
			q[i].m = 500;

		printf("%s %ld\n", q[i].name, q[i].m);
	}
	return 0;
}

5.ACM比赛排名

【问题描述】ACM网络编程擂台赛比赛完后需要产生一个最终排名,排名按照完成题数多少来决定。但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。 

为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,假设所有队伍完成的题目数量都不同。 

【输入形式】第一行有一个正整数N(0<N<100),表示队伍数量。接下来N 行包含两个整数,分别为队伍的编号,和该队做出的题数。
【输出形式】每组数据输出包含N行,第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。
【样例输入】

1 3 

16 5 

11 2 

20 4 

3 8 

26 7

7 1 

22 6 

【样例输出】

3 8 

26 7

22 6 

16 5 

20 4 

1 3

11 2 

7 1

#include <stdio.h>
#include <cstdlib>

// 定义结构体来存储队伍信息
typedef struct
{
    int id;
    int solved;
} Team;

// 比较函数,用于排序时比较两个队伍的完成题数
int compare(const void* a, const void* b)
{
    Team* team1 = (Team*)a;
    Team* team2 = (Team*)b;

    return team2->solved - team1->solved; // 降序排列(题目数量多的队伍排在前面)
}

int main()
{
    int n, i;
    scanf("%d", &n);

    // 创建并初始化队伍数组
    Team teams[n];
    for (i = 0; i < n; i++)
    {
        scanf("%d %d", &teams[i].id, &teams[i].solved);
    }

    // 对队伍进行排序
    qsort(teams, n, sizeof(Team), compare);

    // 输出结果
    for (i = 0; i < n; i++)
    {
        printf("%d %d\n", teams[i].id, teams[i].solved);
    }

    return 0;
}

6.销售记录排序

【问题描述】现有若干条销售记录,每个产品的销售记录由产品代码(整型),产品名称(字符型十位),单价(整型),数量(整型),金额(整型)五部分组成,其中:前四部分直接输入,而金额使用公式计算得出,即,金额=单价*数量。

要求:读取销售记录,使用结构体数组进行保存,编写计算金额函数,计算每条销售记录的金额,最后对销售记录按金额从小到大进行排序输出。


【输入形式】输入第一行为产品个数n(n<10),以下n行为销售记录,包括产品代码(整型),产品名称(字符型十位),单价(整型),数量(整型)
【输出形式】输出排好的销售记录,包括所有信息。
【样例输入】

8

1010 PVS1966-A1 580 22 

1011 PVS1966-A2 281 95

1012 AA-LG65M-A 494 51

1013 AA-PV45M-A 128 56

1014 AA-PV45P-A 998 5

1015 AA-PV70M-A 407 29

1016 AA-PV36P-B 786 19

1017 AA-PV36P-A 149 192

【样例输出】

1014 AA-PV45P-A 998 5 4990

1013 AA-PV45M-A 128 56 7168

1015 AA-PV70M-A 407 29 11803

1010 PVS1966-A1 580 22 12760

1016 AA-PV36P-B 786 19 14934

1012 AA-LG65M-A 494 51 25194

1011 PVS1966-A2 281 95 26695

1017 AA-PV36P-A 149 192 28608

#include <stdio.h>
#include <stdlib.h>

// 定义结构体来存储销售记录信息
typedef struct
{
    int code;
    char name[11];
    int price;
    int quantity;
    int amount;
} SaleRecord;

// 计算金额函数
void calculate_amount(SaleRecord* record)
{
    record->amount = record->price * record->quantity;
}

// 比较函数,用于排序时比较两个销售记录的金额
int compare(const void* a, const void* b)
{
    SaleRecord* sale1 = (SaleRecord*)a;
    SaleRecord* sale2 = (SaleRecord*)b;

    return sale1->amount - sale2->amount; // 升序排列(金额小的排在前面)
}

int main()
{
    int n, i;
    scanf("%d", &n);

    // 创建并初始化销售记录数组
    SaleRecord sales[100];
    for (i = 0; i < n; i++)
    {
        scanf("%d %s %d %d", &sales[i].code, sales[i].name, &sales[i].price, &sales[i].quantity);
        calculate_amount(&sales[i]);
    }

    // 对销售记录进行排序
    qsort(sales, n, sizeof(SaleRecord), compare);

    // 输出结果
    for (i = 0; i < n; i++)
    {
        printf("%d %s %d %d %d\n", sales[i].code, sales[i].name, sales[i].price, sales[i].quantity, sales[i].amount);
    }

    return 0;
}

7.找出年龄最小的学生(结构体嵌套定义实现)

【问题描述】输入6名同学信息,同学信息包括,学号,姓名,生日(年,月,日),生日信息用一个独立的结构体表示。找出年龄最小的同学,并输出该同学的所有信息。
【输入形式】输入6名同学的信息,每个同学占一行,行内信息用空格隔开。
【输出形式】输出年龄最小的同学所有信息
【样例输入】一个同学一行,一行内每个同学的信息用单个空格隔开

11001 zhangxiao 1989 12 1
11002 wangman  1990 2 4
11003 liyu 1987 6 1
11004 shencheng 1989 12 3
11005 mengtao 1992 2 3
11006 huafeng 1992 2 5
【样例输出】输出信息之间用单个空格隔开

11006 huafeng 1992 2 5

#include<stdio.h>

struct birthday
{
	int year, month, day;
};
struct student
{
	int n, age;
	char name[50];
	struct birthday b;
}; struct student n[10];
int main()
{
	int i, j;
	struct student s;
	for (i = 0; i < 6; i++)
	{
		scanf("%d %s %d %d %d\n", &n[i].n, n[i].name, &n[i].b.year, &n[i].b.month, &n[i].b.day);
	}
	struct student age[10] = { 0 };

	for (i = 0; i < 6 - 1; i++)
	{
		for (j = 0; j < 6 - 1 - i; j++)
		{
			if (n[j].b.year > n[j + 1].b.year)
			{
				s = n[j]; n[j] = n[j + 1]; n[j + 1] = s;
			}
		}
	}
	for (i = 0; i < 6 - 1; i++)
	{
		for (j = 0; j < 6 - 1 - i; j++)
		{
			if (n[j].b.month > n[j + 1].b.month && n[j].b.year == n[j + 1].b.year)
			{
				s = n[j]; n[j] = n[j + 1]; n[j + 1] = s;
			}
		}
	}
	for (i = 0; i < 6 - 1; i++)
	{
		for (j = 0; j < 6 - 1 - i; j++)
		{
			if (n[j].b.month == n[j + 1].b.month && n[j].b.day > n[j + 1].b.day && n[j].b.year == n[j + 1].b.year)
			{
				s = n[j]; n[j] = n[j + 1]; n[j + 1] = s;
			}
		}
	}
	printf("%d %s %d %d %d", n[5].n, n[5].name, n[5].b.year, n[5].b.month, n[5].b.day);
	return 0;
}

片段题

1.求解两点间距离

【问题描述】求解平面直角坐标系下两点间的距离,要求用结构体存储点信息。
【输入形式】输入两个点坐标。
【输出形式】输出两点间的距离。
【样例输入】2.3 2.1 5.6 1.2(首先输入第一个点的横坐标和纵坐标,然后再输入第二个点的信息,数据之间用单个空格隔开)

【样例输出】3.42(输出两点间的距离保留2位小数)

#include <iostream>
#include <stdio.h>
#include <math.h>
struct point
{
    double x, y;
};
//定义距离计算函数
double distance(struct point p1, struct point p2)
{
    return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}

int main()
{
    point p1, p2;
    double dis;
    //输入两点坐标
    scanf("%lf %lf", &p1.x, &p1.y); scanf("%lf %lf", &p2.x, &p2.y);
    //调用距离计算函数
    dis = distance(p1, p2);
    printf("%.2lf", dis);
	return 0;
}

2.根据年月日计算天数

【问题描述】定义一个结构体变量(包括年、月、日),输入一个日期,计算在本年中是第几天,注意闰年问题。

(闰年判断方法是:1、能被4整除,但不能被100整除;2、能被400整除。这两个条件有一个能满足就说明该年是闰年)

【输入形式】年<空格>月<空格>日,数据之间用单个空格隔开

【输出形式】天数

【样例输入】2015 3 18

【样例输出】77

【样例输入】2000 3 18

【样例输出】78

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

struct date
{
    int year, month, day;
};

int count(struct date d)
{
    int sum = 0;
    int isLeap = (d.year % 4 == 0 && d.year % 100 != 0) || (d.year % 400 == 0);

    // 闰年的天数数组
    int leapDays[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    // 非闰年的天数数组
    int normalDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    for (int i = 0; i < d.month - 1; ++i)
    {
        if (isLeap)
        {
            sum += leapDays[i];
        }
        else
        {
            sum += normalDays[i];
        }
    }

    sum += d.day;

    return sum;
}


int main()
{
    struct date d;
    scanf("%d %d %d", &d.year, &d.month, &d.day);
    printf("%d", count(d));
	return 0;
}

3.投票竞选班长程序

【问题描述】某班级选班长,有3个候选人,分别是li, liu, sun ,多名同学参加投票,输入end结束(输入字符串不能包含空格),统计每个人的得票数。
【样例输入】li li liu liu liu sun end

【样例输出】li:2 liu:3 sun:1

#include<stdio.h>
#include<string.h>
int main()
{
    struct person
    {
        char name[20];
        int  count;
    }  leader[3] = { "li",0,"liu",0,"sun",0 };
    int i, j;
    char leader_name[20];
    while (1)
    {
        scanf("%s", leader_name);

        if (strcmp(leader_name, "end") == 0)
            break;

        for (i = 0; i < 3; i++)
        {
            if (strcmp(leader[i].name, leader_name) == 0)
            {
                leader[i].count++;
                break;
            }
        }
    }
    for (i = 0; i < 3; i++)
        printf("%s:%d ", leader[i].name, leader[i].count);
    return 0;
}

4.查找 QQ 群不活跃成员

【问题描述】声明日期结构体类型,包括年、月两项;声明 QQ 群结构体类型,包括QQ号(建议声明为字符串),群昵称和最后说话时间三项,其中最后说话时间应声明为日期结构体类型。输入群成员和待比较日期,输出和待比较日期相比大于等于 6 个月不说话的所有群成员。

【输入形式】输入所有群成员,最后说话时间中的月份值非法代表输入结束;再输入待比较日期。

【输出形式】输出和待比较日期相比大于等于 6 个月不说话的所有群成员。

【样例输入】

853216595 ki999 2018 4

12378568 888 2018 3

51236985 k 2017 2

1085126957 sd 2018 4

1075125698 scsb 2017 5

567852 lgsb 2019 14

2018 5

【样例输出】

51236985 k 2017 2

1075125698 scsb 2017 5

【样例输入】

536589 uijh 2018 5

7856231 kjh 2017 10

78561236 jh 2018 3

51236985 k 2017 12

1085126957 sd 2018 4

1075125698 scsb 2018 -5

2018 5

【样例输出】

7856231 kjh 2017 10

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

//声明日期和群结构体类型(需补充代码3-1)
struct date
{
	int year, month;
};
struct qun
{
	char num[15];
	char name[20];
	struct date xda;
};

//输入所有群成员,将实际输入的成员数作为返回值返回
int input_data(struct qun quns[]);
//计算日期差函数,返回差了几个月,da1(2015-11)较旧,da2(2018-2)较新
//若 da1(2017-11),da2(2017-12),则函数应返回 1
int cha(struct date da1, struct date da2);
//输出比较后满足要求的数据
void output_data(struct qun quns[], struct date da, int n);

int main()
{
	struct qun xquns[50];
	struct date xda;
	int n;

	n = input_data(xquns);
	//一行代码:读取待比较日期数据(需补充代码3-2)
	scanf("%d %d", &xda.year, &xda.month);
	output_data(xquns, xda, n);

	return 0;
}

//实现自定义函数(需补充代码3-3)
int input_data(struct qun quns[])
{
	int i;
	for (i = 0; ; i++)
	{
		scanf("%s %s %d %d", quns[i].num, quns[i].name, &quns[i].xda.year, &quns[i].xda.month);
		if ((quns[i].xda.month < 1) || (quns[i].xda.month > 12))
			break;
	}
	return i;
}
int cha(struct date da1, struct date da2)
{
	int i;
	if (da1.year <= da2.year)
	{
		if (da1.month > da2.month)
			i = (da2.year - da1.year) * 12 - (da1.month - da2.month);
		else
			i = (da2.year - da1.year) * 12 + (da2.month - da1.month);
	}
	else
	{
		if (da1.month > da2.month)
			i = (da1.year - da2.year) * 12 + (da1.month - da2.month);
		else
			i = (da1.year - da2.year) * 12 - (da2.month - da1.month);
	}
	if (i < 6)
		return 1;
	else return 0;
}
void output_data(struct qun xquns[], struct date xda, int n)
{
	int  i, j;
	for (i = 0; i < n; i++)
	{
		j = cha(xquns[i].xda, xda);
		if (j == 0)
			printf("%s %s %d %d\n", xquns[i].num, xquns[i].name, xquns[i].xda.year, xquns[i].xda.month);
	}
}

链表、文件

编程题

1.向有序链表中插入数据并输出最大和最小值

【问题描述】输入若干按升序排列的整数,建立单向链表,后输入一个整数,把该数按原顺序插入到原链表,输出新链表中数据的最大值和最小值并输出链表中所有数据。必须用链表完成,程序中不允许有数组出现。
【输入形式】输入若干按升序排列的整数以0作为结束,和待插入的整数。用单个空格隔开。
【输出形式】输出最大值和最小值及链表中的所有数据,数据之间用单个空格隔开。
【样例输入】1 3 4 5 6 7 8 0 2
【样例输出】8 1 1 2 3 4 5 6 7 8
【样例说明】
【评分标准】链表用完后空间要释放!

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node* next;
} Node;

Node* createNode(int data)
{
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL)
    {
        printf("Memory allocation failed.\n");
        exit(0);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

void insertNode(Node** head, int data)
{
    Node* newNode = createNode(data);
    if (*head == NULL || (*head)->data >= data)
    {
        newNode->next = *head;
        *head = newNode;
    }
    else
    {
        Node* current = *head;
        while (current->next != NULL && current->next->data < data)
        {
            current = current->next;
        }
        newNode->next = current->next;
        current->next = newNode;
    }
}

void printList(Node* head)
{
    Node* temp = head;
    while (temp != NULL)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
}

int main()
{
    Node* head = NULL;
    int num;
    while (scanf("%d", &num) == 1 && num != 0)
    {
        insertNode(&head, num);
    }
    scanf("%d", &num);
    insertNode(&head, num);

    Node* temp = head;
    int max = temp->data, min = temp->data;
    while (temp != NULL)
    {
        if (temp->data > max)
        {
            max = temp->data;
        }
        if (temp->data < min)
        {
            min = temp->data;
        }
        temp = temp->next;
    }

    printf("%d %d ", max, min);
    printList(head);

    return 0;
}

2.输出单链表倒数第K个结点值

【问题描述】输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个结点。

【输入形式】输入第一位为K值,其后接一串以空格分隔的整型值,用-1表示结束。

【输出形式】输出为倒数第K个结点的值,若无,则输出Not Found。

【样例输入】3 13 45 54 32 1 4 98 2 -1

【样例输出】4

【样例说明】K值为3,则输出链表倒数第3个结点的值为4。

【样例输入】5 13 4 -1

【样例输出】Not Found

【样例说明】K值为5,不存在倒数第5个结点,因此输出Not Found。

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node* next;
} Node;

Node* createNode(int data)
{
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL)
    {
        printf("Memory allocation failed.\n");
        exit(0);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

Node* insertNode(Node* head, int data)
{
    Node* newNode = createNode(data);
    if (head == NULL)
    {
        head = newNode;
    }
    else {
        Node* temp = head;
        while (temp->next != NULL)
        {
            temp = temp->next;
        }
        temp->next = newNode;
    }
    return head;
}

int findKthFromLast(Node* head, int k)
{
    if (head == NULL || k <= 0)
    {
        printf("Not Found\n");
        return -1;
    }

    Node* first = head;
    Node* second = head;

    for (int i = 0; i < k - 1 && second != NULL; i++)
    {
        second = second->next;
    }

    if (second == NULL)
    {
        printf("Not Found\n");
        return -1;
    }

    while (second->next != NULL)
    {
        first = first->next;
        second = second->next;
    }

    return first->data;
}

int main()
{
    Node* head = NULL;
    int k, data;

    scanf("%d", &k);

    while (1)
    {
        scanf("%d", &data);
        if (data == -1)
        {
            break;
        }
        head = insertNode(head, data);
    }

    int result = findKthFromLast(head, k);

    if (result != -1)
    {
        printf("%d\n", result);
    }

    return 0;
}

3.对文件中存储的学生成绩进行统计

【问题描述】每个学生有包括学号、班级、姓名、成绩,从文件1.txt输入以上数据。

计算每个班级的平均成绩,以及所有学生的总平均成绩,计算90分以上,89-80分,79-70分,69-60分,60分以下的人数。将这些信息写入文件"2.txt"中。

【输入形式】从文件1.txt中读入学生信息

【输出形式】把统计好的成绩信息输出的2.txt文件中。

【样例输入】文件1.txt中内容,每位同学信息占一行,行内信息以单个空格分隔。

110 class1 li 90

120 class1 wang 60

130 class2 chen 75

140 class1 ma 80

150 class2 wei 65

【样例输出】文件2.txt中内容无空格,所有值取整数。第一行总平均成绩,以下各行为每个班的平均成绩,然后是全部学生中,90分以上人数,89-80人数,79-70人数,69-60人数,60分以下人数。

all ave 74

class1 ave 76

class2 ave 70

90 Above:1

89-80:1

79-70:1

69-60:2

60 Under:0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    int id;
    char class_name[20];
    char name[20];
    int score;
} Student;

int main()
{
    FILE* fp1, * fp2;
    fp1 = fopen("1.txt", "r");
    fp2 = fopen("2.txt", "w");

    if (fp1 == NULL || fp2 == NULL)
    {
        printf("File opening error!\n");
        return 1;
    }

    const int classMax = 10;
    int total_sum = 0, total_count = 0;
    int class_count[classMax] = { 0 };
    int class_sum[classMax] = { 0 };
    int grade_count[6] = { 0 };

    Student student;
    while (fscanf(fp1, "%d %s %s %d", &student.id, student.class_name, student.name, &student.score) != EOF)
    {
        total_sum += student.score;
        total_count++;

        int class_index = atoi(student.class_name + strlen(student.class_name) - 1) - 1;
        class_count[class_index]++;
        class_sum[class_index] += student.score;

        if (student.score >= 90)
        {
            grade_count[0]++;
        }
        else if (student.score >= 80)
        {
            grade_count[1]++;
        }
        else if (student.score >= 70)
        {
            grade_count[2]++;
        }
        else if (student.score >= 60)
        {
            grade_count[3]++;
        }
        else
        {
            grade_count[4]++;
        }
    }

    fclose(fp1);

    fprintf(fp2, "all ave %d\n", total_sum / total_count);

    if (class_count[4] > 0)
    {
        fprintf(fp2, "class5 ave %d\n", class_sum[4] / class_count[4]);
    }

    for (int i = 0; i < 4; i++)
    {
        if (class_count[i] > 0)
        {
            fprintf(fp2, "class%d ave %d\n", i + 1, class_sum[i] / class_count[i]);
        }
    }
    fprintf(fp2, "90 Above:%d\n", grade_count[0]);
    fprintf(fp2, "89-80:%d\n", grade_count[1]);
    fprintf(fp2, "79-70:%d\n", grade_count[2]);
    fprintf(fp2, "69-60:%d\n", grade_count[3]);
    fprintf(fp2, "60 Under:%d\n", grade_count[4]);

    fclose(fp2);

    return 0;
}

4.按要求对两个文件合并

【问题描述】编一个程序,合并两个已按递增排序的整数文件成一个按递增排序文件。
【输入形式】输入两个文件,文件名分别为1.txt和2.txt,在两个文件中分别输入已经排好序的整数,整数之间用单个空格隔开
【输出形式】输出按递增排好序的文件3.txt,输出文件中的整数用单个空格分隔
【样例输入】1.txt中内容为:1 3 4 5;2.txt中内容为:6 7 8
【样例输出】3.txt中内容为:1 3 4 5 6 7 8

【样例输入】1.txt中内容为:1 3 5;2.txt中内容为:2 4 6
【样例输出】3.txt中内容为:1 2 3 4 5 6

#include<stdio.h> 
#include<stdlib.h>

void mergeFiles(const char* fileName1, const char* fileName2, const char* outputFileName)
{
    FILE* file1 = fopen(fileName1, "r");
    FILE* file2 = fopen(fileName2, "r");
    FILE* outputFile = fopen(outputFileName, "w");

    if (file1 == NULL || file2 == NULL || outputFile == NULL)
    {
        printf("Failed to open files\n");
        return;
    }

    int num1, num2;
    int readFromFile1 = fscanf(file1, "%d", &num1);
    int readFromFile2 = fscanf(file2, "%d", &num2);

    while (readFromFile1 == 1 && readFromFile2 == 1)
    {
        if (num1 <= num2)
        {
            fprintf(outputFile, "%d ", num1);
            readFromFile1 = fscanf(file1, "%d", &num1);
        }
        else
        {
            fprintf(outputFile, "%d ", num2);
            readFromFile2 = fscanf(file2, "%d", &num2);
        }
    }

    while (readFromFile1 == 1)
    {
        fprintf(outputFile, "%d ", num1);
        readFromFile1 = fscanf(file1, "%d", &num1);
    }

    while (readFromFile2 == 1)
    {
        fprintf(outputFile, "%d ", num2);
        readFromFile2 = fscanf(file2, "%d", &num2);
    }

    fclose(file1);
    fclose(file2);
    fclose(outputFile);
}

int main()
{
    mergeFiles("1.txt", "2.txt", "3.txt");
    return 0;
}

片段题

1.(指针做参数的函数定义)查找数组下标

【问题描述】从键盘输入数组元素数量 n 以及这 n 个元素;再输入 2 个数,找到这2个数在数组中的位置,即数组下标。若某个数在数组中不存在,输出 -1,注意若数组中存在多个待查找的数,要全部输出位置。

【输入形式】输入数组元素数量 n 以及这 n 个整数元素;再输入2个待查找的整数。

【输出形式】输出2个数的位置信息。

【样例输入】

3 56 85 41

27 58

【样例输出】

27 -1

58 -1

【样例输入】

4 101 25 5 444

5 101

【样例输出】

5 2

101 0

【样例输入】

6 2 6 8 8 6 8

8 6

【样例输出】

8 2 3 5

6 1 4

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

//输入数组数据,将实际输入的数据数量作为返回值返回
int input_data(int* number);
//输入要查找下标的两个数,进行查找,输出结果
void output_data(int* number, int n);

int main()
{
    int n, x[20];

    n = input_data(x);
    output_data(x, n);

    return 0;
}

int input_data(int* number)
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &number[i]);
    }

    return n;
}


void output_data(int* number, int n)
{
    int target[2], index[2][10];
    int count[2] = { 0 };


    for (int i = 0; i < 2; i++)
    {
        scanf("%d", &target[i]);
    }

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (number[j] == target[i])
            {
                index[i][count[i]] = j;
                count[i]++;
            }
        }
    }

    for (int i = 0; i < 2; i++)
    {
        if (count[i] == 0)
        {
            printf("%d -1\n", target[i]);
        }
        else
        {
            printf("%d ", target[i]);
            for (int j = 0; j < count[i]; j++)
            {
                printf("%d ", index[i][j]);
            }
            printf("\n");
        }
    }
}

2.(指针做参数的函数定义)规格化数据

【问题描述】输入 10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:

①输入 10 个数;  函数原型声明:void input_data(int *number)

②进行处理;        函数原型声明:void handle_val(int *number)

③输出 10 个数。 函数原型声明:void output_data(int *number)

【输入形式】输入 10 个整数。

【输出形式】输出对换后的10个整数。

【样例输入】10 25 6 15 87 3 26 31 85 7

【样例输出】3 25 6 15 7 10 26 31 85 87

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

void input_data(int* number);
void handle_val(int* number);
void output_data(int* number);

int main()
{
    int x[10];

    input_data(x);
    handle_val(x);
    output_data(x);

    return 0;
}

void input_data(int* number)
{
    for (int i = 0; i < 10; i++)
    {
        scanf("%d", &number[i]);
    }
}

// ②进行处理
void handle_val(int* number)
{
    int min_index = 0, max_index = 9;

    for (int i = 1; i < 10; i++)
    {
        if (number[i] < number[min_index])
        {
            min_index = i;
        }
        if (number[i] > number[max_index])
        {
            max_index = i;
        }
    }

    // 将最小值与第一个数对换
    int temp = number[0];
    number[0] = number[min_index];
    number[min_index] = temp;

    // 将最大值与最后一个数对换
    temp = number[9];
    number[9] = number[max_index];
    number[max_index] = temp;
}

// ③输出 10 个数
void output_data(int* number)
{
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", number[i]);
    }
    printf("\n");
}

3.创建并输出链表

【问题描述】从键盘输入一行字符,以 # 结束,建立链表,打印输出链表。

【输入形式】输入一行字符,以 # 结束。

【输出形式】输出 # 之前的字符串(注意空表输出情况)。

【样例输入】123456789#124

【样例输出】123456789

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(Node)

//用 typedef 将结构体改名字
typedef struct Node
{
    char data;
    struct Node* next;
} Node;

Node* create();
void print(Node* p);

int main()
{
    Node* head = NULL;
    head = create();
    print(head);
    return 0;
}

Node* create()
{
    Node* head = NULL, * temp = NULL, * last = NULL;
    char ch;
    while ((ch = getchar()) != '#')
    {
        temp = (Node*)malloc(sizeof(Node));
        if (temp == NULL)
        {
            printf("Memory allocation failed.\n");
            return NULL;
        }
        temp->data = ch;
        temp->next = NULL;

        if (head == NULL)
        {
            head = temp;
            last = temp;
        }
        else
        {
            last->next = temp;
            last = temp;
        }
    }
    return head;
}
void print(Node* p)
{
    if (p == NULL)
    {
        return;
    }
    while (p != NULL)
    {
        printf("%c", p->data);
        p = p->next;
    }
    printf("\n");
}

4.删除链表中指定结点

【问题描述】输入链表 a,链表结点中包含学号、姓名,学号输入 -1,姓名随意代表一个链表输入结束。再输入待删除结点的学号 num,请编写删除链表中结点函数,从结点中删除学号为 num 的结点,并依次输出删除后的链表。若链表中不包含学号为 num 的结点,则先输出 no data,再依次输出链表结点。

【输入形式】输入链表 a 的数据和待删除结点的学号 num。其中,学号输入 -1,姓名随意代表一个链表输入结束。

【输出形式】输出删除后的新链表。

【样例输入】

101 Wang

102 Li

105 Zhang

106 Wei

-1 x

105

【样例输出】

 101 Wang 102 Li 106 Wei

【样例输入】

101 Wang

102 Li

105 Zhang

106 Wei

-1 x

103

【样例输出】

 no data 101 Wang 102 Li 105 Zhang 106 Wei

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN sizeof(NODE)

//用 typedef 将结构体改名字
typedef struct node
{
	int num;
	char name[20];
	struct node* next;
} NODE;


NODE* Create_LinkList();
//读入学号,并删除指定学号的结点,
//成功删除返回正数,未找到学号返回负数。
int Delete_LinkList(NODE* head);
void Display_LinkList(NODE* head, int flag);
void Free_LinkList(NODE* head);

int main()
{
	NODE* head = NULL;
	int flag;

	head = Create_LinkList();
	flag = Delete_LinkList(head);
	Display_LinkList(head, flag);
	Free_LinkList(head);

	return 0;
}


NODE* Create_LinkList()
{
	NODE* head, * head1, * p1, * p2;
	int n = 0;
	head1 = (NODE*)malloc(LEN);
	head = NULL;
	p1 = p2 = (NODE*)malloc(LEN);
	scanf("%d %s", &p1->num, p1->name);
	while (p1->num != -1)
	{
		n += 1;
		if (n == 1)
		{
			head = p1;
		}
		else
		{
			p2->next = p1;
		}
		p2 = p1;
		p1 = (NODE*)malloc(LEN);
		scanf("%d %s", &p1->num, p1->name);
	}
	p2->next = NULL;
	head1->next = head;
	return head1;
}

int Delete_LinkList(NODE* head)
{
	int x = 0;
	scanf("%d", &x);
	NODE* p;
	p = head;
	int flag = -1;//没找到时flag为-1
	while (p->next != NULL)
	{
		if (p->next->num == x)
		{
			NODE* temp;
			temp = p->next;
			p->next = p->next->next;
			free(temp);
			flag = 1;
			break;
		}
		p = p->next;
	}
	return flag;
}

void Display_LinkList(NODE* head, int flag)
{
	NODE* p;
	if (flag < 0)
		printf("no data ");
	for (p = head->next; p != NULL; p = p->next)
		printf("%d %s ", p->num, p->name);
}

void Free_LinkList(NODE* head)
{
	NODE* p, * q;
	p = head;
	while (p->next != NULL)
	{
		q = p->next;
		p->next = q->next;
		free(q);
	}
	free(head);
}

5.用指针和函数实现3个数排序

【问题描述】输入 3 个整数,按由小到大的顺序输出。指针使用部分要求定义函数 void swap(int *x, int *y),函数功能是 x 和 y 两个数互换。

【输入形式】输入 3 个整数。

【输出形式】按由小到大的顺序输出,每个数用一个空格分隔。

【样例输入】5 -1 6

【样例输出】-1 5 6

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

void swap(int* x, int* y);

int main()
{
	int x, y, z;

	scanf("%d%d%d", &x, &y, &z);
	if (x > y)
	{
		swap(&x, &y);
	}
	if (y > z)
	{
		swap(&y, &z);
	}
	if (x > y)
	{
		swap(&x, &y);
	}
	printf("%d %d %d", x, y, z);

	return 0;
}

void swap(int* x, int* y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}

二、程序设计基础实验

习题

1.求三角形面积

【问题描述】输入任意三角形的三边长,不考虑构不成三角形情况,求三角形面积。 

求三角形面积的公式为:

area=sqrt(s(s-a)(s-b)(s-c)),  其中 sqrt 为开根号函数,s=(a+b+c)/2。 

【输入形式】输入三角形的三条边长,以回车结束。

【输出形式】三角形面积,保留小数点后2位。

【样例输入】3.1 4.2 5.17

【样例输出】6.51

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

2.找出能够组成的最大三位数

【问题描述】输入三个正整数,这三个整数数值范围在0到9之间,且互不相同,请找出由这三个整数组成的最大三位整数。
【输入形式】输入三个整数,不考虑输入错误的情况,数据之间用单个空格隔开。
【输出形式】输出组成的最大三位整数。
【样例输入】1 2 3
【样例输出】321

#include<stdio.h>
int main()
{
	int a, b, c, t;
	scanf("%d%d%d", &a, &b, &c);
	if (a < b)
	{
		t = a;
		a = b;
		b = t;
	}
	if (b < c)
	{
		t = b;
		b = c;
		c = t;
	}
	if (a < b)
	{
		t = a;
		a = b;
		b = t;
	}
	t = a * 100 + b * 10 + c;
	printf("%d", t);
	return 0;
}

3.计算天数

【问题描述】输入年、月、日,用程序计算一下该日期是这一年的第几天。
【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。
【输出形式】输出计算的结果
【样例输入】2015 2 1
【样例输出】32

#include<stdio.h>
int main()
{
	int y, m, d, i, sum = 0;
	scanf("%d%d%d", &y, &m, &d);
	for (i = 1; i < m; i++)
	{
		switch (i)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:sum += 31; break;
		case 4:
		case 6:
		case 9:
		case 11:sum += 30; break;
		case 2:	if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
		{
			sum += 29; break;
		}
			  else
		{
			sum += 28; break;
		}
		}
	}
	printf("%d", sum + d);
	return 0;
}

4.求两个正整数的最小公倍数

【问题描述】输入两个正整数,编写函数实现求这两个正整数的最小公倍数。

【输入形式】输入两个正整数。

【输出形式】输出最小公倍数。

【样例输入】2 4

【样例输出】4

【样例输入】12 23

【样例输出】276

#include <iostream>
#include <stdio.h>
#include<stdlib.h>
int main()
{
    int lcm, m, n;
    scanf("%d%d", &m, &n);
    if (m < n)
    {
        lcm = m; m = n; n = lcm;
    }
    for (lcm = m;; lcm++)
        if (lcm % m == 0 && lcm % n == 0)
            break;
    printf("%d", lcm);

    return 0;
}

5.根据日期计算星期几

【问题描述】输入年、月、日,输出当天是星期几。已知2000年1月1日为星期六
【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。
【输出形式】输出一个整数。(1~7分别表示星期一至星期日)

【样例输入】2000 1 2
【样例输出】7

【样例输入】2000 1 1
【样例输出】6

【样例输入】1999 12 31
【样例输出】5

#include <stdio.h>
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int main()
{
    int y, m, d;
    scanf("%d %d %d", &y, &m, &d);
    if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        a[2] = 29;
    int ans = d, i;
    for (i = 1; i <= m - 1; i++)
    {
        ans += a[i];
    }
    int s, r;
    s = y - 1 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + ans;
    r = s % 7;
    if (r == 0)
        r = 7;
    printf("%d\n", r);
    return 0;
}

实验一、学生计算能力进阶训练程序

1. 自定义难度等级(例如:第1级为一位数和一位数的加法,减法和乘法运算;第2级为一位数和两位数的加法,减法和乘法运算;第3级为两位数和两位数的加法,减法和乘法运算),学生可以选择不同等级练习,某个等级练习的正确率在90%以上,可以升级;正确率在60%以下,则要降级;

2. 每组难度题目数量为10题,软件随机出题,学生填写答案;

3、一组题全部答完后,显示学生成绩,并根据结果自动升降级,完成通关训练。

提示:1、同学们需自行上网查找生成随机数的方法;

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    srand((unsigned)time(NULL));
一:int s, r = 0, j;//s十题,r对,j结果
    for (s = 1; s <= 10; s++)
    {
        int a = rand() % 10, b = rand() % 10, c = rand() % 3;//c运算符号
        switch (c)
        {
        case 0:printf("%d+%d=", a, b); break;
        case 1:printf("%d-%d=", a, b); break;
        case 2:printf("%d*%d=", a, b); break;
        }
        scanf("%d", &j);
        switch (c)
        {
        case 0:if (j == a + b)
        {
            r++;
            break;
        }
        case 1:if (j == a - b)
        {
            r++;
            break;
        }
        case 2:if (j == a * b)
        {
            r++;
            break;
        }
        }
    }
    if (r <= 9)
        goto 一;
二:r = 0;//s十题,r对,j结果
    for (s = 1; s <= 10; s++)
    {
        int a = rand() % 100, b = rand() % 10, c = rand() % 3;//c运算符号
        switch (c)
        {
        case 0:printf("%d+%d=", a, b); break;
        case 1:printf("%d-%d=", a, b); break;
        case 2:printf("%d*%d=", a, b); break;
        }
        scanf("%d", &j);
        switch (c)
        {
        case 0:if (j == a + b)
        {
            r++;
            break;
        }
        case 1:if (j == a - b)
        {
            r++;
            break;
        }
        case 2:if (j == a * b)
        {
            r++;
            break;
        }
        }
    }
    if (r <= 9 && r >= 6)
        goto 二;
    if (r < 6)
        goto 一;
三:r = 0;//s十题,r对,j结果
    for (s = 1; s <= 10; s++)
    {
        int a = rand() % 100, b = rand() % 100, c = rand() % 3;//c运算符号
        switch (c)
        {
        case 0:printf("%d+%d=", a, b); break;
        case 1:printf("%d-%d=", a, b); break;
        case 2:printf("%d*%d=", a, b); break;
        }
        scanf("%d", &j);
        switch (c)
        {
        case 0:if (j == a + b)
        {
            r++;
            break;
        }
        case 1:if (j == a - b)
        {
            r++;
            break;
        }
        case 2:if (j == a * b)
        {
            r++;
            break;
        }
        }
    }
    if (r <= 9 && r >= 6)
        goto 三;
    if (r < 6)
        goto 二;
    printf("结束");
    return 0;
}

实验二、中国著名科学家主要生平事迹查询程序

1、了解电脑系统或手机系统中万年历查询的基本功能;

2、了解中国著名科学家主要生平事迹信息;

3、输入包括年、月的日期,实现输出相应月历表,以及对应日期的科学家生平事迹信息的功能; 例如,钱学森的主要生平事迹简介:钱学森(英文:Qian Xuesen Qian XuesenQian Xuesen Qian XuesenQian XuesenQian Xuesen ,19111911 1911年12 月11 日—2009 20092009年10 月31 日),出生于上海,籍贯浙江杭州,中国共产党的优秀党员,忠诚的共产主义战士,享誉海内外的国家杰出贡献科学家和中国航天事业的奠基人,中国科学院、中国工程院资深院士,中国人民政治协商会议第六届、七届、八届全国委员会副主席,两弹一星功勋奖章获得者 。 钱学森1929 —1934 年就读于国立交通大学机械工程系 ;1939 年获得美国加州理工学院航空和数学博士学位 ;1947 年任麻省理工学院教授;1956 年任中国科学院力学研究所所长;1957 19571957年补选为中国科学院学部委员(院士);1965 1965 年任中华人民共和国第七机械工业部副部长;1970 年任中国人民解放军国防科学技术委员会副主任 ;1986 年6月任中国科学技术协会主席 ;19941994 1994年当选为中国工程院院士 ;钱学森主要从事应用力学、工程控制论、航空工程、火箭导弹技术、系统工程和系统科学、思维科学和人体科学以及马克思主义哲学等领域的研究 。 1991 年10 月钱学森被国务院、中央军委授予“国家杰出贡献科学家”荣誉称号,被中央军委授予一级英雄模范奖章。1999 19991999年9月被党中央、国务院、中央军委授予“两弹一星功勋奖章” 。2009 年10 月31 日在北京逝世,享年98 岁。 用户输入1991 ,10 ,程序能够输出此月份所在的月历表,并给出该月份的科学家事迹 1991 19911991年10 月钱学森被国务院、中央军委授予“国家杰出贡献科学家” 荣誉称号,被中央军委授予一级英雄模范奖章”。如果同月有其它事迹,也逐一列出。

4、提供主要生平事迹的查询显示功能,显示方式和形式自行设计。

#include<stdio.h>
#include<string.h>
void month_cd(int months);//月历函数
int year, month, day = 1, week, i, j, k;
int years[12][6][7] = { 0 };//年历数组(?)
int monthname[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
char weekname[] = "SUN  MON  TUE  WED  THU  FRI  SAT";
int main()
{
    scanf("%d", &year);
    //星期计算(固定算法)
    day = year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + day;
    week = day % 7;//week·星期几
    //闰年计算
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        monthname[1] = 29;
    }
    scanf("%d", &month);
    month_cd(month);
    printf("%s\n", weekname);
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 7; j++)
        {
            if (years[month - 1][i][j] == 0)
            {
                printf("     ");
            }
            else
            {
                printf("%-5d", years[month - 1][i][j]);
            }
        }
        printf("\n");
    }
    //输出科学家事迹
    if (year == 1911)
        if (month == 12)
            printf("出生于上海,籍贯浙江杭州,中国共产党的优秀党员,忠诚的共产主义战士,享誉海内外的国家杰出贡献科学家和中国航天事业的奠基人,中国科学院、中国工程院资深院士,中国人民政治协商会议第六届、七届、八届全国委员会副主席,两弹一星功勋奖章获得者 。\n");
    if (year >= 1929 && year <= 1934)
        printf("就读于国立交通大学机械工程系\n");
    if (year == 1939)
        printf("获得美国加州理工学院航空和数学博士学位\n");
    if (year == 1947)
        printf("任麻省理工学院教授\n");
    if (year == 1956)
        printf("任中国科学院力学研究所所长\n");
    if (year == 1957)
        printf("补选为中国科学院学部委员(院士)\n");
    if (year == 1965)
        printf("任中华人民共和国第七机械工业部副部长\n");
    if (year == 1970)
        printf("任中国人民解放军国防科学技术委员会副主任\n");
    if (year == 1986)
        if (month == 6)
            printf("任中国科学技术协会主席\n");
    if (year == 1994)
        printf("当选为中国工程院院士 ;钱学森主要从事应用力学、工程控制论、航空工程、火箭导弹技术、系统工程和系统科学、思维科学和人体科学以及马克思主义哲学等领域的研究 。\n");
    if (year == 1991)
        if (month == 10)
            printf("钱学森被国务院、中央军委授予“国家杰出贡献科学家”荣誉称号,被中央军委授予一级英雄模范奖章。\n");
    if (year == 1999)
        if (month == 9)
            printf("被党中央、国务院、中央军委授予“两弹一星功勋奖章” 。\n");
    if (year == 2009)
        if (month == 10)
            printf("在北京逝世,享年98 岁。\n");
    return 0;
}

void month_cd(int months)
{//months为要计算的月份
    int days = week;
    int nday = 1;
    for (i = 0; i < months - 1; i++)
    {
        days += monthname[i];
    }
    days = days % 7;
    for (i = 0; i < 6; i++)
    {
        for (j = days; j < 7; j++)
        {
            days = 0;
            years[months - 1][i][j] = nday++;
            if (nday - 1 == monthname[months - 1])
            {
                return;
            }
        }
    }
}

注:原实验三为多个合作实验题目,故暂不给出源代码

实验三、国产战机性能参数比较程序

1.了解国产化战斗机发展历程,查阅并了解我国战斗机的性能参数;
2.至少录入五种以上国产战斗机的性能参数,包括飞行型号、飞机名称,机身长,机身宽,翼展,最大飞行速度,最大飞行高度,航程,作战半径,载弹量等;使用正确的数据类型对以上信息进行保存;
3.至少自定义两个函数,实现对不同参数进行排序的功能;
4.设计合理的用户交互程序,实现对这些参数的显示、查询、排序等菜单功能。

#include <stdio.h>
#include <string.h>

// 国产战斗机结构体定义
typedef struct Fighter
{
    char model[50];
    char name[50];
    int length;
    int width;
    int wing_span;
    int max_speed;
    int max_height;
    int range;
    int radius;
    int payload;
} Fighter;

// 冒泡排序函数
void bubbleSort(Fighter arr[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - i - 1; j++)
        {
            if (arr[j].max_speed < arr[j + 1].max_speed)
            {
                Fighter temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 显示所有战斗机信息
void displayFighters(Fighter arr[], int n)
{
    printf("Model\tName\tLength\tWidth\tWing Span\tMax Speed\tMax Height\tRange\tRadius\tPayload\n");
    for (int i = 0; i < n; i++)
    {
        printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
            arr[i].model, arr[i].name, arr[i].length, arr[i].width, arr[i].wing_span,
            arr[i].max_speed, arr[i].max_height, arr[i].range, arr[i].radius, arr[i].payload);
    }
}

// 查询战斗机信息
void searchFighter(Fighter arr[], int n)
{
    char model[50];
    printf("请输入要查询的飞机型号:");
    scanf("%s", model);

    for (int i = 0; i < n; i++)
    {
        if (strcmp(model, arr[i].model) == 0)
        {
            printf("找到的飞机信息如下:\n");
            printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
                arr[i].model, arr[i].name, arr[i].length, arr[i].width, arr[i].wing_span,
                arr[i].max_speed, arr[i].max_height, arr[i].range, arr[i].radius, arr[i].payload);
            return;
        }
    }

    printf("未找到该型号的飞机。\n");
}

int main()
{
    Fighter fighters[] =
    {
        {"J-20", "歼-20", 20.3, 4.7, 13.6, 2100, 18000, 2000, 1100, 11},
        {"J-15", "歼-15", 22.2, 9.7, 15.0, 1750, 15000, 3500, 1200, 8},
        {"J-16", "歼-16", 21.9, 12.0, 14.7, 1800, 18000, 3900, 1500, 12},
        {"J-10B", "歼-10B", 16.9, 9.8, 9.5, 1550, 16000, 1800, 1100, 7},
        {"JF-17", "枭龙", 14.3, 9.1, 8.9, 1700, 16000, 1200, 800, 3}
    };
    int n = sizeof(fighters) / sizeof(fighters[0]);

    while (1)
    {
        printf("\n请选择操作:\n");
        printf("1. 显示所有战斗机信息\n");
        printf("2. 根据最大速度排序\n");
        printf("3. 查询战斗机信息\n");
        printf("4. 退出程序\n");
        int choice;
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            displayFighters(fighters, n);
            break;
        case 2:
            bubbleSort(fighters, n);
            printf("已按照最大速度排序:\n");
            displayFighters(fighters, n);
            break;
        case 3:
            searchFighter(fighters, n);
            break;
        case 4:
            return 0;
        default:
            printf("无效的选择,请重新输入。\n");
        }
    }

    return 0;
}

如有问题或修改建议欢迎在评论区指出!

今天是2023年最后一天了,预祝大家新年快乐!(鞠躬)

  • 21
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lnk_

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值