2024/3/19 C语言刷题笔记

8:46 书接上回——还有24题没刷,开干~


习题8-10 输出学生成绩

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    double *a=malloc(sizeof(double)*n);
    for(int i=0;i<n;i++)
        scanf("%lf",&a[i]);
    int max=0,min=0;
    double ave,sum=a[0];
    for(int i=1;i<n;i++)
    {
        sum+=a[i];
        if(a[i]<a[min])
            min=i;
        if(a[i]>a[max])
            max=i;
    }
    printf("average = %.2f\n",sum/n);
    printf("max = %.2f\n",a[max]);
    printf("min = %.2f\n",a[min]);
    return 0;
}

习题7-8 字符串转换成十进制整数

#include<stdio.h>
#include<string.h>
int main()
{
    int flag1=0;  //为0表示正
    int flag2=0;  //为0表示负号没有在十六进制前出现
    char ch;
    long long res=0;
    while(scanf("%c",&ch),ch!='#')
    {
        if(flag2==0)
        {
            if(ch=='-')
                flag1=1;
        }
        if(ch>='0'&&ch<='9')
        {
            flag2=1;
            res=res*16+ch-'0';
        }
        if(ch>='a'&&ch<='f')
        {
            flag2=1;
            res=res*16+ch-'a'+10;
        }
        if(ch>='A'&&ch<='F')
        {
            flag2=1;
            res=res*16+ch-'A'+10;
        }
    }
    if(res==0){   //0直接输出,不要管前边是否有正负号
        printf("0");
        return 0;
    }
    if(flag1==0&&flag2==1)  //有数字且没负号
        printf("%lld\n",res);
    if(flag1==1&&flag2==1)   //有数字且有负号
        printf("-%lld\n",res);
    return 0;
}

习题3-5 三角形判断(。。。出师不利,敲%敲成&了,不用编译器是这样的)

#include<stdio.h>
#include<math.h>
int main()
{
    double x1,y1,x2,y2,x3,y3;
    scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
    double d1=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
    double d2=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
    double d3=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
    int flag=0;
    if(d1+d2>d3&&d1+d3>d2&&d2+d3>d1)
        if(d1-d2<d3&&d1-d3<d2&&d3-d2<d1)
            flag=1;
    double C,S;
    if(flag==1)
    {
        double q=(d1+d2+d3)/2;
        C=d1+d2+d3;
        S=sqrt(q*(q-d1)*(q-d2)*(q-d3));
        printf("L = %.2f, A = %.2f",C,S);
    }
    else
        printf("Impossible");
    return 0;
}

练习6-3 英文字母替换加密(大小写转换+后移1位)(脑子抽抽了,一直想怎么对ASCII求余)

#include<stdio.h>
int main()
{
    char str[1001];
    gets(str);
    for(int i=0;str[i]!='\0';i++)
    {
        if(str[i]>='a'&&str[i]<='z')
            str[i]=(str[i]-'a'+1)%26+'A';
        else if(str[i]>='A'&&str[i]<='Z')
            str[i]=(str[i]-'A'+1)%26+'a';
    }
    puts(str);
    return 0;
}

练习7-3 将数组中的数逆序存放

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n/2;i++)
    {
        int temp=a[i];
        a[i]=a[n-i-1];
        a[n-i-1]=temp;
    }
    for(int i=0;i<n-1;i++)
        printf("%d ",a[i]);
    // for(int i=n-1;i>=1;i--)
    // {
    //     printf("%d ",a[i]);  //整活版
    // }
    printf("%d",a[n-1]);
    return 0;
}

练习7-10 查找指定字符

#include<stdio.h>
int main()
{
    char key;
    scanf("%c",&key);
    getchar();     //别把回车读进去了
    char str[81];
    gets(str);
    int index=-1;
    for(int i=0;str[i]!='\0';i++)
    {
        if(str[i]==key)
            index=i;
    }
    if(index==-1)
        printf("Not Found");
    else
        printf("index = %d",index);
    return 0;
}

习题4-5 换硬币(再夸一次,暴力YYDS)

#include<stdio.h>
int main()
{
    int x;
    scanf("%d",&x);
    int count=0;
    for(int five=x/5;five>=1;five--)
        for(int two=x/2;two>=1;two--)
            for(int one=1;one<=x;one++)
            {
                if(one+two*2+five*5==x)
                {
                    count++;
                    printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",five,two,one,one+two+five);
                }
            }
    printf("count = %d\n",count);
    return 0;
}

习题7-1 选择法排序

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b){
    return *(int *)b-*(int *)a;
}
    
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    qsort(a,n,sizeof(int),cmp);
    for(int i=0;i<n-1;i++)
        printf("%d ",a[i]);
    printf("%d",a[n-1]);
}

习题7-3 判断上三角矩阵

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=0;i<t;i++)
    {
        int n;
        scanf("%d",&n);
        int a[n][n];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&a[i][j]);
        int flag=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<i;j++)
                if(a[i][j]!=0)
                {
                    flag=1;
                }
        if(flag==1)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

习题7-5 找鞍点

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n][n];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    //找每行最大值的位置,然后立马与该列其他值比较若最小则找到
    for(int i=0;i<n;i++)
    {
        int max=a[i][0];
        int maxi=i;
        int maxj=0;
        for(int j=1;j<n;j++)  //题目不说至多一个鞍点么
            if(a[i][j]>=max)  //测试点2需要最后一个是鞍点咱也不知道为啥。只能>=而不是>了
            {
                max=a[i][j];
                maxi=i;
                maxj=j;
            }
        int flag=0; //判断该列有没有比自己更小的元素
        for(int k=0;k<n;k++)
            if(a[k][maxj]<max)
            {
                flag=1;
                break;
            }
        if(flag==0)
        {
            printf("%d %d",maxi,maxj);
            return 0;
        }
    }
    printf("NONE");
    return 0;
}

练习3-8 查询水果价格 

#include <stdio.h>
int main() {
    float prices[] = {3.00, 2.50, 4.10, 10.20};
    printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
    int queryCount = 0;
    int fruitCode;
    while (queryCount < 5) {
        scanf("%d", &fruitCode);
        if (fruitCode == 0) {
            break;
        } else if (fruitCode >= 1 && fruitCode <= 4) {
            printf("price = %.2f\n", prices[fruitCode - 1]);
            queryCount++;
        } else {
            printf("price = 0.00\n");
            queryCount++;
        }
    }
    return 0;
}

习题3-3 出租车计价(又是(int)墙砖和%.0f的区别,题意描述的也很有bug)

#include<stdio.h>
int main()
{
    float mile;
    int minute;
    float price;
    scanf("%f%d",&mile,&minute);
    if(mile<=3)
        price=10;
    else if(mile<=10)
        price=(mile-3)*2+10;
    else
        price=24+(mile-10)*3;
    while(minute>=0)
    {
        minute-=5;
        if(minute<0)
            break;
        price+=2;
    }    
    printf("%.0f",price);
    return 0;
}

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

#include<stdio.h>
#include<math.h>
int main()
{
    double eps;
    scanf("%lf",&eps);

    double res=0;
    int i=1;
    double sign=1;
    double temp=1;
    if(fabs(temp)<eps)
    {
        printf("sum = %.6f",temp);  //好蠢啊,一直以为精度大于第一项就不加第一项了
        return 0;
    }
    while(fabs(temp)>=eps)
    {
        res+=temp;
        sign=-sign;
        i+=3;
        temp=sign/(1.0*i);
    }
    printf("sum = %.6f",res);
    return 0;
}

习题9-1 时间换算

#include<stdio.h>
int main()
{
    int hh,mm,ss,n;
    scanf("%d:%d:%d",&hh,&mm,&ss);
    scanf("%d",&n);
    int carrys=0,carrym=0;
    if((ss+n)/60==1)
        carrys=1;
    ss=(ss+n)%60;
    if((mm+carrys)/60==1)   //本题限定n<60自然好写,本代码还可轻易改成对任意n
        carrym=1;
    mm=(mm+carrys)%60;
    hh=(hh+carrym)%24;
    printf("%02d:%02d:%02d",hh,mm,ss);
    return 0;
}

练习7-9 计算天数(这种写了几百遍了,懒得写了)

#include <stdio.h>
int daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int isLeapYear(int year)
{
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main()
{
    int year, month, day;
    scanf("%d/%d/%d", &year, &month, &day);
    int days = 0;
    for (int i = 1; i < month; i++)
    {
        days += daysOfMonth[i];
        if (i == 2 && isLeapYear(year))
        {
            days++; // 闰年的2月有29天
        }
    }
    days += day;
    printf("%d\n", days);
    return 0;
}

练习7-7 矩阵运算

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

习题4-9 打印菱形图案

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

习题3-4 统计学生成绩

#include <stdio.h>
int main()
{
    int N;
    scanf("%d", &N);
    int score, countA = 0, countB = 0, countC = 0, countD = 0, countE = 0;
    for (int i = 0; i < N; i++)
    {
        scanf("%d", &score);
        
        if (score >= 90)
        {
            countA++;
        }
        else if (score >= 80)
        {
            countB++;
        }
        else if (score >= 70)
        {
            countC++;
        }
        else if (score >= 60)
        {
            countD++;
        }
        else
        {
            countE++;
        }
    }
    printf("%d %d %d %d %d\n", countA, countB, countC, countD, countE);
    return 0;
}

习题9-4 查找书籍

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

struct Book {
    char name[31];
    double price;
};

int main()
{
    int n;
    scanf("%d", &n);
    getchar(); // 读取换行符

    struct Book books[n];

    for (int i = 0; i < n; i++)
    {
        gets(books[i].name);
        scanf("%lf", &books[i].price);
        getchar(); 
    }

    double maxPrice = books[0].price;
    double minPrice = books[0].price;
    int maxIndex = 0;
    int minIndex = 0;

    for (int i = 1; i < n; i++)
    {
        if (books[i].price > maxPrice)
        {
            maxPrice = books[i].price;
            maxIndex = i;
        }
        if (books[i].price < minPrice)
        {
            minPrice = books[i].price;
            minIndex = i;
        }
    }

    printf("%.2lf, %s\n", books[maxIndex].price, books[maxIndex].name);
    printf("%.2lf, %s\n", books[minIndex].price, books[minIndex].name);

    return 0;
}

习题9-5 通讯录排序(把生日抽象成int型比大小确实方便)

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

struct Friend {
    char name[11];
    int birthday;
    char phone[18];
};

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

    // 处理输入超出限制的情况
    if (n > 10) {
        n = 10;
    }

    struct Friend friends[n];

    for (int i = 0; i < n; i++)
    {
        scanf("%s %d %s", friends[i].name, &friends[i].birthday, friends[i].phone);
    }

    // 根据出生日期进行年龄排序(从大到小)
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            if (friends[j].birthday > friends[j + 1].birthday)
            {
                struct Friend temp = friends[j];
                friends[j] = friends[j + 1];
                friends[j + 1] = temp;
            }
        }
    }

    // 输出朋友信息
    for (int i = 0; i < n; i++)
    {
        printf("%s %d %s\n", friends[i].name, friends[i].birthday, friends[i].phone);
    }

    return 0;
}

习题7-2 求一批整数中出现最多的个位数字

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int hash[10]={0};
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%d",&x);
        do       //测试点4卡while卡半天,突然想起来可以输入0,那就do-while
        {
            hash[x%10]++;
            x=x/10;
        }while(x!=0);
    }
    int max=0;
    for(int i=1;i<=9;i++)
    {
        if(hash[i]>hash[max])
            max=i;
    }
    printf("%d: ",hash[max]);
    int k=0;
    int res[10]={0};
    for(int i=0;i<=9;i++)
        if(hash[i]==hash[max])
        {
            res[k++]=i;
        }
    for(int i=0;i<k-1;i++)
        printf("%d ",res[i]);
    printf("%d",res[k-1]);
    return 0;
    
}

习题6-7 简单计算器

#include <stdio.h>

int main() {
    char op;  // 运算符
    int num, result;

    // 读取第一个数
    if(scanf("%d", &result) != 1) {
        printf("ERROR\n");
        return 0;
    }

    while(1) {
        // 读取运算符
        if(scanf("%c", &op) != 1) {
            break;
        }

        if(op == '=') {
            break;
        }

        // 读取下一个数
        if(scanf("%d", &num) != 1) {
            printf("ERROR\n");
            return 0;
        }

        // 根据运算符计算
        switch(op) {
            case '+':
                result += num;
                break;
            case '-':
                result -= num;
                break;
            case '*':
                result *= num;
                break;
            case '/':
                if(num == 0) {
                    printf("ERROR\n");
                    return 0;
                }
                result /= num;
                break;
            default:
                printf("ERROR\n");
                return 0;
        }
    }

    printf("%d\n", result);

    return 0;
}

练习7-8 方阵循环右移

#include <stdio.h>

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

    int matrix[6][6]; 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    // 在这里重新计算 m 对应的正确移动次数
    m = m % n;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", matrix[i][(j + n - m) % n]);   //有待理解
        }
        printf("\n");
    }

    return 0;
}

练习7-4 找出不是两个数组共有的元素

#include <stdio.h>

int main()
{
	int n, m;
	int i, j;
	int a[20], b[20], c[20];

	//输入
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", a + i);

	scanf("%d", &m);
	for (int i = 0; i < m; i++)
		scanf("%d", b + i);

	//判断
	int cnt = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			if (a[i] == b[j])
				break;
		}
		if (j == m)
			c[cnt++] = a[i];
	}

	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (b[i] == a[j])
				break;
		}
		if (j == n)
			c[cnt++] = b[i];
	}

	//相同数字不输出
	printf("%d", c[0]);
	for(i = 1; i < cnt;i++)
	{
		for (j = 0; j < i; j++)
		{
			if (c[i] == c[j])
			{
				break;
			}
		}
		if (j == i)
		{
			printf(" %d", c[i]);
		}
	}
	return 0;
}

PS:最后两题实在懒得写了,最后一题也不太会,后期有时间好好研究研究。结束!完结撒花~


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值