鱼C论坛

 找回密码
 立即注册
查看: 1560|回复: 6

[已解决]有没有哪位大哥帮我一下!!快要被搞死了!!!

[复制链接]
发表于 2019-1-9 19:08:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
拜托了

/*-------------------------------------------------------------------------
【程序设计】
---------------------------------------------------------------------------
  
题目:主函数main()中的字符数组s为测试数据,程序首先取出字符数组s中的连续数
      字字符子串,构成若干个整数,保存到t数组中,然后找出数组中的所有素数,
      并将素数顺序存放到数组的后部。

编写程序:
         1.编写int abstract(char s[],int t[])函数。取出字符数组s中的连续数
           字字符子串,构成若干个整数,保存到数组t中。函数返回整数个数。

         2.编写函数void move( int t[], int n),找到t数组中的所有素数,并将
           该数组中的所有素数顺序移到数组的后面,素数间的相对位置不变。

例如:字符数组s中的数据为"yu11asd18**6$abc3jui17t*r33t10?qwe31nm19jj21da"

      则数组t中元素为:11  18  6  3  17  33  10  31  19  21

      程序运行结果:18  6  33  10  21  11  3  17  31  19
      
--------------------------------------------------------------------------
注意:请勿改动主函数main()中的任何语句。
-------------------------------------------------------------------------*/

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>

int abstract(char s[],int t[])
{
/**********Program**********/
int i,j=0,sum=0;
for(i=0; s[i]; i++)
{
        if(isdigit(s[i]))
        {
                sum=0;
                while(isdigit(s[i]))
                        sum=sum*10+s[i++]-'0';
        }
        if(sum)
        {
        t[j++]=sum;
        sum=0;
        }
}
return j;
/**********  End  **********/
}
void move( int t[], int n)
{
/**********Program**********/





/**********  End  **********/
}
int main()
{
    char s[]={"yu11asd18**6$abc3jui17t*r33t10?qwe31nm19jj21da"};
    int t[20],i,n;
    FILE *fp;
    if((fp=fopen("data.dat","w"))==NULL)
    {
        printf("File open error\n");
        exit(0);
    }
    n=abstract(s,t);
    move(t,n);
    for(i=0;i<n;i++)
    {
        printf("%d  ",t[i]);
        fprintf(fp,"%d  ",t);
    }
    fclose(fp);
    return 0;
}
[/i][/i][/i][/i]
最佳答案
2019-1-10 16:41:09
你好,代码的思路都在注释里了,有什么不懂的地方可以回复哦~
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<ctype.h>
  4. #include<math.h>

  5. int abstract(char s[],int t[])
  6. {
  7. /**********Program**********/
  8.     int i,j=0,k=0,m=1,sum=0,cnt=0;
  9.     for(i=0; s[i]; i++)
  10.     {
  11.         char h[10]={0};
  12.         if(s[i]>='0'&&s[i]<='9')j=i;//j为定位用,定位到第一个数字出现的位置。
  13.         while(s[j]>='0'&&s[j]<='9')
  14.         {
  15.             h[k++]=s[j++];          //从j位置开始找,找到不是数字的字符位置,这之间所有的数字赋值到另一个字符串中
  16.         }
  17.         h[k]=0;
  18.         if(h[0]){
  19.             t[cnt++]=atoi(h);       //把这个字符串转换为数字(也可以用循环转换,这里为方便使用了函数)
  20.             i=j;                    //我们把i定位到数字最后一位的后一位,没有这句话,例如扫到了11,会把后边的1也扫进去。
  21.         }
  22.         k=0;                        //用来存储新的数字
  23.     }
  24.     return cnt;
  25.     /**********  End  **********/
  26. }
  27. void move( int t[], int n)
  28. {
  29. /**********Program**********/
  30.     int i=0,j=0,k,flag=1,m=n;
  31.     for(i=0;i<n;i++)
  32.     {
  33.         //判断素数的算法
  34.         flag=1;
  35.         for(j=2;j<=sqrt(t[i]);j++)
  36.         {
  37.             if(t[i]%j==0)
  38.                 flag=0;
  39.         }
  40.         //解释下为什么下面用m,我的意思是把这个素数后面的都往左挪,那么肯定要从这个素数的位置扫到最后一位。
  41.         //n--的原因是后边已经移动完的素数就不用再移动了。就是从0-n开始扫。没有这句话会重复扫已经扫过的素数,已经排好的素数就乱了顺序。
  42.         //总结:n是检测素数用,m是移动素数用。
  43.         if(flag)
  44.         {
  45.             int temp=t[i];
  46.             for(k=i;k<m-1;k++)
  47.             {
  48.                 t[k]=t[k+1];
  49.             }
  50.             t[m-1]=temp;
  51.             i=0;n--;
  52.         }
  53.     }
  54. /**********  End  **********/
  55. }
  56. int main()
  57. {
  58.     char s[]={"yu11asd18**6$abc3jui17t*r33t10?qwe31nm19jj21da"};
  59.     int t[20],i,n;
  60.     FILE *fp;
  61.     if((fp=fopen("data.dat","w"))==NULL)
  62.     {
  63.         printf("File open error\n");
  64.         exit(0);
  65.     }
  66.     n=abstract(s,t);
  67.     move(t,n);
  68.     for(i=0;i<n;i++)
  69.     {
  70.         printf("%d  ",t[i]);
  71.         fprintf(fp,"%d  ",t[i]);//这里有改动,t是个数组,循环要输出t[i]而不是t。
  72.     }
  73.     fclose(fp);
  74.     return 0;
  75. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-9 19:23:13 | 显示全部楼层
没人吗??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-10 16:41:09 | 显示全部楼层    本楼为最佳答案   
你好,代码的思路都在注释里了,有什么不懂的地方可以回复哦~
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<ctype.h>
  4. #include<math.h>

  5. int abstract(char s[],int t[])
  6. {
  7. /**********Program**********/
  8.     int i,j=0,k=0,m=1,sum=0,cnt=0;
  9.     for(i=0; s[i]; i++)
  10.     {
  11.         char h[10]={0};
  12.         if(s[i]>='0'&&s[i]<='9')j=i;//j为定位用,定位到第一个数字出现的位置。
  13.         while(s[j]>='0'&&s[j]<='9')
  14.         {
  15.             h[k++]=s[j++];          //从j位置开始找,找到不是数字的字符位置,这之间所有的数字赋值到另一个字符串中
  16.         }
  17.         h[k]=0;
  18.         if(h[0]){
  19.             t[cnt++]=atoi(h);       //把这个字符串转换为数字(也可以用循环转换,这里为方便使用了函数)
  20.             i=j;                    //我们把i定位到数字最后一位的后一位,没有这句话,例如扫到了11,会把后边的1也扫进去。
  21.         }
  22.         k=0;                        //用来存储新的数字
  23.     }
  24.     return cnt;
  25.     /**********  End  **********/
  26. }
  27. void move( int t[], int n)
  28. {
  29. /**********Program**********/
  30.     int i=0,j=0,k,flag=1,m=n;
  31.     for(i=0;i<n;i++)
  32.     {
  33.         //判断素数的算法
  34.         flag=1;
  35.         for(j=2;j<=sqrt(t[i]);j++)
  36.         {
  37.             if(t[i]%j==0)
  38.                 flag=0;
  39.         }
  40.         //解释下为什么下面用m,我的意思是把这个素数后面的都往左挪,那么肯定要从这个素数的位置扫到最后一位。
  41.         //n--的原因是后边已经移动完的素数就不用再移动了。就是从0-n开始扫。没有这句话会重复扫已经扫过的素数,已经排好的素数就乱了顺序。
  42.         //总结:n是检测素数用,m是移动素数用。
  43.         if(flag)
  44.         {
  45.             int temp=t[i];
  46.             for(k=i;k<m-1;k++)
  47.             {
  48.                 t[k]=t[k+1];
  49.             }
  50.             t[m-1]=temp;
  51.             i=0;n--;
  52.         }
  53.     }
  54. /**********  End  **********/
  55. }
  56. int main()
  57. {
  58.     char s[]={"yu11asd18**6$abc3jui17t*r33t10?qwe31nm19jj21da"};
  59.     int t[20],i,n;
  60.     FILE *fp;
  61.     if((fp=fopen("data.dat","w"))==NULL)
  62.     {
  63.         printf("File open error\n");
  64.         exit(0);
  65.     }
  66.     n=abstract(s,t);
  67.     move(t,n);
  68.     for(i=0;i<n;i++)
  69.     {
  70.         printf("%d  ",t[i]);
  71.         fprintf(fp,"%d  ",t[i]);//这里有改动,t是个数组,循环要输出t[i]而不是t。
  72.     }
  73.     fclose(fp);
  74.     return 0;
  75. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
我是个汉子 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-1-10 18:03:53 | 显示全部楼层
boqianlv 发表于 2019-1-10 16:41
你好,代码的思路都在注释里了,有什么不懂的地方可以回复哦~

看懂了,我想了一个小时,就是没有把第二个函数写出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-10 18:25:34 | 显示全部楼层

  t[cnt++]=atoi(h);
这个是将atoi中的所有字符都给t吗?
如:atoi[]={"52"},将52转换成整型再赋值给t[0]吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-10 19:01:40 | 显示全部楼层
我是个汉子 发表于 2019-1-10 18:25
t[cnt++]=atoi(h);
这个是将atoi中的所有字符都给t吗?
如:atoi[]={"52"},将52转换成整型再赋值给t ...

是的,不过,应该写成(atoi("52");)
另外,你第一个函数有个问题
应该是for(i=0;s[i];i++),s是数组的首地址,肯定不为0,就成了死循环。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-10 19:47:49 | 显示全部楼层
boqianlv 发表于 2019-1-10 19:01
是的,不过,应该写成(atoi("52");)
另外,你第一个函数有个问题
应该是for(i=0;s;i++),s是数组的首 ...

哈哈,尴尬!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表