String排序和删除重复项

时间:2017-05-09 01:29:39

标签: c string algorithm sorting

首先,我为任何错误道歉,因为我是巴西人,英语不是我的母语。

我是大学新生,我从老师那里得到了这个算法:

  

创建一个程序,创建一个n个单词的向量,n是用户输入的大小(最多100个)。您的程序应该从输入向量中删除所有重复的单词并对单词进行排序。打印最终的矢量,没有重复和有序的单词。

     

E.g。用7个单词排序:

     

输入:7 [输入]

     手耳腿手脚腿

     

输出:耳脚手腿

     

注意:注释程序打印,以便程序的输出如上例所示(数字由空格键分隔,在最后一位数后没有空格)。

     

注2:如果输入无效,程序应打印:“无效输入”(全部小写)。

好的,我得到了它的工作,但我对笔记感到困惑,我找不到修复可能的错误的方法,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  char word[100][100], aux[100];
  int i, j, num;

  printf("Type how many words you want to order: ");
  do
  {
  scanf("%d", &num);
  }while (num>100 || num<=0);

  for(i=0; i<num; i++)
    scanf("%s",&word[i]);

  for (i = 0; i < num; i++) //loop to sort alphabetically
  {
    for (j = i+1; j < num; j++)
    {
      if ((strcasecmp(word[i], word[j]) > 0))  //swapping words
      {
        strcpy(aux, word[j]);
        strcpy(word[j], word[i]);
        strcpy(word[i], aux);
      }
    }
  }

  for (i = 0; i < num; i++) //loop to remove duplicates
  {
    if ((strcasecmp(word[i], word[i+1]) == 0))  //finding the duplicates
    {
      for (j = i+1; j < num; j++) //loop to delete it
        strcpy(word[j], word[j+1]);

      num--;
      i--;
    }
  }

  printf("\nWords sorted and without duplicates:\n");
  for(i=0; i<num-1; i++)
    printf("%s ", word[i]); //output with spacebar

  printf("%s", word[num-1]); //last output without spacebar

  return 0;
}

当我输入一个超过100个字符的单词时,Code :: Blocks会以错误结束,否则它可以正常工作。您认为我应该改变什么?

老师使用在线评判员(Sharif Judge)评估代码是否正确,我在3个测试中(未指定)得到错误,所有这些都是“超出时间限制”< / strong>即可。也许它与矩阵的大小或单词&gt; 100的问题有关。

提前致谢,Vinicius。

4 个答案:

答案 0 :(得分:0)

当然,如果你使用超过100个长度的woerds,你会得到一个错误  有这一行:char word[100][50], aux[100];

表示您将字长限制设置为50.使用word[100][100];

您也可以不删除重复项,只需在输出中跳过它们

当然,如果你使用法官,你不应该输出任何符号,除了答案,这意味着你应该删除所有行,如:

printf("Type how many words you want to order: ");

并检查输入格式,并检查限制,我的意思是最大字长,最大字数

像这样试试smth:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define max_word_length = 101;
#define max_amount_of_words = 101;

int main() {
    char word[max_amount_of_words][max_word_length] = {};
    char aux[max_word_length];
    int i, j, num;

    scanf("%d", &num);

    if (num < 0 || num > 100) {
        printf("invalid entry");
        return 0;
    }

    for (i = 0; i < num; i++) {
        scanf("%s", word[i]);
    }

    for (i = 0; i < num; i++) {//loop to sort alphabetically    
        for (j = i + 1; j < num; j++) {
            if ((strcasecmp(word[i], word[j]) > 0)) {  //swapping words         
                strcpy(aux, word[j]);
                strcpy(word[j], word[i]);
                strcpy(word[i], aux);
            }
        }
    }

    bool is_joint = false;
    for (i = 0; i < num; i++) { //loop to skip duplicates   
        if ((strcasecmp(word[i], word[i + 1]) != 0)) { //if there is a duplicate , we willnot output it
            if(is_joint) printf(" ");
            printf("%s ", word[i]);
            is_joint = true;
        }
    }

    return 0;
}

答案 1 :(得分:0)

我猜你输入的理智检查导致了这个问题。

如评论部分所述。 如果n总是&lt; 100.绝对是您的排序不会导致超出任何时间限制。 看起来n给出大于100的东西,你的scanf正在等待并导致问题。另外,请确保输入的数字正确无误。如果输入是> 100打印&#39;无效输入&#39;。 像下面这样的东西应该有效。

scanf("%d", &num);
if (num > 100)
    printf("invalid entry");

for (i = 0; i < num; i++) {
    scanf("%s", word[i]);
    if (strlen(word[i])>100)
            printf("invalid entry");
}

希望它有所帮助!

答案 2 :(得分:0)

我得到了100%的Judge,我修改了代码,看起来像这样:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
  char word[101][101],aux[101]; //a number higher than the limit to comparisons
  int i,j,num;

  scanf("%d",&num);
  if(num<=0||num>100){ // if words < 0 or >100
    printf("invalid input");
    return 0;
  }

  for(i=0;i<num;i++){
    scanf("%s",&word[i]); //read n words
    if(strlen(word[i])>100){ //if word >100 caracters
      printf("invalid input");
      return 0;
    }
    for(j=0;j<strlen(word[i]);j++){
      if (word[i][j]>=65&&word[i][j]<=90){
        word[i][j]= word[i][j]+32; // if word is uppercase, make them lowcase
      }
      else if (word[i][j]>122||word[i][j]<97){// if word is different from alphabet lowercase
      printf("invalid input");
      return 0;
      }
    }
  }

  for(i=0;i<num;i++){
    for(j=i+1;j<num;j++){
      if((strcmp(word[i],word[j])>0)){ //loop to sort words
        strcpy(aux,word[j]);
        strcpy(word[j],word[i]);
        strcpy(word[i],aux);
      }
    }
  }


  for(i=0;i<num-1;i++){
    if((strcmp(word[i],word[i+1])!=0)){ // output words with spacebar, without the last one
      printf("%s ",word[i]);
    }
  }
  printf("%s",word[num-1]); // last word without spacebar

  return 0;
}

感谢所有试图提供帮助的人,我已经从你的建议中学到了很多东西!

答案 3 :(得分:-1)

这个项目实际上对于一个程序员来说非常艰难    从C开始。

在您的计算机上运行此程序。    在针对Judge运行之前,请确保使用手动输入多次运行。一旦您对测试感到满意,请尝试使用Judge

就像我说的,最困难的部分是根据规范存储用户的输入(接受多行中的空格或换行符)。

#include <stdio.h>
#include <string.h>

int
main(void)
{

   int iNumW, iIndex;
   int iWCnt = 0;
   int iC;
   char caTemp[100];
   char caWords[100][100];
   char *cpDelimeter = " \n";
   char *cpToken;
   char *cp;
   short sIsWord = 1;
   char caGarbage[100];

   scanf("%d", &iNumW );
   fgets(caGarbage, sizeof caGarbage, stdin);  //Remove newline char

   //Get word inputs
   while( iWCnt < iNumW )
   {
       fgets(caTemp, sizeof caTemp, stdin );
       for( cpToken = strtok( caTemp, cpDelimeter );   cpToken != NULL;  cpToken = strtok( NULL, cpDelimeter)){

          cp = cpToken;
          while( *cp ){
              sIsWord = 1;

              //Check if alphabet
              if( !isalpha(*cp) ){
                  sIsWord = 0;
                  break;
              }
              cp++;
          }
          if( sIsWord ){
              strcpy( caWords[iWCnt], cpToken );
             //printf( "%s\n", caWords[iWCnt]);
              iWCnt++;
              if( iWCnt >= iNumW ) break;
          } else {
              printf("invalid entry.\n");
        }
        //printf("%d\n", iWCnt);
      } 
   }
   int i,j ;
   for (i = 0; i < iWCnt; i++) {//loop to sort alphabetically    
      for (j = i + 1; j < iWCnt; j++) {
        if ((strcasecmp(caWords[i], caWords[j]) > 0)) {  //swapping words         
            strcpy(caTemp, caWords[j]);
            strcpy(caWords[j], caWords[i]);
            strcpy(caWords[i], caTemp);
          }
      }
  }

   for (i = 0; i < iWCnt; i++) { //loop to skip duplicates   
       if ((strcasecmp(caWords[i], caWords[i + 1]) != 0)) { //if there is a duplicate , we willnot output it
        printf("%s ", caWords[i]);
       }
   }

   return 0;
}