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;
}