switch开关语句
的case后接整形常量表达式->包括(int,char)如下的形式都是整形常量式
#include<stdio.h>
int main()
{
int a;
scanf("%c",&a);如果改为scanf %d则无法读入字符常量
并不是想象中的字符常量被转为ASCii表的数字
switch(a)
{
case 'A':此时的int a==65
printf("hhhh");
break;
case '+':此时的int b==43
printf("eeee");
break;
case 1:此时的int a==49被转为ASCii表上对应的数字
想要进入这个需要把1改为49
printf("aaaaa");
break;
}
}
#include<stdio.h>
int main()
{
这回的a是char型
char a;
scanf("%c",&a);改为scanf %d同样只能读入整数。
switch(a)
{
case 'A': 此时的a==65'A'
printf("hhhh");
break;
case '+': 此时的a==43'+'
printf("eeee");
break;
case 1: 此时的a==1'49' 同样地被转为ASCii表
printf("aaaaa");
break;
}
}
根据上面的例子可以清晰的看出,switch是可以实现键盘输入字母,字符和数字来进行跳转的
但是想要字母与数字混用则需要把case后的数字label改为ASCii表对应的数字。
清屏函数
C语言中没有能够实现想删几行就删几行的函数(就窝目前所知是没办法实现的)
如动图所示的效果就只能靠清屏函数再通过循环printf来实现
使用清屏函数(system("cls"))需要调用stdlib.h
基础版:2个集合的交集&&并集 (输入的数据无重复元素)
交集:
非常简单,因为在输入数据的时候每个数组是不会出现重复的元素,那么只需要2个集合遍历,如果相等就把X存入交集C中
for(int i=0;i<la;i++)
{
for(int j=0;j<lb;j++)
{
if(a[i]==b[j])
{
c[x]=a[i];
x++; 把相同的元素存入交集C中
}else{
continue;
}
}
}
printf("交集是");
if(x==0) 如果x==0,说明是一个空集
{
printf("空集");
} else{
for(int i=0;i<x;i++)
{
printf("%d ",c[i]);
}
}
并集:
在输入数据时没有重复的条件下,求并集反而更为困难 。在这里我使用了flag标识来判断交集D中有没有重复的元素
扫描二维码关注公众号,回复:
9859764 查看本文章
算法逻辑:先将一个集合A存入并集D中,然后用集合B与并集D遍历如果没有重复则存入交集D中,如果与交集D中的元素重复则continue;进入下一次循环->取出下一个集合B的元素
把集合A存入并集D中
for(int i=0;i<la;i++)
{
d[i]=a[i];
y++;
}
集合B与并集D遍历比较
for(int i=0;i<lb;i++)外层循环逐一取出集合B的元素
{
int flag=1;设置flag标志
for(int j=0;j<y;j++)内层循环用取出的元素
{ 与交集D中所有元素比较
if(b[i]==d[j])
{
flag=0; 发现重复,flag变为0
} 跳入continue
}
if(flag==1) 没有发现重复,该元素存入并集D
{
d[y]=b[i];
y++;
}else{
continue;
}
}
printf("并集是");
for(int i=0;i<y;i++)
{
printf("%d ",d[i]);
}
进阶版(输入时的数据有重复的元素)
昨晚抓破了脑袋都没想出来,这里先挖个坑。但是我觉得可以根据设置flag标志的思路来判断是否有重复的元素来写
第二天!!我来填坑了!!!
其实根据基础版的并集算法就可以实现2个数组A&B比较并把A数组中与B数组的重复的元素丢掉,最后把A数组剩下的元素存入B数组中。根据这样的思路窝想到通过这个算法可以把第一次输入的数组a进行剔除产生新数组A(无重复元素)。完成了这一步就相当于把问题变回了基础版。
交集:
#include<stdio.h>
#define N 100
int main()
{
int a[3]={2,2,3};int A[N]; int x=0;
int b[4]={2,1,3,1};int B[N];int y=0;
int C[N];int c=0;
int D[N];int d=0;
//求交集
A[0]=a[0];把第一个元素存入新数组作为基准
那么for中的i就从1开始取元素
for(int i=1;i<3;i++)
{
int flag=1;
for(int j=0;j<x+1;j++) x,y代表数组的下标,x+1后才是数组元素个数
{
if(a[i]==A[j])
{
flag=0;
}
}
if(flag==1)
{
A[x+1]=a[i];
x++;
}
}
B[0]=b[0];
for(int i=1;i<4;i++)
{
int flag=1;
for(int j=0;j<y+1;j++) x,y代表数组的下标,x+1后才是数组元素个数
{
if(b[i]==B[j])
{
flag=0;
}
}
if(flag==1)
{
B[y+1]=b[i];
y++;
}
}
for(int i=0;i<x+1;i++) x,y代表数组的下标,x+1后才是数组元素个数
{
for(int j=0;j<y+1;j++)
{
if(A[i]==B[j])
{
C[c]=A[i];
c++;
}
}
}
printf("交集是");
for(int i=0;i<c;i++)
{
printf("%d ",C[i]);
}
return 0;
}
并集:
既然问题变成了基础版,思路就这样了,所以源代码跟基础版一模一样。
吸收缓冲区
并不知道原理,只知道如何解决
1 使用getchar来吸收
getchar();
2.一次吸收完缓冲区的数据
int ch;
while((ch=getchar()!='\n'||(ch!=EOF))