到底是要C还是C++啊
另外题目要求有些矛盾啊,开始说的是这些数据已经在指定文件里了,怎么到后面又要求文件是动态创建呢???动态创建文件,那数据从哪里来?
运行结果:
代码:
#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;
}
仅供参考!谢谢!