两日做题记录
计算阶乘和:
(形参 实参❕)
#include <stdio.h>
double fact(int n);
int main()
{
int i, n;
int sum;
printf("");
scanf_s("%d", &n);
sum = 0;
for (i = 1; i <= n; i++)
{
sum = sum + fact(i);
}
printf("%d", sum);
return 0;
}
double fact(int n)
{
int i;
int result;
if (n < 0)
{
return 0;
}
result = 1;
for (i = 1; i <= n; i++)
{
result = result * i;
}
return result;
}
二分段函数(保留小数):
#include <stdio.h>
int main```()
{
double x, y;
printf("Enter x(x>=0):");
scanf("%lf", &x);
if (x <= 15)
{
y = 4 * x / 3;
}
else if(x > 15)
{
y = 2.5 * x - 10.5;
}
printf("y=%.2f\n",y);
return 0;
}
坚持的力量:
(在 C 语言中,表达式 result = initial * (1 + factor)^day 的计算需要注意的是,C 语言中并没有直接的幂运算符(如 ^)。相反,你应该使用 math.h 库中的 pow 函数来计算幂)
#include <stdio.h>
#include <math.h>
int main()
{
int day, initial;
double factor, result;
scanf("%d %lf %d", &initial, &factor, &day);
result = initial * pow((1 + factor), day);
printf("%.2lf\n", result);
return 0;
}
Hello world!:
(attention空格的输入)
#include <stdio.h>
int main()
{
char input;
scanf("%c",&input);
printf("Hello World!");
return 0;
}
求五边形面积:
(使用的变量名没影响 主要要一一对应)
#include <stdio.h>
#include <math.h>
int main()
{
double a1, a2, a3, a4, a5, a6, a7, s;
double area(double x, double y, double z);
scanf_s("%lf %lf %lf %lf %lf %lf %lf", &a1, &a2, &a3, &a4, &a5, &a6, &a7);
s = area(a1,a5,a6) + area(a2, a3, a7) + area(a4, a6, a7);
printf("%.2f\n", s);
return 0;
}
double area(double x, double y, double z)
{
double p = (x + y + z) / 2;
return sqrt(p * (p - x) * (p - y) * (p - z));
}
-
- 函数放在主函数外:函数放在主函数外是最常见的做法,可以在主函数之前或之后定义函数。
-
- 函数放在主函数内:在 C 语言中,函数不能真正地在主函数内部定义。只能在主函数内部定义函数指针或使用 lambda 表达式在 C++ 中,在 C 中,所有函数都必须在主函数外部定义。
主函数内声明
如果你在主函数内部声明一个函数,编译器只会在主函数的作用域内识别这个声明。通常情况下,这种做法不是最佳实践,因为函数通常被设计为可以被多个函数调用,放在主函数内会限制它的可见性。
主函数外声明
在主函数外部声明 area() 函数是更常见的做法,尤其是当你希望在多个函数之间共享这个函数时。这样,任何函数都可以在其定义之前调用 area() 函数。
可见性: 在主函数外部声明 area() 函数使得它在整个文件中可见,而不仅仅是在主函数内部。这是更好的做法,因为它允许其他函数调用 area(),提高了代码的重用性和模块化。
最佳实践: 将函数声明放在文件的顶部(在 main() 函数之前)是 C 语言的最佳实践。这使得代码更清晰,便于阅读和维护。
编译器要求: 如果你在主函数内部声明 area(),你可以在主函数内调用它,但如果你在其他函数中调用 area(),编译器将报错,因为它在这些函数内不可见。
华氏摄氏温度转换:
#include <stdio.h>
int main()
{
int fahr, lower, upper;
double celsius;
scanf_s("%d",&lower);
scanf_s("%d", &upper);
if (lower <= upper)
{
for (fahr = lower; fahr <= upper; fahr++)
{
celsius = (5.0 / 9) * (fahr - 32);
printf("%d %6.1f\n", fahr, celsius);
}
}
else
{
printf("Invalid Value!");
}
return 0;
}
6:这是字段宽度,表示输出的总宽度为6个字符。如果生成的数字(包括小数点和小数部分)少于6个字符,输出将会在左侧填充空格以满足宽度。如果数字的字符数超过6个,则会根据实际字符数输出,不会截断。
在编程中,给变量赋初值是一个重要的良好实践,尤其是在以下情况下:
-
未初始化变量的使用
未初始化的变量在使用时会包含随机值,这可能导致程序的不确定行为或错误结果。因此,始终应在使用变量之前给它们赋初值。 -
计数器和累加器
计数器(如 for 循环的索引)通常应初始化为 0 或 1。
累加器(如用于计算总和的变量)通常应初始化为 0,以便在开始累加时没有旧值的干扰。 -
条件判断
在条件判断中,初始化变量可以确保逻辑的正确性。例如,在使用 if 语句之前,确保变量的初始状态是明确的。 -
避免未定义行为
某些语言(如 C/C++)不自动初始化局部变量。如果在使用这些变量之前没有赋值,程序可能会出现未定义行为,导致错误或崩溃。 -
提高代码可读性
给变量赋初值可以帮助其他开发者(或自己在未来)更容易理解代码的意图。例如,看到一个变量被初始化为特定值,可以清楚地知道它在逻辑上的起始状态。 -
默认值
在某些情况下,给变量赋一个“默认值”是有意义的。例如,在计算之前,可能希望某个变量具有一个特定的起始值(如 -1 表示“未计算”或 NULL 表示“无值”)。 -
防止逻辑错误
在某些情况下,如果不对变量进行初始化,可能会导致逻辑错误。例如,在一个循环中,期望的结果可能依赖于某个变量的初始值。
阶乘:
#include <stdio.h>
int main(void)
{
int i;
int n;
double product = 1;
scanf_s("%d", &n);
for (i = 1; i <= n; i++)
{
product = product * i;
}
printf("%.0f\n", product);
return 0;
}
#include <stdio.h>
int main()
{
int flag = 1;
int i, denominator;
double n, result, sum, pi;
denominator = 1;
result = 1;//因为刚开始其值就为1!!!!!!!!
sum = 0;
pi = 0;
scanf_s("%lf", &n);
for (i = 1; i <= n; i++)
{
sum += result;
flag = -flag;
denominator += 2;
result = flag * (1.0 / denominator);
}
pi = 4 * sum;
printf("%.4f\n", pi);
printf("%d",n);
return 0;
}
阶乘表:
#include <stdio.h>
double fact(int n);
int main()
{
int i, n;
double result = 1;
scanf_s("%d", &n);
for (i = 0; i <= n; i++)
{
result *= fact(i);
}
}
double fact(int n)
{
int i;
double factor;
factor = 1;
for (i = 1; i <= n; i++)
{
factor *= i;
}
printf("%d! = %.0f\n", n, factor);
return factor;
}
输入平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。如果这3个点能构成一个三角形,输出周长和面积(保留2位小数);否则,输出“Impossible”:
#include <stdio.h>
#include <math.h>
int main()
{
int x1, y1;
int x2, y2;
int x3, y3;
double pile1,pile2,pile3,perimeter,mid,area;
scanf_s("%d,%d %d,%d %d,%d", &x1, &y1, &x2, &y2, &x3, &y3);
pile1 = (sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)));
pile2 = (sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)));
pile3 = (sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)));
if (((pile1 + pile2) > pile3) || ((pile1 + pile3) > pile2) || ((pile2 + pile3) > pile1))
{
perimeter = pile1 + pile2 + pile3;
mid = perimeter / 2;
area = sqrt(mid * (mid - pile1) * (mid - pile2) * (mid - pile3));
printf("%.2f %.2f\n", perimeter, area);
}
else
{
printf("Impossible\n");
}
return 0;
}
查询自动贩卖机中商品的价格
假设你的代码是这样的:
scanf("%d", &choice); // 只在循环开始前读取一次
for (i = 1; i <= 5; i++) {
// 这里不会再次读取 choice
// 处理 choice 的逻辑
}
在这个例子中,用户在第一次输入 choice 后,程序会进入 for 循环,但不会再次询问用户输入新的选择。所有的迭代都会使用第一次的选择。
for (i = 1; i <= 5; i++) {
printf("请输入选择 (0 退出): ");
scanf("%d", &choice); // 在每次循环中读取新的 choice
if (choice == 0) {
break; // 如果选择为 0,退出循环
}
// 处理 choice 的逻辑
}
修正后的代码
为了让用户在每次循环中都能输入新的 choice,你需要将 scanf 放在 for 循环内部。这样,在每次迭代中,程序都会询问用户输入新的选择。
#include <stdio.h>
int main()
{
int i,n;
double price;
while(1)
{
scanf("%d",&n);
if(n==0)
{
printf("Thanks\n");
break;
}
else
{
switch(n)
{
case 1:
price=3.0;
printf("%.1f",price);
break;
case 2:
price=2.5;
printf("%.1f",price);
break;
case 3:price=4.0;
printf("%.1f",price);
break;
case 4:
price=3.5;
printf("%.1f",price);
break;
default:break;
}
}
}
return 0;
}