10.26 练习笔记(全是细节干货)

发布于 28 天前  215 次阅读


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 &apos;main&apos;:
Main.c:27:6: warning: unused variable &apos;freight&apos; [-Wunused-variable]
  int freight = 0;
      ^
Main.c: In function &apos;discount&apos;:
Main.c:22:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

我做练习的时候有个题输出结果全正确,但是出现了警告信息

  1. 未使用的变量警告 (unused variable):复制代码Main.c:27:6: warning: unused variable 'freight' [-Wunused-variable] int freight = 0; 这个警告表示在 main 函数中声明了一个变量 freight,但在后续的代码中并没有使用这个变量,这样会出现警告。这可能是因为你忘记使用它,或者它不再需要。为了消除这个警告,你可以选择使用这个变量,或者删除它
  2. 控制到达非空函数末尾的警告 (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,你认为呢?

届ける言葉を今は育ててる
最后更新于 2024-10-26