2016

已知数组 int a[10]=[1,3,5,7,9,11,13,15,17,19};请按下列要求用 C 语言编写程序。

(1)编写函数 void swap(int*arr, int n)[..],实现将数组 arr 的前 n 个元素逆序排列,即 arr[0]与 arr[n-1]交换, arr[1]与 arr[n-2]交换···

编写主函数 main(){·..···],将数组 a 按原顺序输出后,调用 swap0)对数组 a 的全部元素进行逆序排列,然后再次输出数组 a。

#include <stdio.h>
void swap(int *arr, int n)
{
    int temp, i, j, m = (n - 1) / 2;
    for (i = 0; i <= m; i++)
    {
        j = n - i - 1;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
void main()
{
    int i, a[10] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
    printf("正常顺序\n");
    for (i = 0; i < 10; i++)
        printf("%d\t", a[i]);
    swap(a, 10);
    printf("排序结果\n");
    for (i = 0; i < 10; i++)
        printf("%d\t", a[i]);
}

现有扑克牌 52 张, 其花色记录为 : char suit[]=3,4,5,6],其牌面定录 为:charface[]={A,’2’,’3’,’4,’5,’6’,’7,8’,’9’,’x’J,’Q’,’K’};请用 C 语言编写程序实现以下功能。

(1) 自定义结构体数组,按照同一花色牌面从小到大的顺序记录全部 52 张扑克牌;
(2) 以时间为参数设置随机序列种子,实现洗牌,即遍历扑克牌数组,依次交换
当前牌与数组中随机位置的牌;
(3) 输出打乱顺序后的全部扑克牌,牌与牌间使用 Tab 分隔

#include <stdio.h>
struct card
{
    char face, suit;
};
// typedef struct card Card;
void main()
{
    struct card deck[52], temp;
    char face[] = {'A', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'J', 'Q', 'K'};
    char suit[] = {3, 4, 5, 6};
    int i, j;
    for (i = 0; i < 52; i++)
    {
        deck[i].face = face[i % 13];
        deck[i].suit = suit[i / 13];
    }
    srand(time(NULL));
    for (i = 0; i < 52; i++)
    {
        j = rand() % 52;
        temp = deck[i];
        deck[i] = deck[j];
        deck[j] = temp;
    }
    for (i = 0; i < 52; i++)
        printf("%d%c\t", deck[i].suit, deck[i].face);
}

2017

编写程序,判断给定的整数是不是素数(素数定义为只能被 和其自身整除的数)。

要求:该数在主函数中输入,用函数 int prime(int n)判断其是否为素数并将结果返回主函数。

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

编写程序,根据以下公式求II的近似值,要求累加到某项小于 e-6 时为止。

$\frac{Π}{2}=1+\frac{1}{3}+\frac{1×2}{3×5}+\frac{1×2×3}{3×5×7}+\frac{1×2×3×4}{3×5×7×9}…+\frac{1×2×3×…×n}{3×5×7×9…(2n-1)}$

#include <stdio.h>
main()
{
    double i, j = 1.00, k = 1.00, s = 1;
    for (i = 1; j / k > 1e-6; i++)
    {
        j = j * i;
        k = k * ((2 * i) + 1);
        s = s + j / k;
    }
    printf("%f", 2 * s);
}

现有 10 个城市名及其春、夏、秋、冬四个季节的平均温度值,编写程序,定义合适的结构体,输入 10 个城市名和四季温度,计算各个城市的全年平均温度,并按照平均温度从低到高的顺序输出城市名、四季温度及全年平均温度。

#include <stdio.h>
struct S
{
    char chengshi;
    float chun, xia, qiu, dong, pingjun;
};
main()
{
    struct S data[10], temp;
    int i, j;
    for (i = 0; i < 10; i++)
    {
        printf("请输入城市名");
        scanf("%s", &data[i].chengshi);
        printf("请输入四个季节的温度");
        scanf("%f,%f,%f,%f", &data[i].chun, &data[i].xia, &data[i].qiu, &data[i].dong);
        data[i].pingjun = (data[i].chun + data[i].xia + data[i].qiu + data[i].dong) / 4.00;
    }
    for (i = 0; i < 9; i++)
    {
        for (j = i; j < 9 - i; j++)
        {
            if (data[j].pingjun > data[j + 1].pingjun)
                temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
        }
        for (i = 0; i < 10; i++)
        {
            printf("%s\t%f\t%f\t%f\t%f\t%f\n", data[i].chengshi, data[i].chun, data[i].xia, data[i].qiu, data[i].dong, data[i].pingjun);
        }
    }
}

2018

编写程序,从键盘上输入三角形的三个边长(实数),判断这三个边能否构成三角形(构成三角形的条件为:任意两边之和大于第三边),如果能构成三角形,则计算三角形的面积并输出(保留 2 位小数):如果不能构成三角形,则输出“ False”字符串信息。假设三角形的边长分别为 a、b、c,则三角形的面积为:√s(s-a) (s-b) (s-c),其中 s 的值为(atb+c)/2。

(1)输入信息为 1.1 2.2 4.4 时,输出 False(2)输入信息为 3.0 4. 0 5. 0 时,输出 6.00

#include <stdio.h>
#include <math.h>
void main()
{
    float a, b, c, s, n;
    printf("请输入三角形的三条边");
    scanf("%f,%f,%f", &a, &b, &c);
    if (a < (b + c) && b < (a + c) && c < (a + b))
    {
        s = (a + b + c) / 2;
        n = sqrt(s * (s - a) * (s - b) * (s - c));
        printf("%.2f", n);
    }
    else
        printf("false");
}

请根据以下累加公式计算Π的近似值并输出,要求累加到某项的值小于 10-5时为止。

$\frac{Π^2}{6}=\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{3^3}+\frac{1}{4^2}…+\frac{1}{n^2}$

精度要求:$\frac{1}{n^2}<10^{-5}$

#include <stdio.h>
#include <math.h>
void main()
{
    float s = 1, n = 1, x, i, c;
    for (i = 2; n > 1e-6; i++)
    {
        n = 1.0 / (i * i);
        s += n;
    }
    printf("%f", sqrt(6 * s));
}

某大学正在举行歌唱比赛,现有 10 位评委为学生评分,评分采用百分制。按如下规则计算学生的最终得分:先计算评委前分数之和,减去分数中的最高分与最低分,再除以 8 得到学生的成绩。请输入 1 位同学的 10 个分数,计算和输出学生的最终得分。

下面给出了 main(函数,请将其他函数补充完整,即写出 input()、ssum()、smax()与 smin(函数的定义

#include <stdio. h>

int main(){

int score[10],max,min,sum;

float aver;

input(score,10); //输入 10 个评委的评分

sum=ssum(score,10); //计算 10 个评委的评分之和

max=smax(score,10); // 计算最高分

min=smin(score,10); //计算最低分

aver=(sum-max-min)*1.0/(10-2); //计算学生的最终得分

printf(“%f,%d,%d,%d”,aver,max,min,sum); //输出学生的最终得分

}

#include <stdio.h>
input(int a[], int n);
int ssum(int a[], int n);
int smax(int a[], int n);
int smin(int a[], int n);
int main()
{
    int score[10], max, min, sum;
    float aver;
    input(score, 10);
    sum = ssum(score, 10);
    max = smax(score, 10);
    min = smin(score, 10);
    aver = (sum - max - min) * 1.0 / (10 - 2);
    printf("%f,%d,%d,%d", aver, max, min, sum);
}
input(int a[], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("请输入第%d个评委成绩", i + 1);
        scanf("%d", &a[i]);
    }
}
int ssum(int a[], int n)
{
    int s = 0;
    for (int i = 0; i < n; i++)
    {
        s = s + a[i];
    }
    return s;
}
int smax(int a[], int n)
{
    int max = a[0];
    for (int i = 0; i < n; i++)
    {
        if (max < a[i])
            max = a[i];
    }
    return max;
}
int smin(int a[], int n)
{
    int min = a[0];
    for (int i = 0; i < n; i++)
    {
        if (min > a[i])
            min = a[i];
    }
    return min;
}

2019

计算输出 Fibonacci 数列前 20 项,并按每行 4 个数的格式输出。该数列有如下特点:

(1)第 1 个数为 1,第 2 个数为 1;

(2)从第 3 个数起,该数等于前两个数之和。即:

F1=1 (n=1)

F2=1 (n=2)

Fn=Fn-1+Fn-2(n>=3)

#include <stdio.h>
int fun(int);
void main()
{
    int i, n;
    for (i = 1; i <= 20; i++)
    {
        n = fun(i);
        printf("%d\t", n);
        if (i % 4 == 0)
            printf("\n");
    }
}
fun(int n)
{
    if (n == 1)
        return 1;
    else if (n == 2)
        return 1;
    else
        return fun(n - 1) + fun(n - 2);
}

学校在 1000 名师生中发起慈善捐款,自愿募捐、款数不限,总数超过 20000(2 万)元活动结束。编写程序,统计参与捐款的师生人数及捐款总数(精确到角币, 即保留 1 位小数)。

#include <stdio.h>
main()
{
    float sum = 0, s;
    int i;
    for (i = 1; i <= 1000; i++)
    {
        printf("请输入第%d个人的捐款数", i);
        scanf("%f", &s);
        sum += s;
        if (sum >= 20000)
            break;
    }
    printf("人数%d\t捐款数%f", i, sum);
}

按要求编程:

(1)设计一个函数 int isprime(int x)用于判断一个整数是否为素数,是素数返 回 1, 否则返回 0。(素数是只能被 1 和它自身整除的整数)

(2)在主函数中调用 isprime 函数,输出 100~999 之间的个位数字为 7 的所有 素数之和。

#include <stdio.h>
int isprime(int x);
main()
{
    int i, m, sum = 0;
    for (i = 100; i < 1000; i++)
    {
        m = isprime(i);
        if (m % 10 == 7)
            sum += m;
    }
    printf("%d", sum);
}
int isprime(int n)
{
    int i;
    for (i = 2; i < n; i++)
        if (n % i == 0)
        {
            return 0;
            break;
        }
    if (i == n)
        return n;
}
#include <stdio.h>
int isprime(int x)
{
    int c, flag = 1;
    for (c = 2; c < x; c++)
        if (x % c == 0)
        {
            flag = 0;
            break;
        }
    return flag;
}
void main()
{
    int i, s = 0;
    for (i = 100; i <= 999; i++)
        if (i % 10 == 7)
        {
            if (isprime(i))
                s = s + i;
        }
    printf("s=%d\n", s);
}

2020

编写程序,从键盘上接收一个百分制成绩(整数),判断数据的合理性。如 果不是正确的成绩(< 0 或 > 100),则输出“Error data!”,否则输出其相 应的等级,成绩在 90 分及以上为 ‘A’,8089 分为 ‘B’,7079 分为 ‘C’,60~69 分为 ‘D’,60 分以下为 ‘E’ 。

例如:(1)输入成绩为 120 时,输出 Error data! (2)输入信息为 85 时,输出 B

【要求:用 switch 语句实现。】

#include <stdio.h>
main()
{
    int i, n;
    scanf("%d", &n);
    if (n < 0 || n > 100)
        printf("Error data");
    else
        switch (n / 10)
        {
        case 10:
        case 9:   printf("A");    break;
        case 8:   printf("B");    break;
        case 7:   printf("C");    break;
        case 6:   printf("D");    break;
        default:  printf("E");    break;
        }
}

有一个 3×4 的矩阵,要求编写程序求出其中值最大的那个元素的值,以及 其所在的行号和列号,并输出到屏幕。请将以下程序补充完整。

【要求:将最大值保存到变量 max,行号保存到变量 x,列号保存到变量 y。】

#include <stdio.h>
void main()
{
    int i, j, max, x = 0, y = 0;
    int a[3][4] = {{1, 2, 3, 4}, {9, 8, 7, 6}, {-10, 10, -5, 2}};
    max = a[0][0];
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            if (max < a[i][j])
            {
                max = a[i][j];
                x = i;
                y = j;
            }
        }
    }
    printf("最大值:%d\t行号:%d\t列号:%d", max, x, y);
}

下面的程序用于从键盘接收一个字符串(假设输入字符串长度在 80 以内), 计算其长度并输出。请将其补充完整。

【要求:不允许使用 strlen()函数,用字符指针实现。】

#include void main() {

char s[81],*p;

}

#include <stdio.h>
void main()
{
    char s[81], *p;
    int i = 0;
    gets(s);
    p = s;
    while (*p != '\0')
    {
        *p++;
        i++;
    }
    printf("%d", i);
}

2021

编写程序,用冒泡法将从键盘上输入的 10 个整数按升序排序,请将程序补充 完整。 所谓冒泡法排序就是相邻的两个元素比较,有反序则交换。

【说明:变量 i 用于控制排序趟数,变量 j 用于相邻的两数比较,变量 i 用于交 换相邻的两个整数,变量 flag = 说明还要进行下一趟排序,flag=0 提前结束 过程】

#include “stdio.h”

void main(){

int a[10],i,j,t,flag=1;

}

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

编写程序,计算如下数列的前 n 项之和,请将程序补充完整。 1,-2,3,-4,5,-6,7,-8,…….

【要求:编写一个求和的函数实现计算,再编写主函数调用,在主函数中输入项 数 n 的值并传入到计算函数中】

#include “stdio.h”

int cal(int n){

int i,s=0,f=1; //i 为循环控制,s 求和,f 改变正负号 }

void main(){

int n;

}

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

下面的程序用于从键盘接收一个字符串,假设输入字符串长度在 80 以内,然 后将自身逆置后复制到该串的末尾,请将其补充完整。

例如:s = “ABCD”, 复制完成后,s=”ABCDDCBA”,输出最终的 s 中的串。 【要求:不允许使用 strcpy()和 strcat()函数,用字符指针实现。】

#include “stdio.h”

void main(){

char s[81],p,q;

}

#include <stdio.h>
void main()
{
    char s[81], *p, *q;
    int n = 0;
    gets(s);
    q = p = s;
    while (*p != '\0')
    {
        p++;
        n++;
        q++;
    }
    p--;
    for (; n >= 0; n--)
    {
        *q++ = *p--;
    }
    puts(s);
}
#include <stdio.h>
void main()
{
    char s[81], *p, *q;
    int n = 0;
    gets(s);
    for (q = s; *q != '\0'; q++)
     ;
    p = q - 1;
    while (p >= s)
    {
        *q++ = *p--;
    }
    *q = '\0';
    puts(s);
}

2022

把下列公式以编程呈现

$\begin{cases}-e^{2x+1}+3,(x\le-2)\2x-4,(-2<x\le3)\2log_{10}(3x+5)-11,(x>3)\end{cases}$

【设计要求】 (1) 函数 double f(double x)的功能是根据给定的 x 计算并返回分段函数 的值。 (2) main 函数中输入 x 的值,并输出调用 f(x)得到的计算结果,输出 格式保留两位小数。

【提示】math 标准库中函数 double exp(double x)用于返回 e 的 x 次方 计算结果,函数 double log10(double x)用于返回以 10 为底的 x 的对数值。

【输入格式】输入一个实数 x 的值

【输出格式】输出 f(x)的结果值

【样例】3、5

【样例】-8、3

#include <stdio.h>
#include <math.h>
double f(double x);
main()
{
    double x;
    scanf("%lf", &x);
    printf("%.2f", f(x));
}
double f(double x)
{
    if (x <= -2)
    {
        return (-1 * exp(2 * x + 1) + 3);
    }
    else if (x <= 3 && x > -2)
        return (2 * x - 1);
    else
        return (2 * log10(3 * x + 5) - 11);
}

编写程序实现:计算数列{ 1 ,12 ,123 ,1234 , … ,123456789} 的前 n (1<=n<=9) 项和。

【输入格式】输入一个正整数 n (1<=n<=9)

【输出格式】输出给定数列的前 n 项和

【输入样例 1】3

【输出样例 1】s= 136

#include <stdio.h>
main()
{
    int n, i, sum = 0, s = 0;
    printf("请输入一个大于等于1小于等于9的数字");
    scanf("%d", &n);
    if (n < 1 || n > 9)
        printf("输入有误");
    else
        for (i = 1; i <= n; i++)
        {
            s = s * 10 + i;
            sum = sum + s;
        }
    printf("%d", sum);
}

编写程序实现功能:根据输入的 N (N<=30) 个会员的基本信息,计算 每名会员的会 费,并输出会费最多的会员 (可能多名) 的姓名和会费。

【设计要求】 (1) 定义会员信息结构体类型 MemInfo ,其成员包括姓名 name (少 于 10 个字符,char[]型)、工资 wage (double 型)、奖金 bonus (double 型)、补贴 allowance (double 型)、 会费 due (int 型); (2) 会费计算规则:会费缴纳基数在 3000 以下 (含 3000) 乘以 0、 5%后取整,基数 在 3000-5000 之间 (含 5000) 则乘以 1%后取整,基数在 5000 以上乘以 1、5%后取整,其 中,会费缴费基数 = 工资+奖金+补贴。

【输入格式】 第一行输入正整数 N 。随后 N 行,每行给出一位会员的基本信息,输 入顺序为:“姓 名”、“工资”、“奖金”和“补贴”,各输入项间以空格分 隔。其中“姓名”为长度小于 10 的不包含空格字符的非空字符串,其它各 项输入、输出保证在双精度范围内。

【输出格式】 输出会费最多的会员 (可能多名) 的“姓名”和“会费”,每行输出 一位会员的“姓 名”和“会费”,“姓名”与“会费”间隔一个空格。

【输入样例】

3

zhao 4400 1700 700

qian 2600 1200 750

sun 3600 1500 1700

【输出样例】

zhao 101

sun 10

#include <stdio.h>
struct NemInfo
{
    char name[10];
    double wage, bonus, allowance;
    int due;
};

main()
{
    int n;
    double sum;
    printf("请输入会员个数");
    scanf("%d", &n);
    struct NemInfo S[30];
    for (int i = 0; i < n; i++)
    {
        printf("请输入第%d个会员信息", i + 1);
        scanf("%s %lf %lf %lf", &S[i].name, &S[i].wage, &S[i].bonus, &S[i].allowance);
        sum = (S[i].wage + S[i].bonus + S[i].allowance);
        if (sum <= 3000)
            S[i].due = (int)(sum * 0.005);
        else if (sum <= 5000 && sum > 3000)
            S[i].due = (int)(sum * 0.01);
        else
            S[i].due = (int)(sum * 0.015);
    }
    printf("\n");
    int max;
    max = S[0].due;
    for (int i = 0; i < n; i++)
    {
        if (max < S[i].due)
            max = S[i].due;
    }
    for (int i = 0; i < n; i++)
    {
        if (max == S[i].due)
            printf("%s %d\n", S[i].name, S[i].due);
    }
}