c语言练习(大一寒假 一)

本文档展示了结构体在C语言中的应用,包括时间设计结构体用于计算日期,成绩记录结构体用于输入和输出学生信息,以及成绩统计结构体用于计算平均分和最高分。此外,还包含了一个关于利用三个空汽水瓶换一瓶汽水的智力题解决方案,以及检查数学作业中加减法正确性的程序。
摘要由CSDN通过智能技术生成

结构体之时间设计

题目要求:定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。

#include<stdio.h>
struct Date{
	int year;
	int month;
	int day;
};
int main()
{
	int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
	int total,i;
	struct Date date;
	scanf("%d%d%d",&date.year,&date.month,&date.day);

	if((date.year%4==0 && date.year%100!=0)||date.year%400==0)
	{
		mon[1]=29;
	}

	for(i=0;i<date.month-1;i++)
	{
		total=total+mon[i];
	}
	total=total+date.day;
	printf("%d",total);
	return 0;
}

结构体之成绩记录

现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,读取N条记录输入,再按要求输出。 N<100
在这里插入图片描述

首先定义一个结构体进行信息存储

#include<stdio.h>
struct stu{
	char num[100];
	char name[100];
	int score [3];
};
void input (struct stu* a,int n);
void output(struct stu* a,int n);

主函数

int main()
{
	int n;
	scanf("%d",&n);
	struct stu a[n];
	input(a,n);
	output(a,n);
	return 0;
}

输入存储信息

void input(struct stu *a,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%s%s%d%d%d",&(a[i].num),&(a[i].name),&(a[i].score[0]),&(a[i].score[1]),&(a[i].score[2]));
	}
}

输出学生信息

void output(struct stu *a,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%s,%s,%d,%d,%d\n",a[i].num,a[i].name,a[i].score[0],a[i].score[1],a[i].score[2]);
	}
}

结构体之成绩统计2

题目要求:有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩

定义结构体,存储信息

#include<stdio.h>
struct stu{
	char num[100];
	char name[100];
	int score [3];
};
void input (struct stu* a,int n);
void pingjunfen(struct stu *a,int n);
void max(struct stu*a,int n);

主函数

int main()
{
	int n;
	scanf("%d",&n);
	struct stu a[n];
	input(a,n);
	pingjunfen(a,n);
	max(a,n);
	return 0;
}

学生信息的输入


void input(struct stu *a,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%s%s%d%d%d",&(a[i].num),&(a[i].name),&(a[i].score[0]),&(a[i].score[1]),&(a[i].score[2]));
	}
}

判断哪一科的平均分最大

void pingjunfen(struct stu *a,int n)
{
	int i;
	int sum1=0,sum2=0,sum3=0;
	for(i=0;i<n;i++)
	{
		sum1=sum1+a[i].score[0];
		sum2=sum2+a[i].score[1];
		sum3=sum3+a[i].score[2];
	}
	printf("%d %d %d",sum1/n,sum2/n,sum3/n);
	printf("\n");
}

输出分数最高的学生的所有成绩

void max(struct stu *a,int n)
{
	int t[n];
	int i,max,x;
	for(i=0;i<n;i++)
	{
		t[i]=a[i].score[0]+a[i].score[1]+a[i].score[2];
	}
	max=t[0];
	for(i=0;i<n;i++)
	{
		if(t[i]>max)
		{
			max=t[i];
			x=i;
		}
	}
	printf("%s,%s,%d,%d,%d\n",a[x].num,a[x].name,a[x].score[0],a[x].score[1],a[x].score[2]);
	
 } 

汽水瓶

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

#include <stdio.h>
  
int main()
{
    int n;                              //定义n为现有空瓶子数
    while (scanf("%d", &n) != EOF && n) //循环输入n
    {
        int ans = 0;                    //定义答案 初始化为0
        while (n >= 2)                  //循环n>=2时可继续换汽水
        {
            if (n >= 3)                 //模式一:n>=3时三个瓶子换一瓶汽水
            {
                int temp = n / 3;       //temp记录当前瓶子可换取的汽水瓶数
                ans += temp;            //答案加上temp
                n = n - temp * 3 + temp;//n减去换汽水消耗的瓶子,再加上新得到的瓶子
            }
            else if (n == 2)            //模式二:两个瓶子可以借汽水再换
            {
                ans++;                  //答案加一
                n = 0;                  //瓶子清零
            }
        }
        printf("%d\n", ans);            //输出答案
    }
    return 0;
}

弟弟的作业

你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a, b, c, num=0;
    char s[10], c1;
    while(scanf("%d%c%d=%s", &a, &c1, &b, s)!=EOF)
    {
   
        if(c1 == '+' && (a+b == atoi(s)))
            num++;
        else if(c1 == '-' && (a-b == atoi(s)))
            num++;
    }
    printf("%d\n", num);
    return 0;
}

atoi(char *p),它将字符串转换成整数。它会扫描p所指的字符串,跳过空白字符,直到遇见数字或正负号开始转换,再遇见非数字或字符串结束时才停止转换,并将结果返回,返回转换后的整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值