谁来帮我看看呐,抱拳了

img

img

img


abcdefghijklmnopqrstuvwxyzzbdefg

到底是要C还是C++啊
另外题目要求有些矛盾啊,开始说的是这些数据已经在指定文件里了,怎么到后面又要求文件是动态创建呢???动态创建文件,那数据从哪里来?

运行结果:

img

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

//读文件
int* readFile(int* nmb)
{
    int con_size = 10; //每次内存增加的大小
    int size = con_size; //申请内存的实际大小*sizeof(int)
    int* p = (int*)malloc(size * sizeof(int)); //内存初始大小
    int n = 0, tmp;
    FILE* fp = fopen("datafile01.dat", "r");
    if (fp == 0)
    {
        printf("文件打开失败!\n");
        free(p);
        p = 0;
        return 0;
    }
    //开始读文件
    while (!feof(fp))
    {
        if (fscanf(fp, "%d", &tmp) == 1)//读取成功
        {
            if (n >= size)
            {
                size += con_size;
                p = (int*)realloc(p, size*sizeof(int)); //重新分配内存
            }
            p[n] = tmp; //存入数组
            
            n++;

        }
    }
    
    *nmb = n;
    fclose(fp);
    return p; //返回指针
}

//冒泡排序
void bubblesort(int* p, int n)
{
    int i, j, t;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (p[j] > p[j + 1]) //升序排序
            {
                t = p[j];
                p[j] = p[j + 1];
                p[j + 1] = t;
            }
        }
    }
}


//求符合条件的个数
int ICntmin(int* p, int nmb)
{
    int i, cnt = 0;

    //先排序,再求满足条件的数据的个数
    bubblesort(p, nmb);

    for (i = 0; i < 20 && i < nmb; i++) //最小的前20个数,避免总数小于20,这里的条件用 && i<nmb
    {
        if (p[i] % 3 == 0 && p[i] % 5 == 0) //能被3和5整除
            cnt++;
    }
    return cnt;
}


//写文件
void write2File(int* p, int nmb, int cnt)
{
    FILE* fp = fopen("finaldata.dat", "w");
    int i;
    for (i = 0; i < 20 && i < nmb; i++)
    {
        fprintf(fp, "%d\n", p[i]);
    }
        
    //写入cnt
    fprintf(fp, "%d", cnt);
    fclose(fp);
}

int main()
{
    int cnt = 0; //满足条件的数据个数
    int nmb = 0; //文件中的数据数量
    int* p = 0; //内存指针
    p = readFile(&nmb);  //读文件
    cnt = ICntmin(p, nmb); //计算
    printf("满足条件的个数:%d\n", cnt);
    write2File(p,nmb,cnt);//写入文件
    return 0;

}

头文件代码:
文件名:ICmin.h


#ifndef _STDIO_H
#include <stdio.h>

//p指向从小到大并已经排好序的整数序列指针;
//num是取个数,本题是取20个,就按20传参。
//返回值是在这20个数中所求得能同时被3和5整除的个数
int INntmin(int *p,int num)
{
   int count=0;
   for(int i=0;i<num;i++) 
   {
       if(*(p+i)%3==0  &&  *(p+i)%5==0)
       {
           ++count;
       }   
   }

    return count;
}

#endif

主函数代码
注意文件路径请自行设定,我这里只是演示。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include"ICmin.h"
#define SWAP(a,b) int tmp=a;a=b;b=tmp


//排序
int sort(int *p,int num)
{
    for(int i=0;i<num-1;i++)
    {
        for(int j=i+1;j<num;j++)
        {
            if(*(p+i)>*(p+j))
            {
                SWAP( *(p+i),*(p+j) );
            }
        }
    }

    return 0;
}

int main(int argc, char** argv){
    FILE *fpin=fopen("/storage/emulated/0/Android/data/com.cjkj.clanide/files/CJ_IDE/CProject/网友作业001/bin/datafile01.dat","rb");
    FILE *fpout=fopen("/storage/emulated/0/Android/data/com.cjkj.clanide/files/CJ_IDE/CProject/网友作业001/bin/finaldata.dat","wb");
    if(!fpin || !fpout) return -1;
    
    int n=0; //初始化所需内存sizeof(int)*n
    
    rewind(fpin);
    
    char stmp[10];
    while(!feof(fpin))
    {     
        if(fscanf(fpin,"%s",stmp)==1)++n;
        else
            break;
    }

    //分配内存读入数据
    int *buf=(int *)malloc(sizeof(int)*n);
    if(!buf)return -1;

    rewind(fpin);
    //fseek(fpin,0,SEEK_SET);
    
    //从文件中读取数据存到动态内存区
    int z=0;
    while(!feof(fpin))
    {     
        if(fscanf(fpin,"%d",(buf+z++))!=1)break;       
    }
        
    //文件读入完毕关闭文件
    fclose(fpin);
    
    //排序
    sort(buf,n);
    
    //调用求出在最小的20个数当中能同时被3和5整除的个数
    int count=0;
    count=INntmin(buf,20);
    
    //读20个最小数据到finaldata.dat文件
    rewind(fpout);
    for(int i=0;i<20;i++)
    {
        fprintf(fpout,"%d\n",*(buf+i));
        fprintf(stdout,"%d\n",*(buf+i));
    }
    fprintf(fpout,"能被3和5同时整除的个数:%d\n",count);
    fprintf(stdout,"能被3和5同时整除的个数:%d\n",count);

    fclose(fpout);
    
    return 0;
}


仅供参考!谢谢!

img

img

img

img