C语言基础:函数练习题
问题:计算两点之间的距离
#include <stdio.h>
#include <math.h>double ptp(double x1, double y1, double x2, double y2)
{return sqrt(pow (x2 - x1, 2) + pow (y2 - y1, 2));
}int main()
{double x1, y1, x2, y2;printf("输入第一个点的坐标 (x1 y1): ");scanf("%lf %lf", &x1, &y1);printf("输入第二个点的坐标 (x2 y2): ");scanf("%lf %lf", &x2, &y2);printf("距离: %.2lf\n", ptp(x1, y1, x2, y2));return 0;
}
在使用这两个函数前,请先保证添加引用头文件:
#include<math.h>
计算平方根函数:sqrt
写法:
double sqrt(double x);
注意:sqrt 的返回值和参数 x 都为 "double" 类型。
用处:计算并返回参数
x
的非负平方根。对于负数:在大多数C实现中,
sqrt
函数将返回NaN 。对于不同的编译器可能会有不同的结果。
幂运算函数:pow
写法:
double pow(double a, double b);
功能:计算并返回 a 的 b 次幂。
注意:a 不能为 0 ;当 b 是0时,无论 a 的值是多少(除了0),pow 函数都返回1.0。
问题:计算输入数字中各个位数的数字平方和
#include <stdio.h>
#include <math.h>int ss(int num);int main()
{int num;printf("输入整数: ");scanf("%d", &num);printf("各位平方和: %d\n", ss(num));return 0;
}int ss(int num)
{int sum = 0;num = abs(num); // 处理负数,其中 abs( x )意思是求 x 的绝对值 while (num > 0) {sum += pow ((num % 10), 2);num /= 10;}return sum;
}
绝对值函数:abs
写法:
int a = abs(num);
- 注意:使用
abs
函数前,必须包含标准库头文件<stdlib.h>
。
#include <stdlib.h> // 包含abs函数所需的头文件
用法:在C语言中,
abs
函数用于计算整数的绝对值,即返回输入值的非负形式。绝对值在数学上表示为∣x∣,例如∣−5∣ = 5 。返回复数的模。printf(abs(1 + 2j));// 相当于根号下 1 的平方 + 2 的平方
注意:输入必须是 int 类型。
问题:设计一个函数,用来查找一个字符串中某个字符的位置
#include <stdio.h>int find(char str[], char c);int main()
{char str[50], c;printf("输入: ");scanf("%s", str);// 清除缓冲区 // while(getchar() != '\n');printf("输入要查找的: ");scanf(" %c", &c);int p = find(str, c);printf("位置是: %d\n", p + 1);return 0;
}int find(char str[], char c)
{for (int i = 0; str[i] != '\0'; i++) {if (str[i] == c){return i;}}return -1;// 无
}
清除缓冲区的方法:
1. while ((c = getchar()) != '\n' && c != EOF);(通常使用)
借助
getchar()
函数读取一个字符,然后把该字符赋值给变量c
。对读取到的字符
c
进行检查,看它是否既不是换行符\n
,也不是文件结束符EOF
。一旦条件成立,就会继续执行循环体。不过,此循环体为空(只有一个分号),这意味着程序会不断读取字符,却不做任何处理。
当读取到换行符
\n
或者文件结束符EOF
时,循环就会终止。
void clearBuffer();int main() {int num;char str[50];printf("Enter a number: ");scanf("%d", &num);clearBuffer(); // 清除缓冲区中剩余的字符(如换行符)printf("Enter a string: ");fgets(str, sizeof(str), stdin); // 安全读取字符串// ...
}void clearBuffer() {int c;while ((c = getchar()) != '\n' && c != EOF);
}
2. scanf("%*[^\n]"); && scanf("%*c");(不推荐)
scanf("%d", &num);
scanf("%*[^\n]"); // 丢弃所有非换行符
scanf("%*c"); // 丢弃换行符
3. 使用 fgets()
替代 scanf()
(推荐做法)
char input[100];
fgets(input, sizeof(input), stdin); // 读取整行内容,包括换行符
// 移除换行符(如果存在)
size_t len = strlen(input);
if (len > 0 && input[len-1] == '\n') {input[len-1] = '\0';
}
4.在 % 前添加一个空格:scanf(" %c", &c);
当
scanf
读取字符(%c
)时,不会自动跳过空白字符。例如:
scanf(" %c", &c); // 直接读取输入缓冲区的下一个字符,包括空格、换行符
如果用户在输入时按了回车键(产生换行符
\n
),这个换行符会留在输入缓冲区中。当下次调用scanf("%c", &c)
时,它会直接读取这个换行符,而不是等待用户输入新字符。在格式字符串中添加空格(
" %c"
)后,scanf
会先跳过所有空白字符,直到遇到一个非空白字符。例如,用户输入
123\n
后,程序执行多次scanf(" %c", &c)
会依次读取'1'
、'2'
、'3'
,而不会读取换行符'\n'
。
问题:设计一个函数,把一个整型数字转成对应的字符串格式
#include <stdio.h>void intToString(int num, char str[]);int main()
{int num;char str[20];printf("输入整数: ");scanf("%d", &num);intToString(num, str);printf("转换后的字符串: %s\n", str);return 0;
}void intToString(int num, char str[])
{// sprintf 的功能是将各种类型的数据格式化为字符串,并存储到一个字符数组中。sprintf(str, "%d", num); // int sprintf(char *str, const char *format, ...);char str[80];
}
格式化输出函数:sprintf
说明:
sprintf
是 C 语言标准库中的一个格式化输出函数,用于将格式化的数据写入字符串(而不是打印到屏幕)。它的原型定义在<stdio.h>
中,用法类似于printf
,但输出结果存储在字符数组中。写法:
int sprintf(char *str, const char *format, ...);
参数:
str
:目标字符串缓冲区,用于存储格式化后的结果。format
:格式化字符串,与printf
的格式相同(如"%d %s"
)。...
:可变参数,根据format
中的占位符提供对应的值。
// sprintf(str, "%c", 'A');// 输出字符 A
// sprintf(str, "%d", 123);// 输出十进制整数 123
// sprintf(str, "%x", 255);// 输出十六进制整数 ff
// sprintf(str, "%f", 3.14);// 输出浮点数 3.140000
// sprintf(str, "%s", "Hello");// 输出字符串 Hello
// sprintf(str, "%10d", 123);// 输出宽度为 10 的十进制整数,右对齐,空位用空格填充: 123
// sprintf(str, "%-10d", 123);// 输出宽度为 10 的十进制整数,左对齐,空位用空格填充:123
// sprintf(str, "%010d", 123);// 输出宽度为 10 的十进制整数,右对齐,空位用 0 填充:0000000123
// sprintf(str, "%+d", 123);// 输出带正负号的十进制整数:+123
// sprintf(str, "%.3d", 123);// 输出至少 3 位的十进制整数,不足则用 0 填充:123
// sprintf(str, "%.3d", 12);// 输出至少 3 位的十进制整数,不足则用 0 填充:012
// sprintf(str, "%.3f", 3.14);// 输出保留 3 位小数的浮点数:3.140
// sprintf(str, "%.3s", "Hello");// 输出最多 3 个字符的字符串:Hel
// sprintf(str, "%ld", 123456789L);// 输出长整型数:123456789
// sprintf(str, "%Lf", 3.1415926535897932383832795L);// 输出长双精度型数:3.141593