从零开始学编程---第一步-C语言(十八)
输入一个字母,我们判断这个字母是大写还是小写,并显示是大写或小写第几个字母
这个题目其实不难
判断一个字母是大小写你们应该知道怎么做了吧
下面这个是判断是否小写
if(n>='a'&&n<='z')
下面这个是判断是否大写
if(n>='A'&&n<='Z')
其实还有新函数可以实现这个,那就是大小写测试函数
isupper() 判断一个字符是否大写
islower() 判断一个字符是否小写
用法很简单,如下
if(isupper(a))
if(islower(a))
不过用之前需要加上#include <ctype.h>头文件
我们需要两个数组,一个数组放小写字母,一个数组放大写字母
a[26],b[26]
把小写和大写字母分别存放到这两个数组里,知道怎么存吧
for(i=0,x='a';x<='z';x++,i++)
{
a[i]=x;
}
for(i=0,x='A';x<='Z';x++,i++)
{
b[i]=x;
}
当我们输入一个字母,先判断它是大写还是小写
然后在数组里搜索
假如是小写字母
for(i=0;i<=25;i++)
{
if(a[i]==n)
{
printf("%c是第%d个小写字母\n",n,i+1);
break;
}
}
数组从0下标开始一个个循环 直到遇到与n对应的值就退出循环,这就是搜索
搜到它就可以知道它的位置,为什么i+1 因为是从0开始,而非1开始
整个程序如下
#include <stdio.h>
#include <ctype.h>
main()
{
char a[26], b[26],x,n;
int i;
for(i=0,x='a';x<='z';x++,i++)
{
a[i]=x;
}
for(i=0,x='A';x<='Z';x++,i++)
{
b[i]=x;
}
puts("请输入一个字母");
n=getchar();
if(islower(n))
{
for(i=0;i<=25;i++)
{
if(a[i]==n)
{
printf("%c是第%d个小写字母\n",n,i+1);
break;
}
}
}
else if(isupper(n))
{
for(i=0;i<=25;i++)
{
if(b[i]==n)
{
printf("%c是第%d个大写字母\n",n,i+1);
break;
}
}
}else
{
puts("请不要输入数字或字符");
}
}
下面我们做一个搜索的小程序
输入5个数,再输入一个数n,从这5个数中搜索是否有与n相同的数
首先是定义一个数组
a[5]
然后是我们要输入的数,n
怎么判断我们输入的数是否搜索到了?
可以定义一个变量,found 这个变量名容易让你们理解,英文找到的意思
先初始化found=1 只要搜索到了就赋值1给它found=1
现在程序就明了了
#include <stdio.h>
main()
{
int a[5],n,found=0;
for(int i=0;i<=4;i++)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&a[i]);
}
printf("\n请输入一个数\n");
scanf("%d",&n);
for(i=0;i<=4;i++)
{
if(n==a[i])
{
found=1;
break;
}
}
if(found==1) //if(found)也可以
{
printf("找到了%d,在%d个位置\n",n,i+1);
}
else
{
printf("没有找到\n");
}
}
很简单吧
学过如何搜索(查找),我们就该学习一下排序了
我们只排序5个数,按从小到大排列
怎么排? 我们得学习一种排序算法,目前我们先学习最简单的排序算法:冒泡排序
怎么个冒泡排序?
例如我们先输入5个数
8 3 5 7 3
从第一个数开始,第一个数为8
比它后面的所有数,它后面的数有4个,所以要比4次
只要比的哪个数小就发生交换 反正是最小的在前面
8比3 3比8小,发生交换 此时数组排列 3 8 5 7 3
然后第一个数比第3个数 ,此时第一个数是3了
3比5 3比5小 不需要交换 3 8 5 7 3
3比7 不需要交换
3比3 相等 不需要交换
第一轮交换就完了 最后数字排列 3 8 5 7 3
接着是第2轮 第2个数比它后面的所有数
8比5 交换 3 5 8 7 3
5比7 不交换 3 5 8 7 3
5比3 交换 3 3 8 7 5
第2轮交换结束,数字排列 3 3 8 7 5
接着第3轮 ,第3个数和它后面所有数去比
8比7 交换 3 3 7 8 5
7比5 交换 3 3 5 7 8
第3轮交换完,接着是最后一轮
第4个数比第5个数
7比8 不交换
最后数字排列就是 3 3 5 7 8 由小到大排列
第一个数比第2,3,4,5个数
第2个数比第3,4,5个数
。。。。。。。
a[0]>a[1] a[0]>a[2] a[0]>a[3] a[0]>a[4]
a[1]>a[2] a[1]>a[3] a[1]>a[4]
...........
这是两层循环 内循环依次循环第2个数 外循环依次循环第一个数
for(int x=0;x<=3;x++)
{
for(int y=x;y<=4;y++)
{
if(a[x]>a[y])
{
t=a[x];
a[x]=a[y];
a[y]=t;
}
}
}
t=a[x];
a[x]=a[y];
a[y]=t;
这3个式子是交换3个变量的值,怎么交换2个变量的值已经在144楼讲过了
整个程序如下
#include <stdio.h>
main()
{
int a[5],t;
puts("请输入5个数:");
for(int i=0;i<=4;i++)
{
scanf("%d",&a[i]);
}
puts("没排序之前的5个数:");
for(i=0;i<=4;i++)
{
printf("%d ",a[i]);
}
putchar('\n');
puts("排序后的5个数:");
for(int x=0;x<=3;x++)
{
for(int y=x;y<=4;y++)
{
if(a[x]>a[y])
{
t=a[x];
a[x]=a[y];
a[y]=t;
}
}
}
for(i=0;i<=4;i++)
{
printf("%d ",a[i]);
}
putchar('\n');
}
由大到小排序只需要改为<就可以了
稍作改动就可以对字母顺序进行排序
#include <stdio.h>
main()
{
int a[5],t;
puts("请输入5个字母:");
for(int i=0;i<=4;i++)
{
scanf("%c",&a[i]);
getchar();
}
puts("没排序之前的5个字母:");
for(i=0;i<=4;i++)
{
printf("%c ",a[i]);
}
putchar('\n');
puts("排序后的5字母:");
for(int x=0;x<=3;x++)
{
for(int y=x;y<=4;y++)
{
if(a[x]>a[y])
{
t=a[x];
a[x]=a[y];
a[y]=t;
}
}
}
for(i=0;i<=4;i++)
{
printf("%c ",a[i]);
}
putchar('\n');
}
为什么我在最后面还要加上一句
printf("结束搜索,没有找到");
因为这种搜索算法并不完美,还是有缺陷的
假如数组数据是
1 2 3 4 5
你输入6
它就不得不一个个去比对
搜索速度提升你可能你感觉不出来,但这种算法的确加快了搜索速度
你知道计算机的运算速度是很快的,细微差别很难感觉出来
下面写一个小程序
输入一段字符串,然后统计这段字符串有多少个数字,多少个字符,多少个空格
我们先定义变量吧
首先是数组
char msg[100] msg就是message的简化
然后是其他的,我全用拼音好了
shuzi=0,zimu=0,kongge=0
首先一个问题,程序怎么辨别我输入的是数字还是字符?
当然你可以用if(msg[i]>'0'&&msg[i]<'9')
if(msg[i]>'a'&&msg[i]<'z'||msg[i]>'A'&&msg[i]<'Z')
但还有最简便的方法,我们又可以学习一种新函数了,叫字符测试函数
它可以测试你输入的是数字还是字符
isalpha() 这是字符测试函数 它只能测试大小写字母
isdigit() 这是数字测试函数 它只能测试0-9数字
用法和我们用大小写测试函数一样,待会看程序
用它们之前需要头文件#include <ctype.h>
其实程序很简单,我只讲要点
#include <stdio.h>
#include <ctype.h>
main()
{
char msg[100];
int shuzi=0,zimu=0,kongge=0;
puts("请输入字符串:");
gets(msg);
for(int i=0;msg[i]!='\0';i++)
{
if(msg[i]!=' ')
{
if(isalpha(msg[i]))
zimu++;
else if(isdigit(msg[i]))
shuzi++;
}
else
{
kongge++;
}
}
printf("一共有%d个数字,%d个字母,%d个空格\n",shuzi,zimu,kongge);
}
这里
for(int i=0;msg[i]!='\0';i++)
{
if(msg[i]!=' ')
{
if(isalpha(msg[i]))
zimu++;
else if(isdigit(msg[i]))
shuzi++;
}
else
{
kongge++;
}
for(int i=0;msg[i]!='\0';i++) 只要遇到'\0'(字符串结束符)就循环结束
你不能这样for(int i=0;msg[i]!='\n';i++),不要忘了,我以前说过gets是把
'\n'排除在缓冲区的,所以回车没办法存入到数组里
这个循环首先判断是不是空格
如果不是空格,就判断是数字还是字母
是数字或字母就计数
反之就是空格来计数
很好理解吧
你也可以改为字符输入而非字符串输入
#include <stdio.h>
#include <ctype.h>
main()
{
char msg[100];
int shuzi=0,zimu=0,kongge=0;
puts("请输入字符串:");
for(int i=0;msg[i-1]!='\n';i++)
msg[i]=getchar();
for(i=0;msg[i]!='\n';i++)
{
if(msg[i]!=' ')
{
if(isalpha(msg[i]))
zimu++;
else if(isdigit(msg[i]))
shuzi++;
}
else
{
kongge++;
}
}
printf("一共有%d个数字,%d个字母,%d个空格\n",shuzi,zimu,kongge);
}
改为字符输入你就可以这样了 for(i=0;msg[i]!='\n';i++)
当然 for(i=0;msg[i]!='\0';i++)也可以
其实字符数组和字符串数组都有‘\0’的(字符数组‘\0’在哪你暂时还不知道)
而且也不是分为两种数组,说是字符数组只是让你们便于理解
基本上上字符数组(包括字符串)都需要加个‘\0’,以后你就会知道
for(int i=0;msg[i-1]!='\n';i++)
msg[i]=getchar();
这里你不能改为
for(int i=0;msg[i]!='\n';i++)
msg[i]=getchar();
那样的话循环不能退出
比如如果msg[2]=='\n' 等这次循环完了之后就i++了,变成了msg[3]
然后判断条件msg[3]!='\n' 成立,还是要循环,此时msg[3]你都还没输入
现在我们根据上面的程序来给它们进行排序,还是用冒泡排序
你可能会疑问数字和字母怎么去比较
其实程序会自动比较它们的ASC编码
所以一切就简单拉
#include <stdio.h>
#include <ctype.h>
#include <string.h>
main()
{
char msg[10];
int shuzi=0,zimu=0,kongge=0,t;
puts("请输入字符串:");
gets(msg);
for(int i=0;msg[i]!='\0';i++)
{
if(msg[i]!=' ')
{
if(isalpha(msg[i]))
zimu++;
else if(isdigit(msg[i]))
shuzi++;
}
else
{
kongge++;
}
}
for(int x=0;x<strlen(msg)-1;x++)
{
for(int y=x;y<strlen(msg);y++)
{
if(msg[x]>msg[y])
{
t=msg[x];
msg[x]=msg[y];
msg[y]=t;
}
}
}
puts(msg);
printf("一共有%d个数字,%d个字母,%d个空格\n",shuzi,zimu,kongge);
}
由于你在打字符串并不知道要打多少个字符长度
所以你也不确定循环到哪个空间为止
所以这里就可以用strlen()函数,你就不需要为这个问题烦恼拉
这个程序运行后是数字排前字母排后,因为数字的ASC编码比字母的小
但如果你的字符串包含空格,你会发现空格老排在最前面,因为空格的ASC编码比数字的还小
怎么让空格排最后面呢?只要使ASC编码比字母的ASC编码大就行了
我们可以这样
for(i=0;msg[i]!='\0';i++)
{
if(msg[i]==' ')
msg[i]='~';
}
循环数组,只要发现空格就自动替换为~字符,因为~字符的ASC编码比字母都大(当然你也可以替换别的,只要ASC编码比字母大就行)
在程序排序玩了之后,我们就可以再换回来
for(i=0;msg[i]!='\0';i++)
{
if(msg[i]=='~')
msg[i]=' ';
}
整个程序:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
main()
{
char msg[10];
int shuzi=0,zimu=0,kongge=0,t;
puts("请输入字符串:");
gets(msg);
for(int i=0;msg[i]!='\0';i++)
{
if(msg[i]!=' ')
{
if(isalpha(msg[i]))
zimu++;
else if(isdigit(msg[i]))
shuzi++;
}
else
{
kongge++;
}
}
//把空格替换为~
for(i=0;msg[i]!='\0';i++)
{
if(msg[i]==' ')
msg[i]='~';
}
//冒泡排序
for(int x=0;x<strlen(msg)-1;x++)
{
for(int y=x;y<strlen(msg);y++)
{
if(msg[x]>msg[y])
{
t=msg[x];
msg[x]=msg[y];
msg[y]=t;
}
}
}
//把~又换会空格
for(i=0;msg[i]!='\0';i++)
{
if(msg[i]=='~')
msg[i]=' ';
}
puts(msg);
printf("一共有%d个数字,%d个字母,%d个空格\n",shuzi,zimu,kongge);
}
最新内容
热点内容
- QQ群
- 返回首页
- 返回顶部