鱼C论坛

 找回密码
 立即注册
查看: 1318|回复: 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
你好,代码的思路都在注释里了,有什么不懂的地方可以回复哦~
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>

int abstract(char s[],int t[])
{
/**********Program**********/
    int i,j=0,k=0,m=1,sum=0,cnt=0;
    for(i=0; s[i]; i++)
    {
        char h[10]={0};
        if(s[i]>='0'&&s[i]<='9')j=i;//j为定位用,定位到第一个数字出现的位置。
        while(s[j]>='0'&&s[j]<='9')
        {
            h[k++]=s[j++];          //从j位置开始找,找到不是数字的字符位置,这之间所有的数字赋值到另一个字符串中
        }
        h[k]=0;
        if(h[0]){
            t[cnt++]=atoi(h);       //把这个字符串转换为数字(也可以用循环转换,这里为方便使用了函数)
            i=j;                    //我们把i定位到数字最后一位的后一位,没有这句话,例如扫到了11,会把后边的1也扫进去。
        }
        k=0;                        //用来存储新的数字
    }
    return cnt;
    /**********  End  **********/
}
void move( int t[], int n)
{
/**********Program**********/
    int i=0,j=0,k,flag=1,m=n;
    for(i=0;i<n;i++)
    {
        //判断素数的算法
        flag=1;
        for(j=2;j<=sqrt(t[i]);j++)
        {
            if(t[i]%j==0)
                flag=0;
        }
        //解释下为什么下面用m,我的意思是把这个素数后面的都往左挪,那么肯定要从这个素数的位置扫到最后一位。
        //n--的原因是后边已经移动完的素数就不用再移动了。就是从0-n开始扫。没有这句话会重复扫已经扫过的素数,已经排好的素数就乱了顺序。
        //总结:n是检测素数用,m是移动素数用。
        if(flag)
        {
            int temp=t[i];
            for(k=i;k<m-1;k++)
            {
                t[k]=t[k+1];
            }
            t[m-1]=temp;
            i=0;n--;
        }
    }
/**********  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[i]);//这里有改动,t是个数组,循环要输出t[i]而不是t。
    }
    fclose(fp);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-9 19:23:13 | 显示全部楼层
没人吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int abstract(char s[],int t[])
{
/**********Program**********/
    int i,j=0,k=0,m=1,sum=0,cnt=0;
    for(i=0; s[i]; i++)
    {
        char h[10]={0};
        if(s[i]>='0'&&s[i]<='9')j=i;//j为定位用,定位到第一个数字出现的位置。
        while(s[j]>='0'&&s[j]<='9')
        {
            h[k++]=s[j++];          //从j位置开始找,找到不是数字的字符位置,这之间所有的数字赋值到另一个字符串中
        }
        h[k]=0;
        if(h[0]){
            t[cnt++]=atoi(h);       //把这个字符串转换为数字(也可以用循环转换,这里为方便使用了函数)
            i=j;                    //我们把i定位到数字最后一位的后一位,没有这句话,例如扫到了11,会把后边的1也扫进去。
        }
        k=0;                        //用来存储新的数字
    }
    return cnt;
    /**********  End  **********/
}
void move( int t[], int n)
{
/**********Program**********/
    int i=0,j=0,k,flag=1,m=n;
    for(i=0;i<n;i++)
    {
        //判断素数的算法
        flag=1;
        for(j=2;j<=sqrt(t[i]);j++)
        {
            if(t[i]%j==0)
                flag=0;
        }
        //解释下为什么下面用m,我的意思是把这个素数后面的都往左挪,那么肯定要从这个素数的位置扫到最后一位。
        //n--的原因是后边已经移动完的素数就不用再移动了。就是从0-n开始扫。没有这句话会重复扫已经扫过的素数,已经排好的素数就乱了顺序。
        //总结:n是检测素数用,m是移动素数用。
        if(flag)
        {
            int temp=t[i];
            for(k=i;k<m-1;k++)
            {
                t[k]=t[k+1];
            }
            t[m-1]=temp;
            i=0;n--;
        }
    }
/**********  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[i]);//这里有改动,t是个数组,循环要输出t[i]而不是t。
    }
    fclose(fp);
    return 0;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

看懂了,我想了一个小时,就是没有把第二个函数写出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  t[cnt++]=atoi(h);
这个是将atoi中的所有字符都给t吗?
如:atoi[]={"52"},将52转换成整型再赋值给t[0]吗?
想知道小甲鱼最近在做啥?请访问 -> 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,就成了死循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈,尴尬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 04:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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