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);
}
}
GitHub Discussions