黑马程序员技术交流社区

标题: 输入一句英文 , 只包含字母和空格 , 如何输出这句英文中..... [打印本页]

作者: 米阳    时间: 2016-3-1 17:37
标题: 输入一句英文 , 只包含字母和空格 , 如何输出这句英文中.....
输入一句英文 , 只包含字母和空格 , 如何输出这句英文中的最长单词 ? 请各位大神指教 , 如果能在把这句英文中每个单词的首字母转换成大写在输出就更好了

作者: Eric_Jia    时间: 2016-3-1 17:58
本帖最后由 Eric_Jia 于 2016-3-1 18:01 编辑

1.创建一个数组2.在这个数组中输入你要输入的东西
3.循环判断每个数组每个位置上的内容
4.顺便创建一个变量,每移动一个位置,这个变量加1,
5.创建如果是空格就可以得出一个单词的大小
6.依次比较每个变量的大小就可以判断哪个单词最长
7.空格后面的单词就是可以通过ACSII码加减32来进行大小写切换了
这是一个我自己的思路不知道对你有用没。

作者: 米阳    时间: 2016-3-2 10:33
Eric_Jia 发表于 2016-3-1 17:58
1.创建一个数组2.在这个数组中输入你要输入的东西
3.循环判断每个数组每个位置上的内容
4.顺便创建一个变量 ...

谢谢 , 比如i love heima 应该怎么办呢 ?
作者: 堕落天使    时间: 2016-3-3 08:04
本帖最后由 堕落天使 于 2016-3-3 08:11 编辑
  1. <div class="blockcode"><blockquote>/*
  2. 输入一句英文 , 只包含字母和空格 , 如何输出这句英文中的最长单词 ? 请各位大神指教 , 如果能在把这句英文中每个单词的首字母转换成大写在输出就更好了
  3. */


  4. #include <stdio.h>

  5. int main(int argc, const char * argv[]) {
  6.    
  7.     char str[50];
  8.     int word = 0;
  9.     int count = 0;
  10.     int wordCount = 0;
  11.     int max = 0;
  12.     int start = 0;
  13.     printf("请输入一个字符串!\n");
  14.     gets(str);
  15.     for (int i  = 0; str[i]!='\0'; i++) {
  16.         if (str[i] == ' ') {
  17.             word = 0;//下次循环是单词的标记。
  18.         } else if(word ==0){
  19.             count++;
  20.             str[i] = str[i] - 32;
  21.             word = 1;//不是单词的标记。
  22.             start = i; //单词的起始位置。
  23.             //从此处开始循环获取这个单词的长度
  24.             for (int j = i; (str[j]!=' ')&&(str[j]!='\0'); j++) {
  25.                 wordCount++;
  26.             }
  27.             if (wordCount>max) {
  28.                 max = wordCount;//记录最长单词的长度
  29.                
  30.                
  31.             }
  32.             wordCount = 0; //单词长度清零。
  33.         }
  34.     }
  35.    
  36.     printf("最长的单词是:");
  37.    //打印最长的单词。
  38.     for (int i = start; i<start+max; i++) {
  39.         printf("%c",str[i]);
  40.     }
  41.     printf("\n");
  42.     printf("单词的个数是%d.\n",count);
  43.     puts(str);
  44.     return 0;
  45. }
复制代码
运行的结果是:
  1. 请输入一个字符串!
  2. warning: this program uses gets(), which is unsafe.
  3. i love heima
  4. 最长的单词是:Heima
  5. 单词的个数是3.
  6. I Love Heima
  7. Program ended with exit code: 0
复制代码




作者: ios_Beginner    时间: 2016-3-3 21:04
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //定义字符串
        NSString *words = @"i love heima";
        //将字符串分解成单词存入数组
        NSArray *array = [words componentsSeparatedByString:@" "];
        __block NSUInteger maxCount = 0;
        __block NSUInteger maxIdx = 0;
        //遍历数组
        [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            //找出最长单词的位置
            if ([array[idx] length] > maxCount) {
                maxCount = [array[idx] length];
                maxIdx = idx;
            }
        }];
        //打印最长单词
        NSLog(@"%@",array[maxIdx]);

    }
    return 0;
}
用 OC 做的,相对简单一些。


作者: 米阳    时间: 2016-3-4 02:03
ios_Beginner 发表于 2016-3-3 21:04
#import
int main(int argc, const char * argv[]) {    @autoreleasepool {        //定义字符串         ...

是啊              
作者: 米阳    时间: 2016-3-5 23:32
堕落天使 发表于 2016-3-3 08:04
运行的结果是:

多谢 , 不过你这个代码好像只能当最后一个单词是最长单词时 , 对最长单词的判断是正确的啊
作者: ios_Beginner    时间: 2016-3-7 19:38
米阳 发表于 2016-3-5 23:32
多谢 , 不过你这个代码好像只能当最后一个单词是最长单词时 , 对最长单词的判断是正确的啊 ...

不会呀,我测试过了,结果是正确的呀
作者: wx_MkPtTU4D    时间: 2016-3-7 22:27
//输入一句英文,只包含字母和空格,如何输出这句英文中的最长单词?再把每个单词的首字母转换成大写!
#include <stdio.h>
#include<string.h>
int main(int argc, const char * argv[])
{
    //让用户输入一段英文,
    printf("请输入一段英文:\n");
    char chr[50]={'a'};
    fgets(chr, 50, stdin);
    if (chr[strlen(chr)-1]=='\n')
    {
        chr[strlen(chr)-1]=' ';
    }
    //声明一个二维字符数组用来保存字符单词
    char ch[10][20]={'a'};
    //声明一个数组用来保存/n的位置
    int num[10] ={0};
    //这里的思路是:让num[0]=0,方便下一步,将英文段中的空格下标全部找出来给整形数组赋值,通过空格的下标来将英文段的每个字母赋值给字符二维数组;
    int j = 0;
    for (int i = 0; i < 50; i++)
    {
        
        if (chr[i]==' ')
        {
            num[++j]=i;
        }
    }
    //将一段英文中的内容赋值到二维数组中
    for (int i = 1; i <= 10; i++)
    {
        int k = 0;//定义一个变量,每次让k从0开始
        for (int j = num[i-1]; j <num[i]; j++)//通过整形数组中的值,来判断每个英文单词的长度,将他们赋值给二维数组,j的值来判断英文段的位置,当为空格的时候,就直接略过,不为空格时,才给二维字符数组赋值,用i值表示行坐标,K的值用来表示列坐标,这样就可以将英文段中的每个单词找出来并且保存到数组的每一行,
        {
            if (chr[j]!=' ')
            {
                ch[i-1][k++]=chr[j];
            }
        }
    }
    //声明一个指针变量用来指向二维数组的第0个元素,找出整个二维数组中的最长
   
    char *t = ch[0];//因为字符数组的地址是常量无法改变,声明一个字符指针,首先指向第0行和其他行的字符串作比较,如果大于第0行就将长的字符串地址赋值给指针变量,输出指针变量就是最长字符串
    for (int i = 1; i< 10; i++)
    {
        if (strlen(t)<strlen(ch[i]))
        {
            t = ch[i];
        }
    }
    printf("最长单词为:%s\n",t);
    //转换为大写的思路就简单了,找到每一行的每一列的第一个元素,将他们减去32,就得到他们大写,再打印出来;
    for (int i = 0; i < 10; i++)
    {
        *ch[i]=*ch[i]-32;
    }
    //循环输出时,会打印出其他代码,可以选择性的打印
    for (int i = 0; i< 10; i++)
    {
        if (*ch[i]!='\340')
        {
            printf("%s ",ch[i]);
        }
        
    }
    printf("\n");
  
    return 0;
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2