当前位置: 首页 > article >正文

Chapter09

9.3

#include<stdio.h>
#include<stdbool.h>

int HasRemainderDays(int year, int month, int day);
bool IsLeapYear(int year);
int main() {
	
	int year, month, day;

	printf("请输入年 月 日:");
	scanf_s("%d %d %d", &year, &month, &day);
	int remainderDays = HasRemainderDays(year, month, day);

	printf("%d 月份还有 %d 天!\n", month, remainderDays);


	return 0;
}

int HasRemainderDays(int year, int month, int day) {
	
	int remainder;
	int arr_days[12] = { 31, 28, 31, 30 , 31, 30, 31, 31 ,30, 31, 30, 31 };
	if (IsLeapYear(year)) {
		arr_days[1] = 29;
	}

	for (int i = 1; i <= 12; i++)
	{
		if (month == i) {
			remainder = arr_days[i - 1] - day;
		}
	}
	

	return remainder;

}

bool IsLeapYear(int year) {


	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {

		return true;
	}

	return false;
}

9.4 && 9.5

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
long stringToDecimal(const char* str, int base);
void convertToBaseR(int num, int r);

int main() {
	char hexStr[] = "1A3F";
	char octStr[] = "123";
	char binStr[] = "101010";
	printf("十六进制转换成十进制为: %ld\n", stringToDecimal(hexStr, 16));
	printf("八进制转换成十进制为: %ld\n", stringToDecimal(octStr, 8));
	printf("二进制转换成十进制为: %ld\n", stringToDecimal(binStr, 2));

	int num, r;
	printf("请输入十进制的整数: ");
	scanf_s("%d", &num);
	printf("请输入要转化的进制数: ");
	scanf_s("%d", &r);
	convertToBaseR(num, r);

	return 0;
}

/// <summary>
/// 将字符串str转为十进制
/// </summary>
/// <param name="str">字符串</param>
/// <param name="base">基数2, 8, 16等</param>
/// <returns></returns>
long stringToDecimal(const char* str, int base) {
	long result = 0;
	int multiplier = 1;
	int length = strlen(str);

	//从字符串末尾开始解析
	for (int  i = length - 1; i >= 0; i--)
	{
		char ch = tolower(str[i]);
		int digit = -1;

		//根据字符计算其对应的值
		if (ch >= '0' && ch <= '9') 
		{
			digit = ch - '0';//将字符串转换成对应的数字
		}
		else if(base == 16 && (ch >= 'a' && ch <= 'f'))
		{
			digit = ch - 'a' + 10;
		}
		else if(ch < '0' || (ch > '9' && base !=16) ||(base == 16) && ch > 'f')
		{
			//出错
			return 0;
		}

		//判断是否在有效范围内
		if (digit >= base) {
			return 0;
		}

		result += digit * multiplier;  //更新累加结果

		multiplier *= base;//更新下一次计算的基数
	}

}



/// <summary>
/// 将十进制数转换成任意的r进制数
/// </summary>
/// <param name="num">数字</param>
/// <param name="r">要转换的目标进制数</param>
void convertToBaseR(int num, int r) {
	int index = 0;
	char result[65];//假设转换后的数不超过64位

	//处理num = 0的情况
	if (num == 0) {
		printf("0\n");
		return;
	}

	while (num > 0)
	{
		int remainder = num % r;
		if (remainder < 10) {
			result[index++] = '0' + remainder;//余数小于10的,将其转换成0~9之间的字符
		}
		else
		{
			result[index++] = 'A' + (remainder - 10);//余数大于10的,将其转换成'A' ~ 'Z' 字符
		}

		num = num / r; //更新下一次参与计算的数字
	}

	result[index] = '\0'; //在字符串末尾添加结束符

	//因为结果是从低位到高位存储的,所以需要反向打印
	for (int i = index; i >= 0; i--)
	{
		printf("%c", result[i]);
	}
	printf("\n");
}

9.6

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

int main() {
    char *str;
    int length;

    // 获取用户输入的字符串长度
    printf("请输入字符串的长度: ");
    scanf_s("%d", &length);
    getchar(); // 消耗换行符

    // 动态申请内存空间
    str = (char *)malloc((length + 1) * sizeof(char)); // +1 用于存储字符串的结束符 '\0'
    if (str == NULL) {
        printf("内存分配失败!\n");
        return 1; // 返回错误码
    }

    // 获取用户输入的字符串
    printf("请输入一个长度为 %d 的字符串: ", length);
    fgets(str, length + 1, stdin); // 使用 fgets 而不是 scanf,以避免缓冲区溢出问题
    str[strcspn(str, "\n")] = 0;

    // 输出存储的字符串
    printf("输入的字符串是: %s\n", str);

    // 释放内存空间
    free(str);
    str = NULL; // 将指针设置为 NULL,避免出现野指针问题

    return 0; // 程序正常结束
}

9.7

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

int main() {
    FILE *file = fopen("numbers.txt", "r"); // 打开文件,假设文件名为numbers.txt
    if (file == NULL) {
        perror("打开文件失败");
        return 1;
    }

    int *array = malloc(sizeof(int) * 10); // 初始数组大小为10
    if (array == NULL) {
        perror("分配内存失败");
        fclose(file);
        return 1;
    }

    int size = 10; // 当前数组大小
    int count = 0; // 当前数组中元素的数量
    int number;

    // 读取文件中的每个整数,直到文件结束
    while (fscanf(file, "%d", &number) == 1) {
        // 如果数组已满,则扩充数组
        if (count == size) {
            size *= 2; // 以2倍的步长扩充数组
            int *temp = realloc(array, sizeof(int) * size);
            if (temp == NULL) {
                perror("扩充内存失败");
                free(array); // 释放原始数组内存
                fclose(file);
                return 1;
            }
            array = temp; // 更新数组指针
        }

        // 将读取的整数添加到数组中
        array[count++] = number;
    }

    // 关闭文件
    fclose(file);

    // 输出读取到的整数
    printf("读取 %d 个整数:\n", count);
    for (int i = 0; i < count; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    // 释放数组内存
    free(array);

    return 0;
}

http://www.kler.cn/news/355509.html

相关文章:

  • perl替换文件中的特定内容
  • 海南聚广众达电子商务咨询有限公司靠谱吗怎么样?
  • Uptime Kuma: 全面的开源网站监控解决方案
  • 青少年编程能力等级测评CPA C++(二级)试卷(2)
  • JavaScript的第三天
  • VSCode C/C++跳转到定义、自动补全、悬停提示突然失效
  • Rocky Linux 9安装Asterisk 20和freepbx 17脚本——筑梦之路
  • Rust各个方面完胜C++吗?
  • Threejs 实现3D 地图(01)创建基本场景
  • Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey阅读笔记
  • LeetCode1658.将x减到0的最小操作数
  • PHP爬虫API:获取商品详情的新利器
  • uniapp uni.uploadFile errMsg: “uploadFile:fail
  • PTA L1系列题解(C语言)(L1_073 -- L1_080)
  • php常用设计模式之单例模式
  • HikariPool连接池报错(Possibly consider using a shorter maxLifetime value)
  • 健康推荐新动力:SpringBoot智能系统
  • PostgreSQL与MySQL在语法上的区别
  • 【飞腾加固服务器】全国产化解决方案:飞腾FT2000+/64核,赋能关键任务保驾护航
  • 链动2+1芸众商城421+全插件独立版源码