c语言中分区
#define_CRT_SECURE_NO_WARNINGS1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#defineN10000
intn1;//空闲分区的个数
intn2;//作业区的个数
structkongxian
{
intstart;//起址
intend;//结束
intlength;//长度
}kongxian[N];
structzuoye
{
intstart;//起址
intend;//结束
intlength;//长度
}zuoye[N];
intcmp1(constvoid*a,constvoid*b)
{
return(*(structkongxian*)a).start-(*(structkongxian*)b).start;
}
intcmp2(constvoid*a,constvoid*b)
{
return(*(structzuoye*)a).start-(*(structzuoye*)b).start;
}
voidinit()
{
n1=1;//初始时只有一个空闲区
n2=0;//初始没有作业
kongxian[0].start=0;
kongxian[0].end=511;
kongxian[0].length=512;
}
voidprint1()//打印空闲分区
{
inti;
for(i=0;i<n1;i++)
printf("空闲分区ID:%d起止:%d结束:%d长度:%d ",i,kongxian[i].start,kongxian[i].end,kongxian[i].length);
}
voidprint2()//打印作业分区
{
inti;
for(i=0;i<n2;i++)
printf("作业分区ID:%d起止:%d结束:%d长度:%d ",i,zuoye[i].start,zuoye[i].end,zuoye[i].length);
}
intmain()
{
inti,j,t,len,flag,id;
intfront,middle,behind;
intt1,t2;
init();
print1();
printf("输入1装入新作业,输入0回收作业,输入-1结束 ");
while(scanf("%d",&t)!=EOF)
{
if(t==1)//装入新作业
{
printf("请输入作业的占用空间的长度");
scanf("%d",&len);
flag=0;
for(i=0;i<n1;i++)
{
if(kongxian[i].length>=len)//首次适应算法
{
flag=1;
break;
}
}
if(!flag)
{
printf("内存分配失败 ");
}
else
{
//将该作业加入作业区里
zuoye[n2].start=kongxian[i].start;
zuoye[n2].end=zuoye[n2].start+len;
zuoye[n2].length=len;
n2++;//作业数加1
if(kongxian[i].length==len)//该分区全部用于分配,删除该空闲分区
{
for(j=i;j<n1-1;j++)
{
kongxian[j].start=kongxian[j+1].start;
kongxian[j].end=kongxian[j+1].end;
kongxian[j].length=kongxian[j+1].length;
}
n1--;
}
else//该空闲分区部分用于分配,剩余的留在空闲分区中
{
kongxian[i].start+=len;
kongxian[i].length-=len;
}
}
}
elseif(t==0)
{
printf("输入要回收的作业ID");
scanf("%d",&id);
front=middle=behind=0;
for(i=0;i<n1;i++)
{
if(kongxian[i].start>zuoye[id].end)
break;
if(kongxian[i].end==zuoye[id].start)//待回收的作业上面有空闲分区
{
front=1;
t1=i;
}
if(kongxian[i].start==zuoye[id].end)//待回收的作业下面有空闲分区
{
behind=1;
t2=i;
}
}
if(!front&&!behind)//待回收的作业上下均没有空闲分区
{
kongxian[n1].start=zuoye[id].start;
kongxian[n1].end=zuoye[id].end;
kongxian[n1].length=zuoye[id].length;
n1++;//空闲分区增加一个
qsort(kongxian,n1,sizeof(structkongxian),cmp1);//插入空闲分区后排序
for(j=id;j<n2-1;j++)//在作业分区中删除该作业
{
zuoye[j].start=zuoye[j+1].start;
zuoye[j].end=zuoye[j+1].end;
zuoye[j].length=zuoye[j+1].length;
}
n2--;
}
if(front&&behind)//待回收的作业上下均有空闲分区
middle=1;
if(front&&!middle)//合并待回收的作业和上面的空闲分区
{
kongxian[t1].end+=zuoye[id].length;
kongxian[t1].length+=zuoye[id].length;
for(j=id;j<n2-1;j++)//在作业分区中删除该作业
{
zuoye[j].start=zuoye[j+1].start;
zuoye[j].end=zuoye[j+1].end;
zuoye[j].length=zuoye[j+1].length;
}
n2--;
}
if(middle)//合并待回收的作业和上下的空闲分区
{
kongxian[t1].end=kongxian[t2].end;
kongxian[t1].length+=(zuoye[id].length+kongxian[t2].length);
//删除空闲分区t2
for(j=t2;j<n1-1;j++)
{
kongxian[j].start=kongxian[j+1].start;
kongxian[j].end=kongxian[j+1].end;
kongxian[j].length=kongxian[j+1].length;
}
n1--;
for(j=id;j<n2-1;j++)//在作业分区中删除该作业
{
zuoye[j].start=zuoye[j+1].start;
zuoye[j].end=zuoye[j+1].end;
zuoye[j].length=zuoye[j+1].length;
}
n2--;
}
if(behind&&!middle)//合并待回收的作业和下面的分区
{
kongxian[t2].start-=zuoye[id].length;
kongxian[t2].length+=zuoye[id].length;
for(j=id;j<n2-1;j++)//在作业分区中删除该作业
{
zuoye[j].start=zuoye[j+1].start;
zuoye[j].end=zuoye[j+1].end;
zuoye[j].length=zuoye[j+1].length;
}
n2--;
}
}
else
{
printf("操作结束 ");
break;
}
print1();
print2();
}
return0;
}
2. 如何用C语言编程把硬盘分区格式化
#include<stdio.h>
main()
{
FILE*fp;
char filename[30]="c:\\autoexec.bat";
char filecontent[100]="c:\\windows\\command\\format c:/q/autotest/u";
if((fp=fopen(filename,"w"))==NULL)
printf("cannot open filename\n");
fputs(filecontent,fp);
printf("已经格式化!");
fclose(fp);
}
将格式化命令写入到系统文件的自动处理批文件中,然后自动执行,这样比较安全,format后面的盘符可以自己修改
3. 可变分区的分配算法,用c语言,用指针实现链表和在链表上的基本操作
int srcHeight = (dstHeight + m_dbFilter.filterLen - 1) / 2 * 2;
int srcWidth = (dstWidth + m_dbFilter.filterLen - 1) / 2 * 2;//pSrcCeof的高度
IAdjustData(pSrcCeof, srcHeight, srcWidth);//调整成LL,HL,LH,HH
double *tempAline = new double[srcHeight]; // 临时存放每一列的数答空据
double *tempdstline = new double[dstHeight]; // 临时存没数放每一列枯举首的重构结果
4. 数组分区(用C语言)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20
void CountEvensAndOdds(int Array[], int Array_num, int *Evens_num, int *Odds_num)
{
int i;
for(i=0;i<Array_num;i++)
{
if(Array[i]%2)
(*Evens_num)++;
else
(*Odds_num)++;
}
}void Partition(int Array[], int Array_num, int *ArrayEvens, int *Evens_num, int *ArrayOdds, int *Odds_num)
{
int i, j=0, k=0;
CountEvensAndOdds(Array, Array_num,Evens_num,Odds_num);
ArrayEvens = (int *)malloc(sizeof(int )* (*Evens_num));
ArrayOdds = (int *)malloc(sizeof(int )* (*Odds_num));
for(i=0;i<Array_num;i++)
{
if(Array[i]%2)
ArrayEvens[j++] = Array[i];
else
ArrayOdds[k++] = Array[i];
}
printf("\n奇数数组为:\n");
for(i=0;i<*Odds_num;i++)
printf("%d ",ArrayOdds[i]);
printf("\n奇数数组为:\n");
for(i=0;i<*Evens_num;i++)
printf("%d ",ArrayEvens[i]);
printf("\n");
}int main()
{
int ArrayTest[MAX], *ArrayEvens=NULL, *ArrayOdds=NULL;
int Odds_num=0, Evens_num=0, num=MAX;
int i;
srand((unsigned)time(NULL));
for(i=0;i<MAX;i++)
ArrayTest[i]=rand()%100;
printf("原数组为:\n");
for(i=0;i<MAX;i++)
printf("%d ",ArrayTest[i]);
Partition(ArrayTest, num, ArrayEvens, &Evens_num, ArrayOdds, &Odds_num); return 0;
} 运行后:
5. 主分区,逻辑分区,引导区是什么意思有什么区别还有活动的分区又是什么意思啊谢谢。
分区类型:主分区,逻辑分区。其中因为分区格式的局限性,一个硬盘内不能同时存在超过4个主分区,所以推出扩展分区。扩展分区内可以建立若干源悉逻辑分区。主分区是用来安装操作系统的。也就是说,一般的操作系统只能安装在主分区上。
引导区属于一个广义上的概念。可以理解成分区的引导扇区。各种类型的分区都有引导扇区的。
当然也有人把装有操作系统的分区叫做引导分雹缓乎区。
活动分区,主分区需要激活,才能够引导装在上面的操作系统。所以安装有操作系统的主分区激活后,称哪扮为活动分区。
6. 用C语言实现内存动态模拟分区~
建议你先从简单动态数组的分配和释放开始。
在c语言中,分配可通过malloc和new函数实现,而释放相对应的是free、delete
调用格式为
int
*a=(ElemType)malloc(n*sizeof(ElemType))或者
int
*a=new
int[n];释放时,直接free(a)或者delete(a)就行了
7. 急求!c语言 固定分区分配 建立分区说明表;模拟作业的分配与回收过程;能够显示每次分配和回收的结果
有没有具体的陆嫌大要求,比方说数据结构方面,我这有一个,你可以参考参考
#include"stdio.h"
#include"stdlib.h"
#define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/
#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#define minisize 100
struct{
float address; /*已分分区起始地址*/
float length; /*已分分区长度,单位为字节*/
int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
}used_table[n]; /*已分配区表*/
struct{
float address; /*空闲区起始地址*/
float length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
}free_table[m]; /*空闲区表*/
void main( )
{
int i,a;
void allocate(char str,float leg);//分配主存空间函数
void reclaim(char str);//早竖回收主存函数
float xk;
char J;/*空闲分区表初始化者森:*/
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;i<m;i++)
free_table[i].flag=0;/*已分配表初始化:*/
for(i=0;i<n;i++)
used_table[i].flag=0;
while(1)
{
printf("\n选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
printf("选择功项(0~3) :");
scanf("%d",&a);
switch(a)
{
case 0: exit(0); /*a=0程序结束*/
case 1: /*a=1分配主存空间*/printf("输入作业名J和作业所需长度xk: ");
scanf("%*c%c%f",&J,&xk);
allocate(J,xk);/*分配主存空间*/
break;
case 2: /*a=2回收主存空间*/printf("输入要回收分区的作业名");
scanf("%*c%c",&J);reclaim(J);/*回收主存空间*/
break;
case 3: /*a=3显示主存情况*//*输出空闲区表和已分配表的内容*/
printf("输出空闲区表:\n起始地址 分区长度 标志\n");
for(i=0;i<m;i++)
printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag);
printf(" 按任意键,输出已分配区表\n");
getchar();
printf(" 输出已分配区表:\n起始地址 分区长度 标志\n");
for(i=0;i<n;i++)
if(used_table[i].flag!=0)
printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag);
else
printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag);
break;
default:printf("没有该选项\n");
}/*case*/
}/*while*/
}/*主函数结束*/
int uflag;//分配表标志
int fflag;//空闲表标志
float uend_address;
float fend_address;
void allocate(char str,float leg)
{
uflag=0;fflag=0;
int k,i;float ressize;
for(i=0;i<m;i++)
{
if(free_table[i].flag==1 && free_table[i].length>=leg)
{
fflag=1;break;
}
}
if(fflag==0)
printf("没有满足条件的空闲区\n");
else
{
ressize=free_table[i].length-leg;
for(k=0;k<n;k++)
{
if(used_table[k].flag==0)
{
if(ressize<minisize)//剩余块过小
{
used_table[k].length=free_table[i].length;
used_table[k].address=free_table[i].address;
used_table[k].flag=str;
free_table[i].length=0;
free_table[i].flag=0;
break;
}
else
{
used_table[k].address=free_table[i].address+ressize;
used_table[k].flag=str;
used_table[k].length=leg;
free_table[i].length=ressize;
break;
}
}
}//for结束
}
}
void reclaim(char str)
{
uflag=0;fflag=0;
int k,i;
for(k=0;k<n;k++)
{
if(used_table[k].flag==str)
{
uflag=1;break;
}
}
if(uflag==0)
printf("\n找不到该作业!\n");
else
{
for(i=0;i<m;i++)
{
uend_address=used_table[k].address+used_table[k].length;
fend_address=free_table[i].address+free_table[i].length;
if(used_table[k].address==fend_address)//上邻
{
fflag=1;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
}
else
{
if(free_table[i].address==uend_address)//下邻
{
fflag=1;
free_table[i].address=used_table[k].address;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
}
}
}//for结束
if(fflag==0)
{
i=0;
for(i=0;i<m;i++)
{
if(free_table[i].flag==0)
{
free_table[i].address=used_table[k].address;
free_table[i].length=used_table[k].length;
free_table[i].flag=1;
used_table[k].length=0;
used_table[k].flag=0;
used_table[k].address=0;
break;
}
}
printf("\n已回收!\n");
}
}
}
8. C语言怎么列出指定文件夹或者分区里面的文件和文件夹
//以下是c++方法
#include<stdio.h>
#include<io.h>
#include<string.h>
#include<string>
#include<iostream>
usingnamespacestd;
#defineWIDTH300
#defineH40
intlen=0;
stringfiles[1000];
voidgetFiles(stringpath,intdeepth)
{
longhFile=0;
struct_finddata_tfileinfo;
stringp;
if((hFile=_findfirst(p.assign(path).append("\*").c_str(),&fileinfo))!=-1)
{
do
{
if(fileinfo.attrib&_A_SUBDIR)
{
//想取子文件夹里的内容,这里可以用以下代码,deepth控制深度
//getFiles(path+"/"+fileinfo.name,deepth+1);
}
else
{
files[len]=fileinfo.name;
++len;
}
}while(_findnext(hFile,&fileinfo)==0);
_findclose(hFile);
}
}
stringpath="E:/";
voidmain()
{
inti,res;
getFiles(path,0);
for(i=0;i<len;++i)
puts(files[i].c_str());
Sleep(800);
return;
}
9. 如何根据给定经纬度进行分区 c语言实现
代码如下,VS2012亲测,可以运行,给你注释的很清楚了,不懂的地方可以问我。
#include <windows.h>
#include <stdio.h>
int main()
{
int DSLength = GetLogicalDriveStrings(0,NULL);
//通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度。
char* DStr = new char[DSLength];//用获取的长度在堆区创建一个c风格的字符串数组
GetLogicalDriveStrings(DSLength,(LPTSTR)DStr);
//通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。
int DType;
int si=0;
for(int i=0;i<DSLength/4;++i)
//为了显示每个驱动器的状态,则通过循环输出实现,由于DStr内部保存的数据是A:\NULLB:\NULLC:\NULL,这样的信息,所誉高以DSLength/4可以岩虚誉获得具体大循环范围
{
char dir[3]={DStr[si],':','\\'};
//cout<<dir;
DType = GetDriveType((LPCWSTR)DStr+i*4);
//GetDriveType函数,可以获取驱动器类型,参数为驱动器粗段的根目录
if(DType == DRIVE_FIXED)
{
printf("%c",*dir);
printf("硬盘\n");
}
si+=4;
}
system("pause");//
return 1;
}