poj1002

刚刚搞acm几天  老师就将了poj1002题目   把老师讲的代码 研究了3天  终于以为自己研究透了    写完以后 vc编译正常运行   结果oj上一提交  

竟然20多条错误     前几天不会  现在终于  会了  讲这篇文章顺便修改了   有兴趣的朋友可一  先看一下我的错误代码  如果 找不出原因  底下有错误的原因   和改正后的代码  。同时,在次想结交编程爱好者,acmer 大家共同进步 我的qq号 827552788  加好友是 说下验证  acm  谢谢哈

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char map[]="22233344455566677778889999";
char str[80]={'\0'},num[100000][9]={'\0'};
int compare(const void *elem1,const void *elem2)                       //记住  快排
{
 return strcmp((char *)elem1,(char *)elem2);
}


void change(int n)
{
 for(int i=0,j=0;str[i]!='\0';i++,j++)
 {
  if(j==3)                                 {i--;  num[n][j]='-';}
  else if(str[i]=='-')                     j--;
  else if(str[i]>='A'&&str[i]<='Z')        {num[n][j]=map[str[i]-'A'];}
  else                                     num[n][j]=str[i];
 }
}

int main()
{
 int n,i,j;
 scanf("%d",&n);
 getchar();
 for( i=0;i<n;i++)
 {
  scanf("%s",str);
  change(i);
 }    
    qsort(num,n,9,compare);                                        //记住  快排
 i=0;
 bool noplicate=1;
 while(i<n)                                                      //记住  对多个字符串排序
 {
  j=i;
  i++;
  while(i<n&&strcmp(num[i],num[j])==0)
   i++;
  if(i-j>1)
  {
   printf("%s %d\n",num[j],i-j);
   noplicate=0;
  }
  
 }
    if(noplicate)
  {
   printf("No duplicate.\n");
  }
 return 0;
}

 

 

 

这是oj上指明的错误:

  • Compile Error

    Main.c
    F:\temp\11500018.24260\Main.c(14) : error C2143: syntax error : missing ';' before 'type'
    F:\temp\11500018.24260\Main.c(14) : error C2143: syntax error : missing ';' before 'type'
    F:\temp\11500018.24260\Main.c(14) : error C2143: syntax error : missing ')' before 'type'
    F:\temp\11500018.24260\Main.c(14) : error C2143: syntax error : missing ';' before 'type'
    F:\temp\11500018.24260\Main.c(14) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(14) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(14) : error C2065: 'j' : undeclared identifier
    F:\temp\11500018.24260\Main.c(14) : error C2059: syntax error : ')'
    F:\temp\11500018.24260\Main.c(15) : error C2143: syntax error : missing ';' before '{'
    F:\temp\11500018.24260\Main.c(16) : error C2065: 'j' : undeclared identifier
    F:\temp\11500018.24260\Main.c(16) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(16) : error C2065: 'j' : undeclared identifier
    F:\temp\11500018.24260\Main.c(17) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(17) : error C2065: 'j' : undeclared identifier
    F:\temp\11500018.24260\Main.c(18) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(18) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(18) : error C2065: 'j' : undeclared identifier
    F:\temp\11500018.24260\Main.c(18) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(19) : error C2065: 'j' : undeclared identifier
    F:\temp\11500018.24260\Main.c(19) : error C2065: 'i' : undeclared identifier
    F:\temp\11500018.24260\Main.c(35) : error C2065: 'bool' : undeclared identifier
    F:\temp\11500018.24260\Main.c(35) : error C2146: syntax error : missing ';' before identifier 'noplicate'
    F:\temp\11500018.24260\Main.c(35) : error C2065: 'noplicate' : undeclared identifier
    F:\temp\11500018.24260\Main.c(45) : error C2065: 'noplicate' : undeclared identifier
    F:\temp\11500018.24260\Main.c(49) : error C2065: 'noplicate' : undeclared identifier
    

     经过了多个交流群的研究 以及老师的帮助 终于找到了 原因  

  • 标准c中不允许 变量定义在for()里面的括号里。所以应该把里面的i,j给定义在外面。其次在最后的输出中 少了一个s 应该输出 “No  duplicates” 

  • 其次我的快排函数是老师教的  还不太会用  所以我自己用冒泡谢了一边 结果 超时   不过  还好能成功运行  剩下的时间  应看看快排函数  以下是我修改的代码。注释的部分是我说的另一种排序。

  • #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    char map[]="22233344455566677778889999";
    char str[80]={'\0'},num[100000][9]={'\0'};
    /*int compare(const void *elem1,const void *elem2)                       //记住  快排
    {
     return strcmp((char *)elem1,(char *)elem2);
    }*/

    void sort(int n)
    {
     int i,j;
     for(i=0;i<n-1;i++)
      for(j=0;j<n-1-i;j++)
       if(strcmp(num[j],num[j+1])>0)
       {
        strcpy(str,num[j]);
        strcpy(num[j],num[j+1]);
        strcpy(num[j+1],str);
       }
    }
    void change(int n)
    {
     for(int i=0,j=0;str[i]!='\0';i++,j++)
     {
      if(j==3)                                 {i--;  num[n][j]='-';}
      else if(str[i]=='-')                     j--;
      else if(str[i]>='A'&&str[i]<='Z')        {num[n][j]=map[str[i]-'A'];}
      else                                     num[n][j]=str[i];
     }
    }

    int main()
    {
     int n,i,j;
     scanf("%d",&n);
     getchar();
     for( i=0;i<n;i++)
     {
      scanf("%s",str);
      change(i);
     }    
    //    qsort(num,n,9,compare);                                        //记住  快排
     sort(n);
     i=0;
     bool noplicate=1;
     while(i<n)                                                     //记住  数重复字符串个数
     {
      j=i;
      i++;
      while(i<n&&strcmp(num[i],num[j])==0)
       i++;
      if(i-j>1)
      {
       printf("%s %d\n",num[j],i-j);
       noplicate=0;
      }
      
     }
        if(noplicate)
      {
       printf("No duplicate.\n");
      }
     return 0;
    }

     

  • 收获: 知道了变量的定义时不能定义在for()循环里面

  •             知道了快排函数 应该熟练掌握。

  •             学会了bool型数据类型  (尽量定义成true或force,最好不用0和1)

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值