C语言switch问题~~~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言switch问题~~~相关的知识,希望对你有一定的参考价值。
请看下面代码哪错了~~~头疼啊~~~
#include "stdio.h"
void main()
int score;
printf("input a score:");
scanf("%d",&score);
if(score>=100&&score<=0)printf("请您重新输入");
else
switch(score/10)
case 10:
case 9: printf("优秀\n"); break
case 8: printf("良好\n"); break
case 7: printf("中\n"); break
case 6: printf("及格\n"); break
default: printf("不及格");
我要给你指出的有几点问题:先写一个程序前要有个统筹的思想,这对以后做较大型的程序和今后的发展将会有很大的帮助。虽然这是个很小的程序,但也能看出你对某些部分分析不够,比如在输入有误时,虽然你提示了重新输入但却没输入的机会。
你必须注重程序的格式:一般一个大括号,或者说一个有包含关系的句子里面的语句都应该有一定的缩进,这可以帮助你在后期检查的时候,分析程序结构;如果一个嵌套语句中有大括号,一定注意不要省略大括号,这将会为你以后分析带来很多麻烦;还有个问题就是,你在预处理那里(也就是#include"stdio.h"这里 )因为,stdio.h是一个程序自带代的文件,你应该用"<>"而不用引号,这样它就不用在全盘搜索,而只需到include文件夹中寻找就可以了,这样可以为程序节约很多时间。
针对这个题,提出问题所在:第一、if语句条件判断有误;第二、switch用法有误,case: break;构成一个完整的句子所以break应该加引号;而它们之间的句子构成一个嵌套,如果分行写应该有一定的缩进。这可以看出你对句子使用的不熟悉。
最后我把我修改后的程序,给你做个参考吧:
#include<stdio.h>
void main()
int score;
do
printf("input a score:");
scanf("%d",&score);
if(score>100||score<0)
printf("please input againe!\n");
while(score>100||score<0); //还是可以是100分或0很;注意while后面一定有引号“;”
switch(score/10) //这里你对数字的处理做的很好
case 10:
case 9:
printf("very good!\n");
break;
case 8:
printf("good !\n");
break;
case 7:
printf("commonly!"\n);
break;
case 6:
printf("pass!\n");
break;
default:
printf("you must study hardly!");
break; //规范点写这儿也应该加break
如果你还想弄实用点,你还可以加入一些清屏函数,和对再次输入加以判断(加入一些用户判断语句,由用户输入选择项来判断用户是否需要再次输入) 参考技术A (1)if(score>=100&&score<=0)printf("请您重新输入"); //这里用&&是错误的,因为不存在某数既大于100,又小于0,所以if永远都不会执行;假设输入101,前面101>100满足,但后面101<0不成立,所以整体值为0,if不执行,所以为了正确判断,这里用||是正确的if(score>=100||score<=0)printf("请您重新输入"); 这样只要有一项满足就会执行if,说明有错误的输入
(2)break后面缺分号
(3)switch()里的参数不能是浮点型,score/10得的结果有可能是浮点型的
int judge;
judge=score/10;
switch(judge)
……
参考技术B 有好几个问题:
应该是||,而不是&&(while((score>=100||score<=0)))
#include "stdio.h"
void main()
int score;
printf("input a score:");
scanf("%d",&score);
while((score>=100||score<=0))
printf("请您重新输入:\n");
scanf("%d",&score);
switch(score/10)
case 10:
case 9: printf("优秀\n"); break;
case 8: printf("良好\n"); break;
case 7: printf("中\n"); break;
case 6: printf("及格\n"); break;
default: printf("不及格");
参考技术C 漏写分号break后面
#include "stdio.h"
void main()
int score;
printf("input a score:");
scanf("%d",&score);
if(score>=100&&score<=0)printf("请您重新输入");
else
switch(score/10)
case 10:
case 9: printf("优秀\n"); break;
case 8: printf("良好\n"); break;
case 7: printf("中\n"); break;
case 6: printf("及格\n"); break;
default: printf("不及格");
本回答被提问者采纳 参考技术D break后面要加分号,因为break算一个语句,加分号代表语句结束.if里面不应该用逻辑与,应该用逻辑或吧,也就是||,两者有一个成立就成立!个人觉得这两点有问题,供你参考.
C语言中switch的别样硬核玩法
本文主要介绍的是C语言中switch的别样玩法,这是很多学习C语言的人基本都没有见过的一个冷知识,虽然不是很常用,但是希望对于广大读者学习C语言有一些帮助。
如果你是第一次看到的话,不妨试一下,看你能得出该写法的作用吗?相信大家写业务逻辑的时候,都是面向if、else、for、while、switch编程。但是你见过switch嵌套do..while吗?
咋的一看,这啥鬼玩意啊,switch/while这组合能编译通过吗?您可别怀疑,还真能。这个就是达夫设备不信的同学可以拿以下代码去测试一下:
void send(int* to, int* from, int count)
{
int n = (count + 7) / 8;
switch (count % 8)
{
case 0:
do {
*to++ = *from++;
case 7:
*to++ = *from++;
case 6:
*to++ = *from++;
case 5:
*to++ = *from++;
case 4:
*to++ = *from++;
case 3:
*to++ = *from++;
case 2:
*to++ = *from++;
case 1:
*to++ = *from++;
} while (--n > 0);
}
}
void print(int array[], int count)
{
for (int i = 0; i < count; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
}
int main()
{
int to[8] = {0};
int from[8] = { 1,2,3,4,5,6,7,8};
int count = 8;
send(to, from, count);
print(to,8);
return 0;
}
在计算机科学领域,达夫设备(英文:Duff‘s device)是串行复制(serial copy)的一种优化实现,通过汇编语言编程时一常用方法,实现展开循环,进而提高执行效率。这一方法据信为当时供职于卢卡斯影业的汤姆·达夫于1983年11月发明,并可能是迄今为止利用C语言switch语句特性所作的最巧妙的实现。 https://baike.baidu.com/item/%E8%BE%BE%E5%A4%AB%E8%AE%BE%E5%A4%87/3771842?fr=aladdin
简单的来说:达夫设备是一个加速循环语句的C编码技巧。 其基本思想是减少循环测试的执行次数。
在卢卡斯影业上班的程序员 Tom Duff,他是想为了加速一个实时动画程序,实现从一个数组复制数据到一个寄存器这样一个功能,一般情况下,若要将数组元素复制进存储器映射输出寄存器,很多人都会想到使用如下写法:
do {
*to = *from++;
} while(--count > 0);
我们一般使用用for循环或者while循环的时候,如果执行循环内容本身用不了多少时间,本质上时间主要是消耗在了每次循环的比较语句上边。而事实上,比较语句是有很大优化空间的,我们假设你要循环10000次,结果你从第一次开始就不断的比较是否达到上界值,这是不是很徒劳呢?我们写一个达夫设备的函数就不会有这样的情况(不同测试会有不同效果,大家可以自行测试一下)
以上是关于C语言switch问题~~~的主要内容,如果未能解决你的问题,请参考以下文章