从零开始学编程---第一步-C语言(十八)

时间:2014-03-06 14:48    点击:

输入一个字母,我们判断这个字母是大写还是小写,并显示是大写或小写第几个字母

这个题目其实不难
判断一个字母是大小写你们应该知道怎么做了吧
下面这个是判断是否小写
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);

}

来源:幻想编程//所属分类:站长原创/更新时间:2014-03-06 14:48
顶一下
(12)
100%
踩一下
(0)
0%
上一篇:从零开始学编程---第一步-C语言(十七)
下一篇:从零开始学编程---第一步-C语言(十九)
相关内容