c语言复习

3-2 奇偶分家。输入一个正整数n,再输入n个非负整数,统计奇数和偶数各有多少个

#include<stdio.h>
int main()
{
    int count_odd, count_even, i, n, number;
    count_odd,count_even,i,n,number;
    count_odd=0;    /*count_odd记录奇数的个数*/
    count_even=0;   /*count_even记录偶数的个数*/
    printf("Enter n:"); 
    scanf("%d",&n);
    printf("Enter %d numbers:",n);
    for(i=1; i<=n; i++){
        scanf("%d", &number);
        if(number%2!=0){    /*若number除以2的余数不是0,則力奇数*/
            count_odd++;
        }else{
            count_even++;
        }
    }
    printf("Odd:%d, Even:%d\n",count_odd, count_even);
    return 0;
}

练习3-2 计算符号函数的值

对于任一整数n,符号函数sign(n)的定义如下:

image-20240303103042572
请编写程序计算该函数对任一输入整数的值。
输入格式:
输入在一行中给出整数n。
输出格式:
在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

输入样例1:
10
输出样例1:
sign(10) = 1
输入样例2:
0
输出样例2:
sign(0) = 0
输入样例3:
-98
输出样例3:
sign(-98) = -1
#include <stdio.h>
int main(){
    int n, sign; 
    scanf("%d", &n); 
    if( n < 0 )
        sign = -1;
    else if( n == 0 )
        sign = 0;
    else 
        sign = 1;    
    printf("sign(%d) = %d", n, sign);
    return 0;
}

练习3-3 统计学生平均成绩与及格人数

本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。

输入格式:
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:
按照以下格式输出:

average = 成绩均值
count = 及格人数
其中平均值精确到小数点后一位。

输入样例:
5
77 54 92 73 60
输出样例:
average = 71.2
count = 4

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

int main()
{
    int N;
    int count=0,sum=0;
    double P;
    scanf("%d\n",&N);
    for (int i=0; i<N; i++)
    {
        int a;
        scanf("%d",&a);
        if(a>=60)
        {
            count ++;
        }
        sum=sum+a;
    }
    P= N==0? 0: sum*1.0/N;
    printf("average = %.1f\n",P);
    printf("count = %d",count);
}


3-10 输入一个正整数n,再输入n个字符,分别统计出其中空格或回车、数字字符和其他字符个数。要求使用switch语句编写。

// 统计字符,包括空格或回车、数字字符和其他字符
#include<stdio.h>
int main(){
    int blank, digit, i, n, other;    /*定义3个变量分别存放统计结果*/
    char ch;
    blank = digit = other = 0; /*置存放统计结果的3个变量的初值为零*/
    printf("Enter n:");
    scanf("%d",&n);
    getchar();
    printf("Enter %d characters:",n);
    for(i=1; i<=n; i++){
        ch = getchar();     /*输入1个字符*/
        switch(ch){
            case ' ':   /*语句段为空,请注意空格符的表示方式 */
            case '\n':
            blank++;
            break;
            case'0': case'1': case'2': case'3': case'4':
            case'5': case'6': case'7': case'8': case'9':
                digit++;
                break;
            default:
                other++;
                break;
        }
    }
    printf("blank=%d, digit=%d, other=%d\n", blank, digit, other);
    return 0;
}

练习4-3 求给定精度的简单交错序列部分和

本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。

输入格式:

输入在一行中给出一个正实数eps。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例1:

4E-2

输出样例1:

sum = 0.854457

输入样例2:

0.02

输出样例2:

sum = 0.826310
#include<stdio.h>
#include<math.h>
int main(){
	double eps,i,x=1.0,sum=1.0;
	scanf("%lf",&eps);
	for(i=1;x>eps;i++){
		x=1/(1+3*i);          // 错误点:写了i+=3;导致i实际加了不止3 
		sum += (pow(-1,i))*x;
	}
	printf("sum = %.6lf",sum);
	return 0;
}

判断素数

#include <stdio.h>
int main()
{
	int n,i;
	printf("请输入一个数:\n");
	scanf("%d",&n);
	for(i=2;i<n;i++)
		if(n%i==0)
			break;
	if(i<n)
		printf("%d不是素数\n",n);
	else
		printf("%d是素数\n",n); 
	return 0;
} 

4-7 求e的近似值

自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:

输入第一行中给出非负整数 n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180
#include<stdio.h>
int main()
{
	int i, j, n;
	double m, sum;
	sum=1;
	scanf("%d", &n);
	for(i=1; i<=n; i++){
		m=1;
		for(j=1; j<=i; j++){
			m=m*j;//阶乘
		}
		m=1.0/m;
		sum=sum+m;
	}
	printf("%.8f", sum);
	
	return 0;
}

5-3 使用函数判断完全平方数。定义一个判断完全平方数的函数 IsSquare(n),当n为完全平方数时返回 1,否则返回 0,不允许调用数学库函数。

可以来用以下等差数列求和公式计算。
1+3+5+7+..+(2×m-1)=m^2=n

#include <stdio.h>
int IsSquare(int n){
    int i;
    for(i=1; n>0; i=i+2){
        n=n-i;
    }
    if(n==0){
        return 1;
    }else{
        return 0;
    }
}

5-4 最大公约数函数

#include <stdio.h>
int main()
{
    int u, v;
    scanf("%d %d", &u, &v);
    while (v != 0)
    {
        int tmp = u % v;
        u = v;
        v = tmp;
    }
    printf("%d", u);
    return 0;
}

5-6 数字金字塔

#include <stdio.h>
void pyramid(int n );
int main()
{
    int n;
    scanf("%d", &n);
    pyramid(n);
    return 0;
}
void pyramid( int n ){
    int i,j,k;
    //下面是三层for
    for(i=1;i<=n;i++){
        for( j=1;j<=n-i;j++){
            printf(" ");//输出空格
        }
        for(k=1;k<=i;k++){//行数和数字数目相同的。
            printf("%d",i);
            printf(" ");
        }
        printf("\n");//注意换行
    }
}

7-1 输入所有大于平均值的数

输入格式:

输入在第1行中给出一个正整数n(1≤n≤10),第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。

输出格式:

输出在第1行给出平均值,保留2位小数。在第2行输出所有大于平均值的数,每个数的后面有一个空格;如果没有满足条件的数,则输出空行。

如果输入的n不在有效范围内,则在一行中输出"Invalid."。

输入样例1:

10
55 23 8 11 22 89 0 -1 78 186

输出样例1:

47.10
55 89 78 186 

输入样例2:

0

输出样例2:

Invalid.
//
// Created by hl on 2024/3/3.
//
#include<stdio.h>
int main()
{
    int i,n,count=0,sum=0;
    double ave;
    int a[10]; //括号里面要为数!
    scanf("%d",&n);
    if(n>10||n<1) printf("Invalid.");
    else{ //这个括号不能省!!!
        for(i=0;i<n;i++){ //i从0开始!
            scanf("%d",&a[i]); //给数组元素输入数字
            sum=sum+a[i];
        }
        ave=1.0*sum/n;
        printf("%.2f\n",ave);
        for(i=0;i<n;i++){
            if(a[i]>ave){
                printf("%d ",a[i]);
                count++;
            }
        }
        if(count==0) printf("\n");
    }
    return 0;
}

7-10 计算天数

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。

注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

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

7-11 回文字符串

//
// Created by hl on 2024/3/3.
//
#include <stdio.h>
#include <string.h>

int main()
{
    char a[100]= {0};
    int i = 0;
    int len = 0;
    gets(a);
    len = strlen(a); //计算输入字符串的长度;
    for(i = 0; i < (len / 2); i++) //只需要判断前一半(len/2)长度就好了
    {
        if(a[i] != a[len - 1 - i]) //判断是否为回文数;
        {
            printf("不是回文数\n");
            return 0;
        }
    }
    printf("是回文数\n");
    return 0;
}

冒泡排序

#include<stdio.h>
int main(){
    int data[10];
    printf("请输入数据:\n");
    int i,j;
    for(i = 0;i < 10;i ++){
        scanf("%d",&data[i]);	//输入数据
    }
    for(i = 0;i < 10;i ++){  //采用双重循环
        for(j = 0;j < 10 - 1 - i;j++){
            if(data[j] > data[j+1]){     //这里默认采用升序来排列
                int temp;        //定义一个临时值来存储数据,以此来达到交换数值的目的
                temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
            }
        }
    }
    printf("排序好的数组为:\n");
    for(i = 0;i < 10;i ++){    //用for循环来遍历并输出排序完成的数组
        printf("%d ",data[i]);
    }
    return 0;
} 

7-1 计算个人所得税

计算个人所得税:编写一个程序,根据用户的收入计算应缴纳的个人所得税并输出结果。假设个人所得税税率定义为:

当工资不超过3500时,税率为0;

当工资在区间(3500, 5000]时,税率为5%;

当工资在区间(5000, 8000]时,税率为10%;

当工资在区间(8000, 12000]时,税率为15%;

当工资在区间超过12000]时,税率为20%;

输入格式:

读入一个实型数据,表示工资。例如:6000。

输出格式:

输出一个实型数据(保留2位小数),表示应交个税。例如:175.00。

输入样例:

在这里给出一组输入。例如:

10000

输出样例:

在这里给出相应的输出。例如:

675.00
#include <stdio.h>

int main() {
    double income, tax = 0.0;

    // 输入工资
    printf("请输入您的工资:");
    scanf("%lf", &income);

    // 根据工资计算个人所得税
    if (income > 12000) {
        tax = (income - 12000) * 0.20 + (12000 - 8000) * 0.15 + (8000 - 5000) * 0.10 + (5000 - 3500) * 0.05;
    } else if (income > 8000) {
        tax = (income - 8000) * 0.15 + (8000 - 5000) * 0.10 + (5000 - 3500) * 0.05;
    } else if (income > 5000) {
        tax = (income - 5000) * 0.10 + (5000 - 3500) * 0.05;
    } else if (income > 3500) {
        tax = (income - 3500) * 0.05;
    }

    // 输出个人所得税
    printf("应缴纳的个人所得税为:%.2f\n", tax);

    return 0;
}

7-3 哪里贵了

在一次直播销售活动中,消费者在弹幕中提出“这个品牌越来越贵了”时,销售员里加其(Rigachi)回应说:“哪里贵了?”。为了解决这个问题,他决定为每一种商品打一个折扣。然而,他只想为那些定价过高的商品打折。里加其(Rigachi)认为,如果一个商品的价格超过了所有商品的平均价格,那么这个商品就定价过高。定价过高的商品应该打9折,其他商品的价格保持不变。现在,请你来帮他计算出每种商品的折扣后的价格。

输入格式:

输入共有2行
第一行,输入商品的数量n (1≤n≤10)
第二行,n个浮点数a**i​,a**i​表示每种商品的价格(1≤a**i​≤231−1)

输出格式:

n个浮点数,代表每种商品的折扣后的价格(保留至小数点后1位),中间以一个空格分割,末尾不得有多余的空格

输入样例:

8
40.3 90.2 74.3 34.4 33.1 32.1 12.6 69.8

输出样例:

在这里给出相应的输出。例如:

40.3 81.2 66.9 34.4 33.1 32.1 12.6 62.8
#include <stdio.h>

int main() {
    int n;
    double sum = 0.0;
    double avg;

    // 输入商品数量
    scanf("%d", &n);

    // 输入每种商品的价格并计算总价格
    double prices[n];
    for (int i = 0; i < n; ++i) {
        scanf("%lf", &prices[i]);
        sum += prices[i];
    }

    // 计算平均价格
    avg = sum / n;

    // 输出每种商品的折扣后价格
    for (int i = 0; i < n; ++i) {
        if (i > 0) {
            printf(" "); // 输出空格分隔,但最后一个商品后不输出空格
        }
        if (prices[i] > avg) {
            printf("%.1f", prices[i] * 0.9); // 定价过高的商品打9折
        } else {
            printf("%.1f", prices[i]); // 其他商品价格保持不变
        }
    }

    printf("\n"); // 输出换行符

    return 0;
}

7-4 结构体应用:计算总分及最高分

本题目要求先输入正整数N,然后输入N个类型为结构体stud的数组元素,计算每个学生的总分,输出每个学生的学号、姓名、三门课的成绩及总分;计算全部成绩的平均分并输出;输出总分最高同学的各项信息。
struct stud {
int num; //学号
char name[10]; //姓名
int score[3]; //3门课成绩
int sum; //总分
};

输入格式:

先输入不超过10的一个正整数N,然后每行输入一个学生的信息(学号、姓名、三门课成绩)。学号在整数范围内,姓名长度小于10个字符。

输出格式:

首先输出每个学生的信息(包括学号、姓名、三门课成绩、总分),数据项之间空1格,每人一行;再输出全部成绩的平均分;最后输出总分最高(假设没有相同总分)同学的学号、姓名、三门课成绩及总分,数据项之间空1格。

输入样例:

在这里给出一组输入。例如:

4
1  张三  81  85  82
2  李四  82  78  74
3  王五  85  74  90
4  赵六  77  85  79

输出样例:

在这里给出相应的输出。例如:

1 张三 81 85 82 248
2 李四 82 78 74 234
3 王五 85 74 90 249
4 赵六 77 85 79 241
总平均分=81.000000
3 王五 85 74 90 249
#include <stdio.h>

struct stud {
    int num; // 学号
    char name[10]; // 姓名
    int score[3]; // 3门课成绩
    int sum; // 总分
};

int main() {
    int N, max_sum = 0;
    struct stud max_stud; // 用于存储总分最高的学生信息

    // 输入学生数量
    scanf("%d", &N);

    // 定义学生数组
    struct stud students[N];

    // 输入每个学生的信息并计算总分
    for (int i = 0; i < N; ++i) {
        scanf("%d %s %d %d %d", &students[i].num, students[i].name,
              &students[i].score[0], &students[i].score[1], &students[i].score[2]);
        students[i].sum = students[i].score[0] + students[i].score[1] + students[i].score[2];
        // 更新总分最高的学生信息
        if (students[i].sum > max_sum) {
            max_sum = students[i].sum;
            max_stud = students[i];
        }
    }

    // 输出每个学生的信息
    for (int i = 0; i < N; ++i) {
        printf("%d %s %d %d %d %d\n", students[i].num, students[i].name,
               students[i].score[0], students[i].score[1], students[i].score[2], students[i].sum);
    }

    // 计算并输出平均分
    double total_sum = 0;
    for (int i = 0; i < N; ++i) {
        total_sum += students[i].sum;
    }
    printf("总平均分=%.6f\n", total_sum / N);

    // 输出总分最高的学生信息
    printf("%d %s %d %d %d %d\n", max_stud.num, max_stud.name,
           max_stud.score[0], max_stud.score[1], max_stud.score[2], max_stud.sum);

    return 0;
}

7-5 输出数列的和

输出数列 image.png的前 n 项 的和,其中 1 <=n<= 11,式中符号!表示阶乘,0的阶乘等于1, 当n为1时,表示第1项 1.0/0! = 1。

输入格式:

请在这里写输入格式。例如:输入非负整数n,n <=11。

输出格式:

请在这里描述输出格式。例如:输出数列的和。

输入样例:

在这里给出一组输入。例如:

10

输出样例:

在这里给出相应的输出。例如:

2.718282
#include <stdio.h>

double factorial(int n) {
    if (n == 0) {
        return 1;
    }
    double result = 1;
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}

int main() {
    int n;
    double sum = 1.0; // 第一项为1.0/0!

    // 输入n的值
    scanf("%d", &n);

    // 计算数列的和
    for (int i = 1; i < n; ++i) {
        sum += 1.0 / factorial(i);
    }

    // 输出数列的和
    printf("%.6f\n", sum);

    return 0;
}

函数题、

6-1 输入3个整数,按由小到大的顺序输出,编写一个函数,完成两个数字的交换。

输入3个整数,按由小到大的顺序输出,编写一个函数,完成两个数字的交换。

函数接口定义:

void swap(int *p1,int *p2);

p1和p2接收主函数传递的实参,函数swap()完成两个数字的交换。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#include "stdio.h"
void swap(int *p1,int *p2);
int main() 
{
    int a1,a2,a3;
    int *p1,*p2,*p3;
    scanf("%d%d%d",&a1,&a2,&a3);
    p1=&a1;
    p2=&a2;
    p3=&a3;
    if (a1>a2) swap(p1,p2);
    if (a1>a3) swap(p1,p3);
    if (a2>a3) swap(p2,p3);
    printf("%d < %d < %d",a1,a2,a3);
    return 0;
}
/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

3 -1 8

输出样例:

在这里给出相应的输出。例如:

-1 < 3 < 8
#include "stdio.h"

// 函数声明
void swap(int *p1, int *p2);

int main() {
    int a1, a2, a3;
    int *p1, *p2, *p3;
    scanf("%d%d%d", &a1, &a2, &a3);
    p1 = &a1;
    p2 = &a2;
    p3 = &a3;
    // 使用if语句和swap函数进行排序
    if (a1 > a2) swap(p1, p2);
    if (a1 > a3) swap(p1, p3);
    if (a2 > a3) swap(p2, p3);
    printf("%d < %d < %d", a1, a2, a3);
    return 0;
}

// 函数定义,交换两个数字
void swap(int *p1, int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

6-2 打折促销(函数)

定义一个名为Zhe的函数,完成如下打折计算功能,并将结果返回。
商店打折方案如下:
商品价格满300元减100,满200元减80,低于200元按原价。
设计函数实现该打折方案。

函数接口定义:

int Zhe(int x);

该函数完成上述打折方案,并将计算结果返回。

裁判测试程序样例:

#include <stdio.h>
int Zhe(int x);
int main()
{
    int a, b;

    scanf("%d", &a);
    b = Zhe(a);
    printf("%d", b);

    return 0;
}
/* 请在这里填写答案 */

输入样例:

300

输出样例:

200
#include <stdio.h>

// 函数声明
int Zhe(int x);

int main() {
    int a, b;

    scanf("%d", &a);
    b = Zhe(a);
    printf("%d", b);

    return 0;
}

// 函数定义,根据打折方案计算价格
int Zhe(int x) {
    if (x >= 300) {
        return x - 100; // 满300元减100
    } else if (x >= 200) {
        return x - 80; // 满200元减80
    } else {
        return x; // 低于200元按原价
    }
}

6-3 整数数组的查找

请编写函数,在数组中查找元素。

函数原型

int ArrayFind(const long long *array, int size, long long value);

说明:array 指示数组的起始地址,size 为数组元素的个数,value 为待查找的元素值。若查找成功,则函数值为首个匹配的元素的下标,否则为 -1。

裁判程序

#include <stdio.h>

#define arraySize 1024

......

int ArrayFind(const long long *array, int size, long long value);

int main()
{
    long long a[arraySize], x;
    int n, k;

    scanf("%d", &n);
    if (n < 1 || n > arraySize)
    {
        puts("Error!");
        exit(1);
    }

    ArrayInput(a, n);
    scanf("%lld", &x);

    k = ArrayFind(a, n, x);
    if (k >= 0)
    {
        printf("Found at %d\n", k);
    }
    else
    {
        puts("Not found");
    }
    return 0;
}

......

/* 你提交的代码将被嵌在这里 */

说明:ArrayInput 函数输入数组。

输入样例1

10
18 43 96 27 15 74 82 96 59 68
96

输出样例1

Found at 2

输入样例2

10
18 43 96 27 15 74 82 96 59 68
45

输出样例2

Not found

关联习题:整数数组的输入。

#include <stdio.h>

#define arraySize 1024

// 函数声明
int ArrayFind(const long long *array, int size, long long value);

int main()
{
    long long a[arraySize], x;
    int n, k;

    scanf("%d", &n);
    if (n < 1 || n > arraySize)
    {
        puts("Error!");
        exit(1);
    }

    // 假设ArrayInput函数已经实现,用于输入数组
    // ArrayInput(a, n);
    for (int i = 0; i < n; ++i) {
        scanf("%lld", &a[i]);
    }

    scanf("%lld", &x);

    k = ArrayFind(a, n, x);
    if (k >= 0)
    {
        printf("Found at %d\n", k);
    }
    else
    {
        puts("Not found");
    }
    return 0;
}

// 函数定义,用于在数组中查找元素
int ArrayFind(const long long *array, int size, long long value) {
    for (int i = 0; i < size; ++i) {
        if (array[i] == value) {
            return i; // 找到元素,返回下标
        }
    }
    return -1; // 未找到元素,返回-1
}

填空题

【程序填空】题目:输出连接后的字符串。

#include "stdio.h"
/***********FILL***********/
2 分
main()
{
   char ss[10]="12345";
   strcat(ss,"6789");
   /***********FILL***********/
   printf(3 分,ss);
}
#include "stdio.h"
#include "string.h"  // 包含字符串处理函数的头文件

int main() {
   char ss[10] = "12345";
   strcat(ss, "6789");  // 使用strcat函数连接字符串
   printf("%s\n", ss);  // 使用%s格式符输出字符串
   return 0;
}

在主函数中定义了一个数组a,实际长度为n,将数组作为参数传给子函数fun1,代码如下是:

void main()
{
int a[100],n;
scanf(“%d”,&n);
for(int i=0;i<n;i++)
scanf(“%d”,1 分);//给数组输入每个元素值
fun1(1 分,1 分);}
子函数fun1功能是实现对数组的每个元素值加1:
void fun1(1 分,int n){
for(int i=0;i<n;i++)
  1 分+=1;
}
#include <stdio.h>
void fun1(int arr[], int n); // 函数声明
int main() {
    int a[100], n;
    scanf("%d", &n); // 输入数组的长度
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]); // 输入数组的每个元素值
    }
    fun1(a, n); // 调用fun1函数并传递数组a和长度n
    return 0;
}
// fun1函数的定义,实现对数组的每个元素值加1
void fun1(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        arr[i] += 1; // 对数组中的每个元素加1
    }
}
posted @ 2024-03-05 20:07  1ydd1  阅读(176)  评论(0)    收藏  举报