switch 括号里的知识
表达式类型:确保括号表达式的结果是一个整型,这涉及到隐式转换,所以你可以用到强制转换运算
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int ex(int s) {
if (s < 1000) {
return 0;
}
else if (1000 <= s < 2000) {
return 1;
}
else if (2000 <= s < 3000) {
return 2;
}
else if (3000 <= s < 4000) {
return 3;
}
else if (4000 <= s) {
return 4;
}
}
int main() {
double s=0;
scanf("%lf", &s);
switch (ex(s)) {
case 0:break;
case 1:s *= 0.9;
break;
case 2:s *= 0.85;
break;
case 3:s *= 0.8;
break;
case 4:s *= 0.75;
break;
}
printf("%.2f", s);
return 0;
}
就这么简单的代码,出现了错误,那就是定义的exchange函数(ex),括号里面应该是(double s),因为你要匹配的是main函数中的s,它是double类型
而且,你应该在ex函数里面加一个默认返回值,比如return 0;,以防匹配不到(实际生产时)
而且,你个傻逼,能他妈连用比较运算符吗!shabi
Main.c: In function 'main':
Main.c:27:6: warning: unused variable 'freight' [-Wunused-variable]
int freight = 0;
^
Main.c: In function 'discount':
Main.c:22:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
我做练习的时候有个题输出结果全正确,但是出现了警告信息
- 未使用的变量警告 (
unused variable
):复制代码Main.c:27:6: warning: unused variable 'freight' [-Wunused-variable] int freight = 0;
这个警告表示在main
函数中声明了一个变量freight
,但在后续的代码中并没有使用这个变量,这样会出现警告。这可能是因为你忘记使用它,或者它不再需要。为了消除这个警告,你可以选择使用这个变量,或者删除它 - 控制到达非空函数末尾的警告 (
control reaches end of non-void function
):复制代码Main.c:22:1: warning: control reaches end of non-void function [-Wreturn-type] }
这个警告表示在discount
函数中,函数声明为返回一个值(即非空函数),但在函数的所有可能执行路径中没有返回任何值。这通常意味着你需要在函数的末尾添加一个return
语句,返回一个适当的值,也就是像上面说的题,加一个默认返回值
小芳的妈妈每天给她2.5元钱,她都会存起来。但是,每当这一天是存钱的第5天或者5的倍数的话, 她都会花去6元钱,请问经过n天, 小芳才可以存到超过m元钱,并输出当前存款金额,保留2两位小数。
例如
【输入】100
【输出】days=74,money=101.00
我的代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
double m;
scanf("%lf", &m);
double sum = 0;
int i;
for (i=1; sum <= m; i++) {
sum += 2.5;
if (i % 5 == 0) {
sum -= 6;
}
}
printf("%d %.2f", i, sum);
return 0;
}
输入100,但是返回的天数是75而不是74
这道题很好
首先,如果sum==m,那么i++的目的就是说这一天的下一天才是真正存款超过m的时候
那我们有没有想过,就在sum==m这天,我们同样会进行循环内代码的两个操作(sum自加2.5和if语句),这个是会对sum再次产生影响的,而且,我们并不能自信地先入为主地认为i++便一定会出现sum>m的情况,所以,这个代码块顺序结构的逻辑有误
下面是纠正代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
double m;
scanf("%lf", &m);
double sum = 0;
int i;
for (i = 1; ; i++) { // 无限循环,直到手动 break
sum += 2.5;
if (i % 5 == 0) {
sum -= 6;
}
if (sum > m) { // 检查是否超过 m
break; // 超过 m,退出循环
}
}
printf("days=%d,money=%.2f\n", i, sum);
return 0;
}
同时给自己提个醒,优先按照题目的思路来,就比如这个sum>m,我先考虑sum<=m是对的,但在写代码的时候我能不能用纠正代码的if(sum<m)呢,这样和题目说明的一致,可读性也更强
你在csdn上看过关于数组下标和字符结束符\0的知识,而且你一般都不会想要加一个内存去存储它
但是不加字符结束符会有什么坏处呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main() {
char str[5] = {'C','h','i','n','a'};
for (int i = 0; i < strlen(str); i++) {
str[i] = str[i] + 4;
}
printf("%s",str);
return 0;
}
代码块运行的结果应该是Glmre,但是输出时却出现了错误的中文字符
主要是因为你使用了字符数组 str
来存储字符,但没有在字符串的末尾添加一个空字符 '\0'
,这会导致 printf
函数在打印字符串时无法正确识别字符串的结束位置
所以,还是加上吧!况且只需要你改成str[6]这一处,因为strlen函数是如此人性化!
int i;
int s;
for (i=0;; i++) {
s = in;
s /= 10;
if (s == 0) {
break;
}
}
看看你写的什么几把,每次循环s都等于in,in又没变,陷入无限循环,有几把用!
第二个操作是in每位数中间加空格,所以得保留in的值,劝你一句,不要为了保留原变量的值在循环里面定义新变量!
在循环前面加int s=in;不就行了,沙比
还是上面那个极其简单的代码,让我纠正了for循环的误区,感谢你!
i++
,在每次循环结束时执行
并不是我以为的并驾齐驱,善哉!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int in = 0;
scanf("%d", &in);
// 检查输入范围
if (in > 99999 || in < 1) {
return 0;
}
int i = 0; // 位数计数器
int s = in; // 保存原始输入
// 计算位数
while (s > 0) {
s /= 10; // 每次除以 10
i++; // 位数加 1
}
printf("%d\n%d\n", i, in); // 输出位数和原始输入
return 0;
}
改成这样多好,你说是吧?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int in=0;
scanf("%d", &in);
if (in > 99999 || in < 1) {
return 0;
}//写着玩
int i=0;
int s = in;
while (s != 0) {
s /= 10;
i++;
}
printf("%d\n%d\n",i,in);
int k;
for (int j = 0; j < i; j++) {
if (in > 9) {
k = in % 10;
in /= 10;
}
else {
k = in;
}
printf("%d", k);
}
return 0;
}
这个题目的总代码参数,没借助ai,花了我好长时间,还是之前ai搜过的!还是不能太依靠ai了
输入整数n(1<=n<=10000),计算公式1+1/(1+2)+...1/(1+2+...+n)的值
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
double s=0,j=0,sum=0;
for (int i = 1; i <= n; i++) {
s += i;
j = 1.0 / s;
sum += j;
}
printf("%.4f",sum);
return 0;
}
一个好的程序员懂得如何将定义的变量利用最大化,就比较for循环里的i,你认为呢?
Comments NOTHING