|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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]
你好,代码的思路都在注释里了,有什么不懂的地方可以回复哦~
- #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;
- }
复制代码
|
|