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

c语言编程题(函数)

1编写函数将一个仅包含整数(可能为负)的字符串转换为对应的整数

方法一使用标准库函数 atoi

atoi 函数是C语言标准库中的一个函数,用于将字符串转换为整数。

代码:


#include <stdio.h>
#include <stdlib.h> // 包含 atoi 函数的头文件

int main() {
	const char* str = "12345"; // 示例字符串
	int num = atoi(str); // 使用 atoi 将字符串转换为整数
	printf("转换后的整数: %d\n", num);
	return 0;
}
方法2:手动实现字符串到整数的转换
#include <stdio.h>
#include <ctype.h> // 包含 isdigit 函数的头文件

int strToInt(const char *str) {
    int result = 0;
    int sign = 1; // 默认符号为正
    int i = 0;

    // 处理负号
    if (str[i] == '-') {
        sign = -1;
        i++;
    }

    // 遍历字符串中的每个字符
    while (str[i] != '\0') {
        // 确保字符是数字
        if (isdigit(str[i])) {
            // 计算当前位的值
            result = result * 10 + (str[i] - '0');
        } else {
            // 如果遇到非数字字符,返回错误值(例如0)
            return 0;
        }
        i++;
    }

    // 返回带符号的结果
    return sign * result;
}

int main() {
    const char *str = "-12345"; // 示例字符串
    int num = strToInt(str); // 调用手动实现的函数
    printf("转换后的整数: %d\n", num);
    return 0;
}

2编写一个能比较字符串大小的函数,将两个字符串中第一个不相同字符的ASCII码值之差作为返回值

代码:

#include <stdio.h>

// 比较两个字符串大小,返回第一个不相同字符的ASCII码值之差
int compareStrings(const char *str1, const char *str2) {
    int i = 0;

    // 遍历两个字符串,直到其中一个字符串结束或找到不相同的字符
    while (str1[i] != '\0' && str2[i] != '\0') {
        if (str1[i] != str2[i]) {
            // 找到不相同的字符,返回它们的ASCII码值之差
            return str1[i] - str2[i];
        }
        i++;
    }

    // 如果两个字符串长度不同,返回长度差
    return str1[i] - str2[i];
}

int main() {
    const char *str1 = "apple";
    const char *str2 = "apples";

    int result = compareStrings(str1, str2);

    if (result == 0) {
        printf("两个字符串相等。\n");
    } else if (result > 0) {
        printf("第一个字符串大于第二个字符串,差值为: %d\n", result);
    } else {
        printf("第一个字符串小于第二个字符串,差值为: %d\n", result);
    }

    return 0;
}

3编写程序,从键盘输入10个整数,用函数实现将其中最大数与最小数的位置对 换,输出调整后的数组

代码:

#include <stdio.h>

// 函数声明
void swapMaxMin(int arr[], int size);

int main() {
    int arr[10];

    // 从键盘输入10个整数
    printf("请输入10个整数:\n");
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
    }

    // 调用函数交换最大数与最小数的位置
    swapMaxMin(arr, 10);

    // 输出调整后的数组
    printf("调整后的数组:\n");
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

// 函数定义:交换数组中最大数与最小数的位置
void swapMaxMin(int arr[], int size) {
    int maxIndex = 0, minIndex = 0;

    // 找到最大数和最小数的索引
    for (int i = 1; i < size; i++) {
        if (arr[i] > arr[maxIndex]) {
            maxIndex = i;
        }
        if (arr[i] < arr[minIndex]) {
            minIndex = i;
        }
    }

    // 交换最大数与最小数的位置
    int temp = arr[maxIndex];
    arr[maxIndex] = arr[minIndex];
    arr[minIndex] = temp;
}

4编写函数,对给定的二维数组(3×3)进行转置(即行列互换)

代码:

#include <stdio.h>

// 函数声明
void transpose(int arr[3][3]);
void printArray(int arr[3][3]);

int main() {
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 打印原始数组
    printf("原始数组:\n");
    printArray(arr);

    // 进行转置
    transpose(arr);

    // 打印转置后的数组
    printf("转置后的数组:\n");
    printArray(arr);

    return 0;
}

// 函数定义:对二维数组进行转置
void transpose(int arr[3][3]) {
    int temp;
    for (int i = 0; i < 3; i++) {
        for (int j = i + 1; j < 3; j++) {
            // 交换 arr[i][j] 和 arr[j][i]
            temp = arr[i][j];
            arr[i][j] = arr[j][i];
            arr[j][i] = temp;
        }
    }
}

// 函数定义:打印二维数组
void printArray(int arr[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

注意事项:

在二维数组转置的过程中,for (int j = i + 1; j < 3; j++) 中的 j 从 i + 1 开始是为了避免重复交换和对角线元素的交换。让我们详细解释一下:

解释

  1. 避免重复交换

    • 在转置过程中,交换 arr[i][j] 和 arr[j][i] 时,只需要交换一次即可。
    • 如果 j 从 0 开始遍历,会导致重复交换,因为 arr[i][j] 和 arr[j][i] 已经在之前的迭代中被交换过了。
    • 例如,如果 i = 0 且 j = 0,那么交换 arr[0][0] 和 arr[0][0] 是无意义的,因为它们是同一个元素。
  2. 对角线元素无需交换

    • 对角线元素(如 arr[0][0]arr[1][1]arr[2][2])在转置前后保持不变。
    • 如果 j 从 0 开始遍历,会导致对角线元素被交换,这实际上是没有必要的。

5编写函数,用冒泡法对输入的字符(不超过10个)按从小到大顺序排序

代码:

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

// 函数声明
void bubbleSort(char arr[], int n);
void swap(char *a, char *b);

int main() {
    char arr[11]; // 最多10个字符,加上字符串结束符 '\0'

    // 输入字符
    printf("请输入不超过10个字符:\n");
    scanf("%s", arr);

    // 获取字符串长度
    int n = strlen(arr);

    // 进行排序
    bubbleSort(arr, n);

    // 打印排序后的字符串
    printf("排序后的字符串:\n");
    printf("%s\n", arr);

    return 0;
}

// 函数定义:冒泡排序
void bubbleSort(char arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 如果前一个字符大于后一个字符,交换它们
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

// 函数定义:交换两个字符
void swap(char *a, char *b) {
    char temp = *a;
    *a = *b;
    *b = temp;
}

6编写程序,输出3~10000为的可逆质数。可逆质数是指:一个质数将其各位数 字的顺序倒过来构成的反序数也是质数。如157和751均为质数,它们是可逆质数。要 求调用两个函数实现

代码:

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

// 函数声明
bool isPrime(int num);
int reverseNumber(int num);

int main() {
	printf("3到10000之间的可逆质数有:\n");
	for (int num = 3; num <= 10000; num++) {
		if (isPrime(num)) {
			int reversedNum = reverseNumber(num);
			if (isPrime(reversedNum)) {
				printf("%d\n", num);
			}
		}
	}
	return 0;
}

// 函数定义:检查一个数是否为质数
bool isPrime(int num) {
	if (num <= 1) return false;
	for (int i = 2; i <= num / 2; i++) {
		if (num % i == 0) return false;
	}
	return true;
}

// 函数定义:生成一个数的反序数
int reverseNumber(int num) {
	int reversedNum = 0;
	while (num > 0) {
		reversedNum = reversedNum * 10 + num % 10;
		num /= 10;
	}
	return reversedNum;
}

7编写函数,将一个十进制数转换成八进制数

代码:

#include <stdio.h>

// 函数声明:将十进制数转换为八进制数
void decimalToOctal(int num);

int main() {
    int num;
    printf("请输入一个十进制数:\n");
    scanf("%d", &num);
    printf("转换后的八进制数为:");
    decimalToOctal(num);  // 调用转换函数
    return 0;
}

// 函数定义:将十进制数转换为八进制数
void decimalToOctal(int num) {
    // 如果输入的数为0,直接输出0
    if (num == 0) {
        printf("0");
        return;
    }

    int arr[100];  // 用于存储八进制数的数组
    int i = 0;     // 数组索引

    // 将十进制数转换为八进制数
    while (num > 0) {
        arr[i] = num % 8;  // 取余数,存储到数组中
        num = num / 8;     // 整除8,去掉最后一位
        i++;               // 索引加1
    }

    // 输出八进制数(从高位到低位)
    for (int j = i - 1; j >= 0; j--) {
        printf("%d", arr[j]);
    }
    printf("\n");  // 输出换行符
}

8从键盘输入一个正整数,逆序输出。要求使用循环和递归两种方法分别实现

代码:

#include<stdio.h>
int main() {
	int num;
	printf("请输入一个正整数:\n");
	scanf("%d", &num);
	printf("逆序输出(循环方法):");
	 
	while (num>0)
	{
		printf("%d", num % 10);
		num /= 10;
	}

	return 0;
}

代码:


#include <stdio.h>

// 函数声明:使用递归逆序输出正整数
void reverse(int num);

int main() {
	int num;
	printf("请输入一个正整数:\n");
	scanf("%d", &num);

	// 使用递归逆序输出
	printf("逆序输出(递归方法):");
	reverse(num);
	printf("\n");

	return 0;
}

// 函数定义:使用递归逆序输出正整数
void reverse(int num) {
	if (num == 0) {
		return;  // 递归终止条件
	}
	printf("%d", num % 10);  // 输出最后一位数字
	reverse(num / 10);  // 递归调用,去掉最后一位数字
}


http://www.kler.cn/a/389687.html

相关文章:

  • 5G时代的关键元件:射频微波MLCCs市场前景广阔
  • 字节、快手、Vidu“打野”升级,AI视频小步快跑
  • 【p2p、分布式,区块链笔记 DAM】GUN/SEA(Security, Encryption, Authorization) 模块genkey
  • 使用 Sparkle 实现 macOS 应用自定义更新弹窗
  • 《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信
  • 基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面
  • 如何在MT4中实现神经网络EA?
  • AI与隐私:Facebook如何在数据保护中平衡创新与安全
  • stm32对EV1527波形进行解码
  • 贪心算法-汽车加油
  • oneplus6总结记录-Lineage19.1-android12
  • 密码学的基本原理
  • [ARM-2D 专题]6.脏矩形定义的宏使用技巧和分析
  • node.js电子发票(铁路电子客票)查验接口,让您的企业报销流程更顺畅
  • Java List——针对实习面试
  • 【Java多线程】线程安全及解决方案(详解)
  • monkey-安卓稳定性测试
  • Web3 游戏周报(11.03 - 11.09)
  • springboot苍穹外卖实战:十一:复盘总结
  • 除草机器人算法以及技术详解!
  • Debezium日常分享系列之:异步 Debezium 嵌入式引擎
  • 【计算机图形学】3DIT的训练数据总结
  • 问:说说Spring中构造函数注入和Setter注入的区别?
  • Maven 中央仓库地址 mvnrepository.com
  • Maven从浅入深(理解篇)
  • K8S之Prometheus 部署(二十)