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
开始是为了避免重复交换和对角线元素的交换。让我们详细解释一下:
解释
-
避免重复交换:
- 在转置过程中,交换
arr[i][j]
和arr[j][i]
时,只需要交换一次即可。 - 如果
j
从0
开始遍历,会导致重复交换,因为arr[i][j]
和arr[j][i]
已经在之前的迭代中被交换过了。 - 例如,如果
i = 0
且j = 0
,那么交换arr[0][0]
和arr[0][0]
是无意义的,因为它们是同一个元素。
- 在转置过程中,交换
-
对角线元素无需交换:
- 对角线元素(如
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); // 递归调用,去掉最后一位数字
}