新希望C语言编程专题

C语言编程附加题及输入处理问题

附加题:

1.空瓶换水问题属于数学运算中的一类问题,每4个空瓶子又能换1瓶水,喝掉以后比如有15瓶水,每喝完1瓶得到1个空瓶子,又得到1个空瓶子。那么最多能喝几瓶水?分析:我们想要的是喝到最多瓶水,而最后3个空瓶去换水的过程中,想要使空瓶发挥最大价值,我们不妨先和老板赊1瓶水,喝完后就有1个空瓶,加上之前剩下的3个空瓶,即可再换1瓶水还给老板,因此最多可以换到喝瓶水,所以最多喝了20瓶水。
现在有n瓶水,每 m(m <n)个空瓶能换 1瓶水,那么最多能喝多少瓶水?

#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>  

// 函数声明  
int maxBottles(int initialBottles, int emptyBottlesForOneNew);

int main() {
    int n, m;

    // 输入初始瓶数和换瓶规则  
    printf("请输入初始瓶数n: ");
    scanf("%d", &n);
    printf("请输入每m个空瓶能换1瓶水: ");
    scanf("%d", &m);

    // 计算最多能喝多少瓶水  
    int result = maxBottles(n, m);

    // 输出结果  
    printf("最多能喝 %d 瓶水\n", result);

    return 0;
}

// 计算最多能喝多少瓶水的函数  
int maxBottles(int initialBottles, int emptyBottlesForOneNew) {
    int totalBottlesDrunk = initialBottles; // 初始喝掉的瓶数  
    int emptyBottles = initialBottles; // 初始空瓶数  

    // 当空瓶数足够换一瓶新水时,继续换水并喝掉  
    while (emptyBottles >= emptyBottlesForOneNew) {
        int newBottles = emptyBottles / emptyBottlesForOneNew; // 能换的新瓶数  
        totalBottlesDrunk += newBottles; // 增加喝掉的瓶数  
        emptyBottles = emptyBottles % emptyBottlesForOneNew + newBottles; // 更新空瓶数(包括新喝掉后产生的空瓶)  

        // 如果空瓶数正好差一个能再换一瓶,可以赊一瓶来喝,最后还回去  
        if (emptyBottles == emptyBottlesForOneNew - 1) {
            totalBottlesDrunk += 1;
            emptyBottles = 1; // 喝完赊来的水后,剩下一个空瓶  
        }
    }

    return totalBottlesDrunk;
}
  1. 有0、1、2、3、4共5个数字 能组成多少个互不相同且无重复数字的3位数?并输出这些数(要求:5个数字一行)?并求出总个数?

  2. 100-999 全部的水仙花数?(如:153=1x1x1+5x5x5+3x3x3)?

#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
int main() {
	int i, g, s, b;
	for (i = 100; i <= 999; i++)
	{
		g = i % 10;     //取出个位
		s = i / 10 % 10;//取出十位
		b = i / 100;    //取出百位
		if (i == g * g * g + s * s * s + b * b * b)
		{
			printf("%d 是水仙花数\n", i);
		}

	}
	return 0;
}
  1. 由用户输入一个字符串(只能包含数字和字母),将字符串中的数字提取出来,如输入:agh1234jh5b67,输出1234567
#define _CRT_SECURE_NO_WARNINGS 1  
//if 第一个if判断    数字和字母   第二个if判断,只接收数字,
// str1 str2
//通过循环来遍历数组,然后依次赋值
#include <stdio.h>
#include <string.h>
int main()
{
	int j, k = 0;
	char str1[100], str2[100];
	printf("请输入字符串(只能包含数字和字母)\n");
	gets(str1);
	int len = strlen(str1);
	for (j = 0; j < len; j++)
	{
		if (str1[j] >= '0' && str1[j] <= '9' || str1[j] >= 'A' && str1[j] <= 'Z' || str1[j] >= 'a' && str1[j] <= 'z')
		{
			if (str1[j] >= '0' && str1[j] <= '9')
			{
				str2[k] = str1[j];
				k++;
			}
		}
		else
		{
			printf("请重新输入\n");
			return 1;
		}
	}
	str2[k] = '\0';
	puts(str2);

	return 0;
}

  1. 输入处理
    • 程序首先提示用户输入一个字符串,该字符串应只包含数字和字母。
    • 使用 gets 函数读取用户输入的字符串,并存储在 str1 中。
  2. 遍历字符串
    • 使用一个 for 循环遍历 str1 中的每个字符。
    • 在循环内部,首先检查当前字符是否是数字、大写字母或小写字母。这是通过一系列的条件判断来实现的。
  3. 数字提取
    • 如果当前字符是数字(在第一个 if 语句内部再次检查),则将该数字字符添加到 str2 中。
    • 使用变量 k 来跟踪 str2 中的当前位置,以便正确放置数字字符。
  4. 输入验证
    • 如果在遍历过程中遇到非数字或非字母字符,程序将打印错误消息并退出循环。
  5. 字符串结束符
    • 在循环结束后,向 str2 的末尾添加字符串结束符 '\0'
  6. 输出结果
    • 打印提取出的数字字符串 str2

指针解法:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	char str[100] = { '\0' }, num[100] = { '\0' };
	char* p = str;
	int i = 0, j;
	gets(str);
	while (*p) {
		if (*p >= '0' && *p <= '9')
		{
			num[i] = *p;
			i++;
		}
		p++;
	}
	num[i] = '\0';
	puts(num);
	printf("\n");
	return 0;
}
  1. 今天是今年的多少天
#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>  

// 判断是否为闰年(返回1表示是闰年,返回0表示不是闰年)  
// 这个函数相当于判断是否是闰年的逻辑值
int isLeapYear(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        return 1;
    }
    return 0;
}

// 获取每个月的天数(考虑闰年,返回该月的天数为29天,如果是平年,则返回数组的28天)  
int getDaysInMonth(int year, int month) {
    int daysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2 && isLeapYear(year)) {
        return 29;
    }
    return daysInMonth[month - 1]; //因为输入的月份和数组下标不匹配,所以这里-1
}

int main() {
    int year, month, day;
    int dayOfYear = 0;

    // 获取用户输入的日期  
    printf("请输入日期(年 月 日):");
    scanf("%d %d %d", &year, &month, &day);

    // 验证输入的月份和日期是否合法(通过条件判断处理)  
    if (month < 1 || month > 12) {
        printf("输入的月份不合法!\n");
        return 1; // 返回非0值表示程序异常结束  
    }
    if (day < 1 || day > getDaysInMonth(year, month)) { //和数组中预存的日期数比较,比它大则出错
        printf("输入的日期不合法!\n");
        return 1; // 返回非0值表示程序异常结束  
    }

    // 计算从年初到输入日期之前的天数  
    for (int i = 1; i < month; i++) { //因为计算的月份是当月的前几个月的相加,所以这里是i<month
        dayOfYear += getDaysInMonth(year, i); //把年和月份传递给函数,进行判断
    }
    dayOfYear += day;

    // 输出结果  
    printf("今天是今年的第 %d 天。\n", dayOfYear);

    return 0; // 返回0表示程序正常结束  
}

第二个版本(不装的版本)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	int year, months, days;
	int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	int i, sum = 0;
	while (1)//做个死循环,不达成条件就重新输入
	{
		scanf("%d %d %d", &year, &months, &days);
		if ((year > 0) && (months > 0 && months < 13) && (days > 0 && days <= 31))
		{
			if ((months == 2 || months == 4 || months == 6 || months == 9 || months == 11) && (days != 31) || (months > 0))
			{
				break;
			}
		}
		printf("重新输\n");
	}
	for (i = 0; i < months - 1; i++) //把前几个月份的日子都叠加上,留下本月的天数
	{
		sum += a[i];
	}
	sum += days;//累加上这个月的天数
	if (months > 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) //如果是闰年,那么再加一天,不是则直接打印
		sum += 1;
	printf("%d", sum);
	return 0;
}

已老实版本:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() //判断今天是第几天?
{
    int year, month, day, i, sum = 0, leapYearBool = 0;
    int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    scanf("%d %d %d", &year, &month, &day);
    for (i = 0; i < month - 1; i++)
        sum += a[i];
    sum += day;
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
        leapYearBool = 1;
    if (leapYearBool && month > 2)
        sum ++;
    printf("%d\n", sum);
    
    return 0;
}
  1. 用户输入三个数字,从大到小排序
#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
int main() {
	int a, b, c, temp;
	scanf("%d %d %d", &a, &b, &c);
	if (a < b)
	{
		temp = b;
		b = a;
		a = temp;
	}
	if (a < c)
	{
		temp = c;
		c = a;
		a = temp;
	}
	if (b < c)
	{
		temp = c;
		c = b;
		b = temp;
	}
	printf("%d %d %d\n", a, b, c);

	return 0;
}
  1. 输入一行字符串,分别统计其中英文字母、空格、数字和其他字符
//输入一行字符串,分别统计其中英文字母、空格、数字和其他字符
#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
#include <string.h>
int main() {
	char s[100];
	int i, letter = 0, space = 0, num = 0, another = 0;
	gets(s);
	int len = strlen(s);
	for (i = 0; i < len; i++)
	{
		if (s[i] >= 'A' && s[i] <= 'Z' || s[i] >= 'a' && s[i] <= 'z')
		{
			letter++;
		}
		else if (s[i] == ' ')
		{
			space++;
		}
		else if (s[i] >= '1' && s[i] <= '9')
		{
			num++;
		}
		else {
			another++;
		}
	}
	printf("您输入的字符串:\n英文字母有 %d 个 \n空格有 %d 个 \n数字有 %d 个 \n其他字符有 %d \n", letter, space, num, another);
	return 0;
}

注意事项:

strlen()函数,需要引用头文件"string.h",用len变量来控制循环次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值