int compare(char* dest,char* src)

09年华赛在成都的两道试题。

 

C语言实现:

[1]

给出一个函数,原型为 int compare(char* dest,char* src)
要求比较两个字符串(由dest与src字符指针标识)
1,如果两字符串所含字母完全相同,则逆序输出字符串 并返回0;
2,如果两字符串所含字母相同(不区分大小写;A与a也算字母相同) ,则返回1 ;
3,否则返回3 。

[2]
文件data.in中保存有m (m < 2000) 个数据行,每行最多包含25个由空格分隔的正整数。给出整数k(k <26),计算文件中第k列所有数据的最大值、最小值和平均值。最大值和最小值以整数格式输出,平均值保持两位小数。若某行的列数小于k,则认为该行第k列的值为0。 

 

问题来源:http://topic.youkuaiyun.com/u/20090220/17/afc59963-c997-4215-8a68-428acbc8c752.html

 

第一题我的解法如下:

 

上述逆序输出字符串改用栈的方法如下:

 

与我想法基本一样的一位朋友(riceli)的代码,看起来更规范点儿:

 

若使用库函数的方法:

 

等价于:

 

上面的库函数由自己实现:

 

使用标准库string类型比较字符串:

 


 第二题待续...

 

 

/* Copyright(c) 2009-2025 Shenzhen TP-LINK Technologies Co. Ltd. * Author: ChenZhuo chenzhuo1@tp-link.com.hk * Date: 2025-07-30 15:48:14 * LastEditors: ChenZhuo chenzhuo1@tp-link.com.hk * LastEditTime: 2025-07-31 18:11:06 * FilePath: /project/practice1/bulk_mem_cpy.c * Description: 提高memcpy效率,编写新的内存函数 */ #include <stdio.h> #include <string.h> #include <time.h> /**************************************************************************************************/ /* DEFINES */ /**************************************************************************************************/ /* 定义字符数组最大长度 */ #define MAXLEN 5000000 /**************************************************************************************************/ /* LOCAL_PROTOTYPES */ /**************************************************************************************************/ /* 自编块拷贝函数 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len); /**************************************************************************************************/ /* LOCAL_FUNCTIONS */ /**************************************************************************************************/ char random_char() { int random_value = rand() % 62; // 62是字母和数字的总数 if (random_value < 26) { return 'A' + random_value; // 生成大写字母 } else if (random_value < 52) { return 'a' + (random_value - 26); // 生成小写字母 } else { return '0' + (random_value - 52); // 生成数字 } } int min(int a, int b) { return (a < b) ? a : b; } /* * fn buk_mem_cpy(unsigned char *to, unsigned char *from, int len) * brief 使用8字节拷贝代替memcpy单字节拷贝提升效率,并解决内存重叠问题。 * param[in] to 目标区域首地址 * param[in] from 源区域地址 * param[in] len 拷贝字节长度 */ static int bulk_mem_cpy(unsigned char *to, unsigned char *from, int len) { /* 参数输入错误进行提醒 */ if (to == NULL || from == NULL || len <= 0) { printf("参数无效\n"); return -1; } /* 记录拷贝终止点 */ unsigned char *to_end = to + len - 1; unsigned char *from_end = from + len - 1; /* 使用8字节进行拷贝,对地址进行转换 */ unsigned long long *to_ll = (unsigned long long *)to; unsigned long long *to_end_ll = (unsigned long long *)to_end; unsigned long long *from_ll = (unsigned long long *)from; unsigned long long *from_end_ll = (unsigned long long *)from_end; /* 计算8字节拷贝次数和剩余单字节数 */ int count = len / sizeof(unsigned long long); int remain = len % sizeof(unsigned long long); /* 目标区域与源区域存在内存重叠,且目标首地址在源拷贝区域内,从后往前进行拷贝 */ if (to > from && to < from + len) { /* 8字节拷贝 */ while (count--) { *to_end_ll-- = *from_end_ll--; } /* 转为单字节拷贝 */ unsigned char *to_pos_c = (unsigned char *)to_end_ll; unsigned char *from_pos_c = (unsigned char *)from_end_ll; while (remain--) { *to_pos_c-- = *from_pos_c--; } } /* 目标区域与源区域存在内存重叠,而源区域首地址在目标拷贝区域内,从前往后进行正常拷贝 */ else { /* 8字节拷贝 */ while (count--) { *to_ll++ = *from_ll++; } /* 转为单字节拷贝 */ unsigned char *to_pos = (unsigned char *)to_ll; unsigned char *from_pos = (unsigned char *)from_ll; while (remain--) { *to_pos++ = *from_pos++; } } return 0; } int main() { int begintime, endtime; int test_begintime, test_endtime; char test_str_memcpy[MAXLEN]; char test_str_bulcpy[MAXLEN]; unsigned int src; unsigned int dst; unsigned int len; unsigned int test_time = 10; while (test_time--) { /* 随机生成字符串 */ for (int i = 0; i < MAXLEN; i++) { char c = random_char(); test_str_memcpy[i] = c; test_str_bulcpy[i] = c; } /* 随机选择源位置和目的位置 */ src = rand() % MAXLEN; dst = rand() % MAXLEN; /* 随机选择拷贝的长度 */ len = rand() % min(MAXLEN - src, MAXLEN - dst); /* 拷贝测试,如有必要可记录时间 */ test_begintime = clock(); bulk_mem_cpy(test_str_bulcpy + dst, test_str_bulcpy + src, len); test_endtime = clock(); printf("\n bulk_mem_cpy running Time is : %dms\n", test_endtime - test_begintime); begintime = clock(); memcpy(test_str_memcpy + dst, test_str_memcpy + src, len); endtime = clock(); printf("\n memecpy running Time is : %dms\n", endtime - begintime); /* 检验结果 */ if (memcmp(test_str_memcpy, test_str_bulcpy, 100) == 0) { /* success */ printf("自编函数正确"); } else { /* fail */ printf("自编函数失败"); } } return 0; }
08-07
#include #include #include #include #include #include // 动态数组结构 typedef struct { void *data; // 数据指针 size_t size; // 元素数量 size_t capacity; // 当前容量 size_t elemSize; // 元素大小 } DynamicArray; // 初始化动态数组 void initArray(DynamicArray *arr, size_t elemSize) { arr->data = NULL; arr->size = 0; arr->capacity = 0; arr->elemSize = elemSize; } // 添加元素到动态数组 void pushBack(DynamicArray *arr, void *element) { if (arr->size >= arr->capacity) { size_t newCapacity = (arr->capacity == 0) ? 4 : arr->capacity * 2; void *newData = realloc(arr->data, newCapacity * arr->elemSize); if (!newData) { fprintf(stderr, "内存分配失败\n"); exit(EXIT_FAILURE); } arr->data = newData; arr->capacity = newCapacity; } // 添加新元素 void *dest = (char*)arr->data + arr->size * arr->elemSize; memcpy(dest, element, arr->elemSize); arr->size++; } // 释放动态数组内存 void freeArray(DynamicArray *arr) { free(arr->data); arr->data = NULL; arr->size = arr->capacity = 0; } // 冒泡排序实现 void bubbleSort(DynamicArray arr, int (compare)(const void, const void)) { if (arr->size <= 1) return; for (size_t i = 0; i < arr->size - 1; i++) { bool swapped = false; for (size_t j = 0; j < arr->size - i - 1; j++) { void *elem1 = (char*)arr->data + j * arr->elemSize; void *elem2 = (char*)arr->data + (j + 1) * arr->elemSize; if (compare(elem1, elem2) > 0) { // 交换元素 char temp[arr->elemSize]; memcpy(temp, elem1, arr->elemSize); memcpy(elem1, elem2, arr->elemSize); memcpy(elem2, temp, arr->elemSize); swapped = true; } } // 如果没有交换发生,提前结束 if (!swapped) break; } } // 比较函数:整型 int intCompare(const void a, const void b) { return ((int)a - (int)b); } // 比较函数:浮点型 int floatCompare(const void *a, const void *b) { float diff = (float)a - (float)b; if (diff > 0.0001) return 1; // 考虑浮点精度 if (diff < -0.0001) return -1; return 0; } // 比较函数:字符型 int charCompare(const void a, const void b) { return ((char)a - (char)b); } // 打印数组 void printArray(DynamicArray *arr, void (printFunc)(void)) { printf(“[”); for (size_t i = 0; i < arr->size; i++) { void elem = (char)arr->data + i * arr->elemSize; printFunc(elem); if (i < arr->size - 1) printf(“, “); } printf(”]\n”); } // 打印整型元素 void printInt(void *elem) { printf(“%d”, (int)elem); } // 打印浮点型元素 void printFloat(void *elem) { printf(“%.2f”, (float)elem); } // 打印字符型元素 void printChar(void *elem) { printf(“‘%c’”, (char)elem); } // 解析用户输入行 void parseInputLine(DynamicArray *arr, const char input, void (parseFunc)(DynamicArray, const char)) { parseFunc(arr, input); } // 解析整型输入 void parseInt(DynamicArray *arr, const char *input) { char *token; char *copy = strdup(input); // 创建可修改的副本 char *ptr = copy; while (*ptr) { // 跳过非数字字符 while (*ptr && !isdigit(*ptr) && *ptr != '-') ptr++; if (!*ptr) break; // 尝试解析数字 char *end; int value = strtol(ptr, &end, 10); if (end != ptr) { // 成功解析 pushBack(arr, &value); ptr = end; } else { ptr++; } } free(copy); } // 解析浮点型输入 void parseFloat(DynamicArray *arr, const char *input) { char *token; char *copy = strdup(input); char *ptr = copy; while (*ptr) { // 跳过非数字字符 while (*ptr && !isdigit(*ptr) && *ptr != '-' && *ptr != '.') ptr++; if (!*ptr) break; // 尝试解析浮点数 char *end; float value = strtof(ptr, &end); if (end != ptr) { // 成功解析 pushBack(arr, &value); ptr = end; } else { ptr++; } } free(copy); } // 解析字符型输入 void parseChar(DynamicArray *arr, const char *input) { for (const char *p = input; *p != ‘\0’; p++) { if (!isspace(*p)) { char value = *p; pushBack(arr, &value); } } } // 随机生成数组 void generateRandomArray(DynamicArray *arr, int dataType, int size) { srand(time(NULL)); for (int i = 0; i < size; i++) { if (dataType == 1) { // 整型 int value = rand() % 100; // 0-99的随机数 pushBack(arr, &value); } else if (dataType == 2) { // 浮点型 float value = (rand() % 1000) / 10.0f; // 0.0-99.9的随机浮点数 pushBack(arr, &value); } else if (dataType == 3) { // 字符型 char value = 'A' + rand() % 26; // A-Z的随机字符 pushBack(arr, &value); } } } #include #include #include #include #include #include // 二分法查找函数 bool binarySearch(DynamicArray *arr, void target, int (compare)(const void, const void)) { size_t left = 0; size_t right = arr->size - 1; while (left <= right) { size_t mid = (left + right) / 2; void *midElem = (char*)arr->data + mid * arr->elemSize; int cmp = compare(midElem, target); if (cmp == 0) { return true; // 找到了目标 } else if (cmp < 0) { left = mid + 1; // 向右半部分搜索 } else { right = mid - 1; // 向左半部分搜索 } } return false; // 没有找到目标 } // 主程序入口 int main() { int choice; char buffer[256]; while (1) { printf("\n===== 二分法查找程序 =====\n"); printf("1. 整型查找\n"); printf("2. 浮点型查找\n"); printf("3. 字符型查找\n"); printf("4. 退出程序\n"); printf("请选择操作: "); if (fgets(buffer, sizeof(buffer), stdin) == NULL) break; if (sscanf(buffer, "%d", &choice) != 1) continue; if (choice == 4) break; // 初始化动态数组 DynamicArray arr; void (*printFunc)(void*) = NULL; int (*compareFunc)(const void*, const void*) = NULL; void (*parseFunc)(DynamicArray*, const char*) = NULL; switch (choice) { case 1: // 整型 initArray(&arr, sizeof(int)); printFunc = printInt; compareFunc = intCompare; parseFunc = parseInt; break; case 2: // 浮点型 initArray(&arr, sizeof(float)); printFunc = printFloat; compareFunc = floatCompare; parseFunc = parseFloat; break; case 3: // 字符型 initArray(&arr, sizeof(char)); printFunc = printChar; compareFunc = charCompare; parseFunc = parseChar; break; default: printf("无效选择!\n"); continue; } // 从用户获取数组输入 printf("输入数组元素(空格或逗号分隔): "); if (fgets(buffer, sizeof(buffer), stdin)) { buffer[strcspn(buffer, "\n")] = '\0'; // 移除换行符 parseInputLine(&arr, buffer, parseFunc); } // 对数组进行排序,确保有序 bubbleSort(&arr, compareFunc); // 打印排序后的数组 printf("\n排序后的数组: "); printArray(&arr, printFunc); // 查找目标值 printf("\n输入查找的目标值: "); fgets(buffer, sizeof(buffer), stdin); bool found = false; if (choice == 1) { // 整型查找 int target; sscanf(buffer, "%d", &target); found = binarySearch(&arr, &target, compareFunc); } else if (choice == 2) { // 浮点型查找 float target; sscanf(buffer, "%f", &target); found = binarySearch(&arr, &target, compareFunc); } else if (choice == 3) { // 字符型查找 char target; target = buffer[0]; // 读取首字符 found = binarySearch(&arr, &target, compareFunc); } // 输出查找结果 if (found) { printf("\n查找结果: 找到目标值!\n"); } else { printf("\n查找结果: 未找到目标值!\n"); } // 清理资源 freeArray(&arr); // 询问是否继续 printf("\n继续查找? (y/n): "); if (fgets(buffer, sizeof(buffer), stdin) && (buffer[0] == 'n' || buffer[0] == 'N')) { break; } } return 0; } 修改代码规范,注释不能出现英文,不能有//注释
09-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值