A. 数组分组
#include<iostream>
using namespace std;
int a;
void fgf(void){
int t=50/a,q=50%a,i;
for(i=1;i<=t;i++)cout<<(i-1)*a+1<<'-'<<i*a<<"为一组"<<endl;
if(q)cout<<50-q+1<<'-'<<50<<"为一组"<<endl;
}
void ysf (void){
int n=50/a+1;
for (int i=0; i<n; i++){
cout<<i+1;
for (int j=i+n+1;j<=50;){
cout<<','<<j;
j+=n;
}
cout<<"为一组\n";
}
}
void sjf(void){
srand(a);
int i,j,f[51]={0},l;
for(i=1;i<=50/a;i++){
l=rand()%50+1;
while(f[l]==1)l=rand()%50+1;
cout<<l;
f[l]=1;
for(j=2;j<=a;j++){
l=rand()%50+1;
while(f[l]==1)l=rand()%50+1;
f[l]=1;
cout<<','<<l;
}
cout<<"为一组"<<endl;
}
if(50%a){
l=rand()%50+1;
while(f[l]==1)l=rand()%50+1;
f[l]=1;
cout<<l;
for(j=50-50%a+2;j<=50;j++){
l=rand()%50+1;
while(f[l]==1)l=rand()%50+1;
f[l]=1;
cout<<','<<l;
}
cout<<"为一组"<<endl;
}
}
void work(void){
cout<<"请输入每组人数:"<<endl;
cin>>a;
cout<<"分法:\n分割法"<<endl;
fgf();
cout<<"分法:\n余数法"<<endl;
ysf();
cout<<"分法:\n随机法"<<endl;
sjf();
}
int main(){
work();
system("PAUSE");
return 0;
}
B. 求c语言程序,500行左右,要有详细注释。
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
typedef struct JOB
{
int hour;//用于存储输入的时
int min;//用于存储输入的分
int ID;//记录此作业的号
int requesttime;//存储作业所估计运行时间
int runtime;//作业周转时间
int cometime;//作业进入时间
int finishtime;//作业结束时间
int starttime;//作业开始时间
float runtime2;//带权周转时间
int prior;//响应比
}JOB;
float counttime1=0;//用于存储总的周转时间
float counttime2=0;//用于存储总的带权周转时间
int nowtime;
int flat=0;
int sign=0;
void insert(JOB [],JOB);
void FCFS();
void SJF();
void HRN();
void getprior(JOB a,int b);
int getmin(int i);
int gethour(int i);
int trans(int i,int j);
#define N 100
JOB job[N];
JOB wait[N];//用于SJF中存储等待的作业的时间
JOB job2[N];//由于在SJF中不好控制输出时按照作业序号的顺序输出,用一个数组存储
int co=0;
int jobnum;
void main()
{
int i;
printf("输入作业数:\n");
scanf("%d",&i);
jobnum=i;
FILE *fp;
fp = fopen("in.txt","rb");
if(fp == NULL)
{
printf("Can't open in.txt");
exit(0);
}
for(int j=0;j<i;j++)
{
fscanf(fp,"%d:%d %d",&job[j].hour,&job[j].min,&job[j].requesttime);
job[j].ID=j+1;
job[j].cometime=job[j].hour*60 + job[j].min;
printf("%d\n",job[j].requesttime);
}
printf("\n ================================");
printf("\n | 1:FCFS 2:SJF |");
printf("\n | 3:HRN |");
printf("\n ================================");
printf("\nPlease select a number from (1,2,3):");
scanf("%d",&i);
switch(i)
{
case 1: FCFS();break;
case 2: SJF();break;
case 3: HRN();break;
}
}
void FCFS()
{
printf("\n\n根据先来先服务算法:\n");
int k;
for(int i=0;i<jobnum-1;i++)//将作业数组按照进入时间先后排序。
{
k=i;
for(int j=i+1;j<jobnum;j++)
{
if(job[j].cometime<job[k].cometime) k=j;
}
if(k!=i)
{
JOB a;
a=job[k];
job[k]=job[i];
job[i]=a;
}
}
for(int i=0;i<jobnum;i++)
{
if(i==0)//如果是第一个任务
{
job[i].starttime=job[i].cometime;
job[i].finishtime=job[i].starttime+job[i].requesttime;
job[i].runtime=job[i].finishtime-job[i].cometime;
job[i].runtime2=(float)job[i].runtime/(float)job[i].requesttime;
counttime1+=job[i].runtime;
counttime2+=job[i].runtime2;
}
else
{
job[i].starttime=(job[i-1].finishtime>job[i].cometime ? job[i-1].finishtime : job[i].cometime);
job[i].finishtime=job[i].starttime+job[i].requesttime;
job[i].runtime=job[i].finishtime-job[i].cometime;
job[i].runtime2=(float)job[i].runtime/(float)job[i].requesttime;
counttime1+=job[i].runtime;
counttime2+=job[i].runtime2;
}
}
printf("作业 进入时间 估计运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
FILE *fp;
fp = fopen("FCFS.txt","w");
if(fp==NULL)
{
printf("Can't create file : SJF.txt\n");
exit(0);
}
fprintf(fp,"作业 进入时间 估计运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
for(int i=0;i<jobnum-1;i++)//将作业数组按照作业的ID排序
{
k=i;
for(int j=i+1;j<jobnum;j++)
if(job[j].ID<job[k].ID)
k=j;
if(k!=i)
{
JOB a;
a=job[k];
job[k]=job[i];
job[i]=a;
}
}
for(int i=0;i<jobnum;i++)
{
int a,b,c,d;
a=gethour(job[i].starttime);
b=getmin(job[i].starttime);
c=gethour(job[i].finishtime);
d=getmin(job[i].finishtime);
printf("JOB%d ",job[i].ID);
fprintf(fp,"JOB%d ",job[i].ID);
if(job[i].min==0)
{
printf("%d:%d0 ",job[i].hour,job[i].min);
fprintf(fp,"%d:%d0 ",job[i].hour,job[i].min);
}
else
{
printf("%d:%d ",job[i].hour,job[i].min);
fprintf(fp,"%d:%d ",job[i].hour,job[i].min);
}
printf("%11d ",job[i].requesttime);
fprintf(fp,"%11d ",job[i].requesttime);
if(b==0)
{
printf("%d:%d0 ",a,b);
fprintf(fp,"%d:%d0 ",a,b);
}
else
{
printf("%d:%d ",a,b);
fprintf(fp,"%d:%d ",a,b);
}
if(d==0){
printf("%d:%d0 ",c,d);
fprintf(fp,"%d:%d0 ",c,d);
}
else{
printf("%d:%d ",c,d);
fprintf(fp,"%d:%d ",c,d);
}
printf("%11d%11f\n",job[i].runtime,job[i].runtime2);
fprintf(fp,"%13d%13f\n",job[i].runtime,job[i].runtime2);
}
printf("【平均周转周期为:%f】\n【平均带权周转时间:%f】",(float)counttime1/jobnum,counttime2/jobnum);
fprintf(fp,"【平均周转周期为:%f】\n【平均带权周转时间:%f】",(float)counttime1/jobnum,counttime2/jobnum);
system("pause");
}
int trans(int i,int j)
{
return i*60 + j;
}
int gethour(int i)
{
return i/60;
}
int getmin(int i)
{
return i%60;
}
void SJF()
{
printf("\n\n根据短作业优先算法:\n");
int k;
for(int i=0;i<jobnum-1;i++)//将作业数组按照进入时间先后排序。
{
k=i;
for(int j=i+1;j<jobnum;j++)
{
if(job[j].cometime<job[k].cometime) k=j;
}
if(k!=i)
{
JOB a;
a=job[k];
job[k]=job[i];
job[i]=a;
}
}
int numbers=jobnum;
int realnum=jobnum;
for(int i=0;i<numbers;i++)
{
if(i==0)//假如是第一个,则直接进入cpu进行作业
{
job[i].starttime=job[i].cometime;
job[i].finishtime=job[i].starttime+job[i].requesttime;
job[i].runtime=job[i].finishtime-job[i].cometime;
job[i].runtime2=(float)job[i].runtime/(float)job[i].requesttime;
nowtime=job[i].finishtime;
counttime1+=job[i].runtime;
counttime2+=job[i].runtime2;
job2[co++]=job[i];
for(int u=0;u<jobnum-1;u++)//把第一个从job序列的移除
job[u]=job[u+1];
jobnum--;
int j=0;
while(job[j].cometime<=nowtime&&j<jobnum)//从剩余的job序列中获取正在等待的job,放进wait序列中
{
wait[flat++]=job[j++];
}
int i=0;
if(j!=0)//j!=0则表明已经从job序列中转移了job到wait序列中
{
while(j<jobnum)//将已经转移的job从job序列中移除
{
job[i]=job[j];
i++;
j++;
}
jobnum=i;
}
if(flat>1)//如果wait序列中不止一个等待作业
{
int r;
for(int x=0;x<flat-1;x++)//将等待数组按照估计运行时间先后排序。
{
r=x;
for(int y=x+1;y<flat;y++)
{
if(wait[y].requesttime<wait[r].requesttime)
r=y;
}
if(r!=x)
{
JOB a;
a=wait[r];
wait[r]=wait[x];
wait[x]=a;
}
}
}
}
else
{
if(flat==0)//如果wait序列中没有,即没有等待的序列,则将job序列中的第一个作业放入cpu进行运行
{
job[0].starttime=job[0].cometime;
job[0].finishtime=job[0].starttime+job[0].requesttime;
job[0].runtime=job[0].finishtime-job[0].cometime;
job[0].runtime2=(float)job[0].runtime/(float)job[0].requesttime;
nowtime=job[0].finishtime;
counttime1+=job[0].runtime;
counttime2+=job[0].runtime2;
job2[co++]=job[0];
for(int u=0;u<jobnum-1;u++)//将放入运行的作业从job序列中移除
job[u]=job[u+1];
jobnum--;
int j=0;
while(job[j].cometime<=nowtime&&j<jobnum)//从剩余的job序列中获取正在等待的job,放进wait序列中
{
wait[flat++]=job[j++];
}
int i=0;
if(j!=0)//j!=0则表明已经从job序列中转移了job到wait序列中
{
while(j<jobnum)
{
job[i]=job[j];
i++;
j++;
}
jobnum=j;
}
int r;
if(flat>1)//如果wait序列中不止一个等待作业
{
for(int x=0;x<flat-1;x++)//将等待数组按照估计运行时间先后排序。
{
r=x;
for(int y=x+1;y<flat;y++)
{
if(wait[y].requesttime<wait[r].requesttime) r=y;
}
if(r!=x)
{
JOB a;
a=wait[r];
wait[r]=wait[x];
wait[x]=a;
}
}
}
}
else//否则如果wait序列中有等待作业,则调用wait序列的第一个作业
{
wait[0].starttime=nowtime;
wait[0].finishtime=nowtime+wait[0].requesttime;
wait[0].runtime=wait[0].finishtime-wait[0].cometime;
wait[0].runtime2=(float)(wait[0].runtime)/(float)(wait[0].requesttime);
nowtime=wait[0].finishtime;
counttime1+=wait[0].runtime;
counttime2+=wait[0].runtime2;
job2[co++]=wait[0];
for(int i=0;i<flat;i++)//将wait序列的第一个作业从wait中移除
wait[i]=wait[i+1];
flat--;
int j=0;
while(job[j].cometime<=nowtime&&j<jobnum)//从剩余的job序列中获取正在等待的job,放进wait序列中
{
wait[flat++]=job[j++];
}
int i=0;
if(j!=0)//j!=0则表明已经从job序列中转移了job到wait序列中
{
if(j==1&&jobnum==1)//job序列中最后一个作业已经转移到wait中,则将jobnum自减一到0
jobnum--;
else
{
while(j<jobnum)//否则将已转移的作业从job中移除
{
job[i]=job[j];
i++;
j++;
}
jobnum=j;
}
}
int r;
if(flat>1)//如果wait里的等待序列多余一个,则进行重新排序
{
for(int x=0;x<flat-1;x++)//将等待数组按照估计运行时间先后排序。
{
r=x;
for(int y=x+1;y<flat;y++)
{
if(wait[y].requesttime<wait[r].requesttime)
r=y;
}
if(r!=x)
{
JOB a;
a=wait[r];
wait[r]=wait[x];
wait[x]=a;
}
}
}
}
}
}
printf("作业 进入时间 估计运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
FILE *fp;
fp = fopen("SJF.txt","w");
if(fp==NULL)
{
printf("Can't create file : SJF.txt\n");
exit(0);
}
fprintf(fp,"作业 进入时间 估计运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
for(int i=0;i<realnum-1;i++)//将作业数组按照作业的ID排序
{
k=i;
for(int j=i+1;j<realnum;j++)
if(job2[j].ID<job2[k].ID)
k=j;
if(k!=i)
{
JOB a;
a=job2[k];
job2[k]=job2[i];
job2[i]=a;
}
}
for(int i=0;i<realnum;i++)
{
int a,b,c,d;
a=gethour(job2[i].starttime);
b=getmin(job2[i].starttime);
c=gethour(job2[i].finishtime);
d=getmin(job2[i].finishtime);
printf("JOB%d ",job2[i].ID);
fprintf(fp,"JOB%d ",job2[i].ID);
if(job2[i].min==0)
{
printf("%d:%d0 ",job2[i].hour,job2[i].min);
fprintf(fp,"%d:%d0 ",job2[i].hour,job2[i].min);
}
else
{
printf("%d:%d ",job2[i].hour,job2[i].min);
fprintf(fp,"%d:%d ",job2[i].hour,job2[i].min);
}
printf("%11d ",job2[i].requesttime);
fprintf(fp,"%11d ",job2[i].requesttime);
if(b==0)
{
printf("%d:%d0 ",a,b);
fprintf(fp,"%d:%d0 ",a,b);
}
else
{
printf("%d:%d ",a,b);
fprintf(fp,"%d:%d ",a,b);
}
if(d==0){
printf("%d:%d0 ",c,d);
fprintf(fp,"%d:%d0 ",c,d);
}
else{
printf("%d:%d ",c,d);
fprintf(fp,"%d:%d ",c,d);
}
printf("%11d%11f\n",job2[i].runtime,job2[i].runtime2);
fprintf(fp,"%13d%13f\n",job2[i].runtime,job2[i].runtime2);
}
printf("【平均周转周期为:%f】\n【平均带权周转时间:%f】",(float)counttime1/realnum,counttime2/realnum);
fprintf(fp,"【平均周转周期为:%f】\n【平均带权周转时间:%f】",(float)counttime1/realnum,counttime2/realnum);
system("pause");
}
void HRN()
{
co=0;
printf("\n\n根据最高响应比优先算法:\n");
int k;
for(int i=0;i<jobnum-1;i++)//将作业数组按照进入时间先后排序。
{
k=i;
for(int j=i+1;j<jobnum;j++)
{
if(job[j].cometime<job[k].cometime) k=j;
}
if(k!=i)
{
JOB a;
a=job[k];
job[k]=job[i];
job[i]=a;
}
}
nowtime=job[0].cometime;
for(int i=0;i<jobnum;i++)
{
int j=i;
int xx=i;
while(j++<jobnum)//依次求得未完成的作业的优先级
job[j].prior=1+(float)(nowtime-job[j].cometime)/job[j].requesttime;
int k;
for(int i=xx;i<jobnum-1;i++)//将作业数组按照响应比由高到低排序。
{
k=i;
for(int j=i+1;j<jobnum;j++)
{
if(job[j].prior>job[k].prior) k=j;
}
if(k!=i)
{
JOB a;
a=job[k];
job[k]=job[i];
job[i]=a;
}
}
if(job[i].prior>=1)//有等待的则让等待的开始时间等于现在时间
job[i].starttime=nowtime;
else
job[i].starttime=job[i].cometime;//没有等待的作业的话就让下一次第一个进入的工作的时间当作其开始时间并且赋给当前时间
job[i].finishtime=job[i].starttime+job[i].requesttime;
job[i].runtime=job[i].finishtime-job[i].cometime;
job[i].runtime2=(float)job[i].runtime/job[i].requesttime;
nowtime=job[i].finishtime;
counttime1+=job[i].runtime;
counttime2+=job[i].runtime2;
job2[co++]=job[i];
}
printf("作业 进入时间 估计运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
FILE *fp;
fp = fopen("HRN.txt","w");
if(fp==NULL)
{
printf("Can't create file : SJF.txt\n");
exit(0);
}
fprintf(fp,"作业 进入时间 估计运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
for(int i=0;i<jobnum-1;i++)//将作业数组按照作业的ID排序
{
k=i;
for(int j=i+1;j<jobnum;j++)
if(job2[j].ID<job2[k].ID)
k=j;
if(k!=i)
{
JOB a;
a=job2[k];
job2[k]=job2[i];
job2[i]=a;
}
}
for(int i=0;i<jobnum;i++)
{
int a,b,c,d;
a=gethour(job2[i].starttime);
b=getmin(job2[i].starttime);
c=gethour(job2[i].finishtime);
d=getmin(job2[i].finishtime);
printf("JOB%d ",job2[i].ID);
fprintf(fp,"JOB%d ",job2[i].ID);
if(job2[i].min==0)
{
printf("%d:%d0 ",job2[i].hour,job2[i].min);
fprintf(fp,"%d:%d0 ",job2[i].hour,job2[i].min);
}
else
{
printf("%d:%d ",job2[i].hour,job2[i].min);
fprintf(fp,"%d:%d ",job2[i].hour,job2[i].min);
}
printf("%11d ",job2[i].requesttime);
fprintf(fp,"%11d ",job2[i].requesttime);
if(b==0)
{
printf("%d:%d0 ",a,b);
fprintf(fp,"%d:%d0 ",a,b);
}
else
{
printf("%d:%d ",a,b);
fprintf(fp,"%d:%d ",a,b);
}
if(d==0){
printf("%d:%d0 ",c,d);
fprintf(fp,"%d:%d0 ",c,d);
}
else{
printf("%d:%d ",c,d);
fprintf(fp,"%d:%d ",c,d);
}
printf("%11d%11f\n",job2[i].runtime,job2[i].runtime2);
fprintf(fp,"%13d%13f\n",job2[i].runtime,job2[i].runtime2);
}
printf("【平均周转周期为:%f】\n【平均带权周转时间:%f】",(float)counttime1/jobnum,counttime2/jobnum);
fprintf(fp,"【平均周转周期为:%f】\n【平均带权周转时间:%f】",(float)counttime1/jobnum,counttime2/jobnum);
system("pause");
}
作业调度
C. c语言中的输入流是什么意思
可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。就像水流是一串水组成的 计算机中的数据流就是由一串数据组成的东西。
C++的输入输出流及文件操作
1. C++保留C的输入输出单个字符的函数
(1) putchar(c) —— 字符输出
例程:
#include
using namespace std;
int main()
{
char a,b,c;
a='B'; b='O';c='Y';
putchar(a); putchar(b); putchar(c);putchar('/n');
putchar(66);putchar(79);putchar(89);putchar(10); //10是换行的ASCII码
return 0;
}
(2) getchar() ——字符输入函数
例程:
#include
using namespace std;
int main()
{
char c;
c=getchar();
putchar(c+32); //转化为小写字母,大小写之间包括[ / ] ^ - 、6个字符,因此不加26加32。'A'=65
putchar('/n');
return 0;
}
也可用cout来输出: cout<<(c=getchar()+32);
2. scanf()、printf()函数的输入和输出
scanf(格式控制,输出表列);
printf(格式控制,输出表列);
例程:
#include
using namespace std;
int main()
{
int a;
float b;
char c;
scanf("%d % c % f", &a,&c,&b);
printf("a=%d, b=%f, c=%c /n",a,b,c);
return 0;
}
3. 标准输入输出流cin、cout
包括头文件#include
输入输出流的控制符要加入头文件 #include
cout<<"dec:"<
cout.put(97); //显示a字符--使用cout的成员函数put(c)
cin成员函数get()
(1) 不带参数的
char c=cin.get(); //用cin的成员函数get()从键盘读入一个字符到c中去
(2) 带一个参数的
cin.get(ch); //从输入的流中接受一个字符,并赋给字符变量ch
(3) 带三个参数的
cin.get(字符数组,字符的个数n,终止字符)
例程:
#include
using namespace std;
int main()
{
char ch[20];
cout<<"in put a string:"<
cin.get(ch,10,'/n'); /*取得输入流的前10-1=9个字符赋值给ch数组的前9个元素,并规定换行符为为输入流的终止结束符*/
cout<
return 0;
}
如输入:1 2 34567890 //按换行键终止流输入
则输出:1 2 34567 //只读得前9个送入ch数组中
cin的成员函数getline() ——从输入流中读入一行字符
cin.getline(字符数组(或字符指针),字符的个数n,终止字符)
例程:
#include
using namespace std;
int main()
{
char ch[20];
cout<<"input a string:"<
cin>>ch;
cout<<"The string read with cin is:"<
cin.getline(ch,20,'/'); //读取19个字符到ch数组或遇到'/'结束
cout<<"The second part is:"<
cin.getline(ch,20); //读取19个字符到ch数组或遇到'/n'结束,遇到'/'仍作为字符读入
cout<<"The third part is:"<
return 0;
}
istream类的其他的成员函数如:eof(),在输入流中读取数据,如果到达末尾(遇到文件结束符),则eof()返回真,否则为假.
例程:
#include
using namespace std;
int main()
{
char c;
while(!cin.eof()) //若未遇到文件结束符
if((c=cin,get())!=' ') //检查读入的字符是否为空格字符
cout.put(c);
return 0;
}
4. 磁盘文件的打开和关闭
打开
ofstream outfile;
if(outfile.open("f1.data",ios::app)==0) // 打开
cout<<"打开失败!";
……………………
outfile.close(); //关闭
5. 文件写入
#include
#include
#include //一定不能少了,否则报错 error C2679
using namespace std;
int main()
{
string str;
ofstream out("d.txt",ios::out); //等价于ofstream out("d.txt")
if(!out) //若打开失败,out返回0值
{
cerr<<"打开失败!"<
exit(0);
}
str="床前明月光/n疑是地上霜/n举头望明月/n低头思故乡/n";
out< return 0;
}
6. 读文件到控制台
#include
#include
#include
using namespace std;
int main()
{
ifstream infile("d://new//d.txt",ios::in); //定义输入文件的流对象,以输入方式打开磁盘文件d.txt,第二个参数可去
if(!infile)
{
cerr<<"打开失败!"< exit(1);
}
for(string str;getline(infile,str);) //逐行打开并逐行显示,因此在循环中实现
cout< infile.close();
return 0;
}
或把 for(string str;getline(in,str);)
cout<
两句改为 string str;
while(getline(in,str))
cout<
7. 文件复制
#include
#include
#include
using namespace std;
int main()
{
ifstream in("d.txt");
if(!in)
{
cerr<<"打开源文件失败!"< exit(1);
}
ofstream out("b.txt");
if(!out)
{
cerr<<"打开目的文件失败!"< exit(1);
}
for(string str;getline(in,str);)
out< cout<<"文件复制成功!"<
in.close();
out.close();
return 0;
}
8. 自定义一个文件读入的函数 void display( char *filename)
#include
#include
#include
using namespace std;
void display(char *filename)
{
ifstream infile(filename,ios::in);
if(!infile)
{
cerr<<"打开失败!"< exit(1);
}
char ch;
while(infile.get(ch))
cout.put(ch);
cout< infile.close();
}
int main()
{
display("d.txt");
return 0;
}
9.关于文件读写的综合应用
#include
#include
using namespace std;
//从键盘读入字母并存入文件“d.txt”中
void save_to_file()
{
ofstream ofile("d.txt");
if(!ofile)
{
cerr<<"打开失败d.txt!"< exit(1);
}
char c[80];
cin.getline(c,80); //从键盘逐个读入一行字符
for(int i=0;c[i]!=0;i++) //对字符逐个处理,知道遇到'/n'结束
if(c[i]>=65 && c[i]<=90||c[i]>=97 && c[i]<=122)
{
ofile.put(c[i]); //将字母存入磁盘文件d.txt
cout< }
cout< ofile.close();
}
//将"d.txt"中的字母转化为大写字母并存入"out.txt"中
void get_from_file()
{
char ch;
ifstream infile("d.txt");
if(!infile)
{
cerr<<"打开失败d.txt!"< exit(1);
}
ofstream outfile("out.txt");
if(!infile)
{
cerr<<"打开失败out.txt!"< exit(1);
}
while(infile.get(ch)) //逐个读入字符成功后执行下面的语句
{
if(ch>=97 &&ch<=122)
ch=ch-32;
outfile.put(ch);
cout< }
cout< infile.close();
outfile.close();
}
int main()
{
save_to_file();
get_from_file();
return 0;
}
=========================== C/C++的字符或字符数组的读入函数总结=====================
1、cin
1、cin.get()
2、cin.getline()
3、getline()
4、gets()
5、getchar()
1、cin>>
用法1:最基本,也是最常用的用法,输入一个数字:
#include
using namespace std;
main ()
{
int a,b;
cin>>a>>b;
cout<}
输入:2[回车]3[回车]
输出:5
用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束
#include
using namespace std;
main ()
{
char a[20];
cin>>a;
cout<}
输入:jkljkljkl
输出:jkljkljkl
输入:jkljkl jkljkl //遇空格结束
输出:jkljkl
2、cin.get()
用法1: cin.get(字符变量名)可以用来接收字符
#include
using namespace std;
main ()
{
char ch;
ch=cin.get(); //或者cin.get(ch);
cout<}
输入:jljkljkl
输出:j
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<}
输入:jkl jkl jkl
输出:jkl jkl jkl
输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd (接收19个字符+1个'/0')
3、cin.getline() // 接受一个字符串,可以接收空格并输出
getline 会将换行符替换为空字符
#include
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout<}
输入:jkljkljkl
输出:jklj
接受5个字符到m中,其中最后一个为'/0',所以只看到4个字符输出;
如果把5改成20:
输入:jkljkljkl
输出:jkljkljkl
输入:jklf fjlsjf fjsdklf
输出:jklf fjlsjf fjsdklf
//延伸:
//cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)
//当第三个参数省略时,系统默认为'/0'
//如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk
当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:
#include
#include
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"/n请输入第"<cin.getline(m[i],20);
}
cout<for(int j=0;j<3;j++)
cout<<"输出m["<
}
请输入第1个字符串:
kskr1
请输入第2个字符串:
kskr2
请输入第3个字符串:
kskr3
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
4、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include”
#include
#include
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
5、gets() // 接受一个字符串,可以接收空格并输出,需包含“#include”
#include
#include
using namespace std;
main ()
{
char m[20];
gets(m); //不能写成m=gets();
cout<}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jkl jkl
输出:jkl jkl jkl
类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面:
#include
#include
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"/n请输入第"<gets(m[i]);
}
cout<for(int j=0;j<3;j++)
cout<<"输出m["<
}
请输入第1个字符串:
kskr1
请输入第2个字符串:
kskr2
请输入第3个字符串:
kskr3
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3
自我感觉gets()和cin.getline()的用法很类似,只不过cin.getline()多一个参数罢了;
这里顺带说明一下,对于本文中的这个kskr1,kskr2,kskr3 的例子,对于cin>>也可以适用,原因是这里输入的没有空格,如果输入了空格,比如“ks kr jkl[回车]”那么cin就会已经接收到3个字符串,“ks,kr,jkl”;再如“kskr 1[回车]kskr 2[回车]”,那么则接收“kskr,1,kskr”;这不是我们所要的结果!而cin.getline()和gets()因为可以接收空格,所以不会产生这个错误;
6、getchar() //接受一个字符,需包含“#include”
#include
#include
using namespace std;
main ()
{
char ch;
ch=getchar(); //不能写成getchar(ch);
cout<}
输入:jkljkljkl
输出:j
//getchar()是C语言的函数,C++也可以兼容,但是尽量不用或少用;
总结:
1.读入一行
gets(char a[]); //接受一行,遇回车结束
gets(m[i]) //可用于多维数组中
cin.get(char a[],int 5,'/n') //将字符数组a的前5个字符读入,遇到换行符结束;比如:a bc12ds,将会读入4个字符 a bc,外加一个'/0';
// 一般第三个参数不写,默认为'/0'
eg:
#include
#include
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<}
2.读入一个字符
getchar() //接受一个字符,需包含“#include”
char ch =getchar();
cin.get(char c) 或者 cin.get()
char ch=cin.get(); 或者cin.get(ch)
getline()和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
cin.getline(char a[],int 5,'/n') //将字符数组a的前5个字符读入,遇换行符结束;如:a bc12ds,将会读入4个字符 a bc,外加一个'/0';
// 一般第三个参数不写,默认为'/0'
cin.getline(m[i],20) //可用于多维数组中
getline() // 接受一个字符串,可以接收空格并输出,需包含“#include"
D. 急求 程序代码 c/c++ 操作系统中的 处理机调度算法
#include <iostream>
#include <stdio.h>
#include <string>
//#include <windows.h>
using namespace std;
//hyugtyftydrtdtrdrrtrdrt
struct Node
{
string name;//进程(作业)名称
int arriveTime;//到达时间
int ServerTime;//服务时间
int leftTime;//the left time
Node *link;//指向下一个节点的指针
};
class CProcess
{
public:
CProcess();//构造函数
~CProcess();//析构函数
const CProcess &operator =(const CProcess& p);//重载赋值操作符
void insertNode(string &na,int& at,int& st);//插入新元素(at由小到大)到链表合适的位置
void sort();//按照服务时间由大到小排序
bool isEmpty();//判断是否为空
void destroy();//销毁
int length();//求出链表长度
void print();//打印出元素
void FCFS();//先到先服务
void SJF();//短进程(作业)优先
void RR(int& q);//时间片轮转
void priority();//优先权调度
protected:
Node *first;
Node *last;
};
const CProcess& CProcess::operator=(const CProcess& p)
{
Node *newNode;
Node *Current;
if(this!=&p)//避免自己给自己赋值
{
if(first!=NULL)//如果链表不为空
destroy();
if(p.first==NULL)
{//如果要拷贝的对象为空
this->first = NULL;
this->last = NULL;
}
else
{
Current = p.first;
first= new Node;
first->name=Current->name;//
first->arriveTime=Current->arriveTime;
first->ServerTime=Current->ServerTime;
first->link =NULL;
last =first;
Current = Current->link;
while(Current!=NULL)
{
newNode = new Node;
newNode->name=Current->name;
newNode->arriveTime=Current->arriveTime;
newNode->ServerTime=Current->ServerTime;
newNode->link=NULL;
last->link=newNode;
last=newNode;
Current = Current->link;
}
}
}
return *this;
}
CProcess::CProcess()
{//构造函数
first=NULL;
last=NULL;
}
CProcess::~CProcess()
{
Node *temp;
while(first!=NULL)
{
temp=first;
first=first->link;
delete temp;
}
last=NULL;
}
void CProcess::insertNode(string &na,int& at,int& st)
{//按照到达时间升序排序
Node *Current;
Node *trailCurrent;//指向Current的前一个节点
Node *newNode;
bool found;
newNode = new Node;//建立一个新节点
newNode->name=na;
newNode->arriveTime=at;
newNode->ServerTime=st;
newNode->link=NULL;//
if(first==NULL)//如果第一个节点为空(如果是第一次插入元素)
first=newNode;//将新节点赋给第一个节点
else
{//如果不是第一次
Current =first;
found = false;
while(Current!=NULL && !found)
{
if(Current->arriveTime >= at)
found = true;
else
{
trailCurrent = Current;
Current = Current->link;
}
}
if(Current==first)
{
newNode->link = first;
first = newNode;
}
else
{
trailCurrent->link = newNode;
newNode->link = Current;
}
}
}
int CProcess::length()
{
int count =0;//声明变量,并初始化为0(用来记录长度)
Node *Current;
Current = first;
while(Current!=NULL)//当前节点不为空,记录值自加,一直向后遍历,
{
count++;
Current = Current->link;
}
return count;//返回长度
}
void CProcess::sort()//按照服务时间,升序排列
{//冒泡排序
string sname;
int at;
int st;
Node *Current;//指向当前节点
Node *trailCurrent;//指向当前节点的前一个节点
for(trailCurrent=first->link;trailCurrent!=NULL;trailCurrent=trailCurrent->link)//控制条件有问题
{
for(Current=trailCurrent->link;Current!=NULL;Current=Current->link)//控制条件有问题
{
if(trailCurrent->ServerTime > Current->ServerTime)
{
sname=trailCurrent->name;
at=trailCurrent->arriveTime;
st=trailCurrent->ServerTime;
trailCurrent->name=Current->name;
trailCurrent->arriveTime=Current->arriveTime;
trailCurrent->ServerTime=Current->ServerTime;
Current->name=sname;
Current->arriveTime=at;
Current->ServerTime=st;
}
}
}
}
bool CProcess::isEmpty()//判断是否为空
{
return (first==NULL);//如果第一个节点为空,返回值
}
void CProcess::print()
{
Node *Current;
Current = first->link;//头节点赋给当前节点
while(Current!=NULL)//当前节点不为空,一直向后遍历打印
{
cout<<Current->name<<" ";
cout<<Current->arriveTime<<" ";
cout<<Current->ServerTime<<"\n";
Current = Current->link;
}
}
void CProcess::destroy()
{
Node *temp;//定义一个临时指针变量
while(first!=NULL)
{
temp=first;
first=first->link;
delete temp;
}
last=NULL;
}
void CProcess::FCFS()//先到先服务
{
Node *Current;
int T0=0;//完成时间
int T1=0;//周转时间
Current = first->link;//头节点赋给当前节点
while(Current!=NULL)
{
if(T0 < Current->arriveTime)
{
T0=Current->arriveTime+Current->ServerTime;
T1=T0-Current->arriveTime;
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
else
{
T0=Current->ServerTime+T0;
T1=T0-Current->arriveTime;//周转时间等于,完成时间 - 到达时间
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
}
}
void CProcess::SJF()//短进程(作业)优先
{
//首先执行第一个到达的作业
Node *Current;
int T0=0;//完成时间
int T1=0;//周转时间
T0=first->link->ServerTime+T0;
T1=T0-first->link->arriveTime;
cout<<first->link->name<<"\t";
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
first->link=first->link->link;//删除
//执行剩下的
sort();//对剩下的排序
Current = first->link;//头节点赋给当前节点
while(Current!=NULL)
{
if(T0 < Current->arriveTime)
{
T0=Current->arriveTime+Current->ServerTime;
T1=T0-Current->arriveTime;
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
else
{
T0=Current->ServerTime+T0;
T1=T0-Current->arriveTime;//周转时间等于,完成时间 - 到达时间
cout<<Current->name<<"\t";//打印出进程名
cout<<T0<<"\t";//打印出完成时间
cout<<T1<<"\n";//打印出周转时间
Current = Current->link;
}
}
}
void CProcess::RR(int& q)//时间片轮转
{
cout<<"时间片轮转操作完成!\n";
}
void CProcess::priority()//优先权调度
{
cout<<"优先权操作完成!\n";
}
void main()
{
CProcess p0,p1,p2,p3,p4;
int at,st;
string na;
int judge=1;//控制退出程序
int choice;//控制选择操作
while(judge)
{
cout<<"********************************************************\n";
cout<<"****** 说明:本程序适用于单道进程(作业) ******\n";
cout<<"******** 请选择您的操作 ***************\n";
cout<<"*********输入相应的数字,按下(Enter)键!**************\n";
cout<<"************* 5.录入信息 ************\n";
cout<<"************* 1.先到先服务 ************\n";
cout<<"************* 2.短进程(作业)优先 ************\n";
cout<<"************* 3.时间片轮转 ************\n";
cout<<"************* 4.优先权(静态)调度 ************\n";
cout<<"************* 0.退出程序 ************\n";
cout<<"********************************************************\n";
cin>>choice;
switch(choice)
{
case 0:
judge=0;
break;
case 5:
cout<<"请输入信息以“end”结束输入!\n";
cout<<"进程名 到达时间 服务时间"<<endl;
while(na.compare("end"))//如果相等则会返回0
{
p0.insertNode(na,at,st);
cin>>na>>at>>st;
}
cout<<"录入成功,目前的信息为:\n";
cout<<"进程名 到达时间 服务时间"<<endl;
p0.print();
break;
case 1://先到先服务
p1=p0;//拷贝一份
if(p1.isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"先到先服务\n";
cout<<"进程名 完成时间 周转时间\n";
p1.FCFS();
break;
}
case 2://短作业优先
p2=p0;//拷贝一份
//p2.sort();
//p2.print();
if(p2.isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"短作业优先\n";
cout<<"进程名 完成时间 周转时间\n";
p2.SJF();
break;
}
case 3://时间片轮转
p3=p0;//拷贝一份
int q;
if(p3.isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"请输入时间片大小";
cin>>q;
cout<<"时间片轮转\n";
cout<<"进程名 完成时间 周转时间\n";
p3.RR(q);
break;
}
case 4://优先权
p4=p0;//拷贝一份
if(p4.isEmpty())
{
cout<<"请先录入信息\n";
break;
}
else
{
cout<<"时间片轮转\n";
cout<<"进程名 完成时间 周转时间\n";
p4.priority();
break;
}
default:
cout<<"请选择目录中的选项!\n";
break;
}
}
return;
}
E. 先来先服务调度算法。 优先级调度算法。 短作业优先调度算法 轮转调度算法 响应比高优先调度算法
你试一下
#include<stdio.h>
//using namespace std;
#define MAX 10
struct task_struct
{
char name[10]; /*进程名称*/
int number; /*进程编号*/
float come_time; /*到达时间*/
float run_begin_time; /*开始运行时间*/
float run_time; /*运行时间*/
float run_end_time; /*运行结束时间*/
int priority; /*优先级*/
int order; /*运行次序*/
int run_flag; /*调度标志*/
}tasks[MAX];
int counter; /*实际进程个数*/
int fcfs(); /*先来先服务*/
int ps(); /*优先级调度*/
int sjf(); /*短作业优先*/
int hrrn(); /*响应比高优先*/
int pinput(); /*进程参数输入*/
int poutput(); /*调度结果输出*/
void main()
{ int option;
pinput();
printf("请选择调度算法(0~4):\n");
printf("1.先来先服务\n");
printf("2.优先级调度\n");
printf(" 3.短作业优先\n");
printf(" 4.响应比高优先\n");
printf(" 0.退出\n");
scanf("%d",&option);
switch (option)
{case 0:
printf("运行结束。\n");
break;
case 1:
printf("对进程按先来先服务调度。\n\n");
fcfs();
poutput();
break;
case 2:
printf("对进程按优先级调度。\n\n");
ps();
poutput();
break;
case 3:
printf("对进程按短作业优先调度。\n\n");
sjf();
poutput();
break;
case 4:
printf("对进程按响应比高优先调度。\n\n");
hrrn();
poutput();
break;
}
}
int fcfs() /*先来先服务*/
{
float time_temp=0;
inti;
intnumber_schel;
time_temp=tasks[0].come_time;
for(i=0;i<counter;i++)
{
tasks[i].run_begin_time=time_temp;
tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;
tasks[i].run_flag=1;
time_temp=tasks[i].run_end_time;
number_schel=i;
tasks[number_schel].order=i+1;
}
return 0;
}
int ps() /*优先级调度*/
{
float temp_time=0;
inti=0,j;
intnumber_schel,temp_counter;
intmax_priority;
max_priority=tasks[i].priority;
j=1;
while((j<counter)&&(tasks[i].come_time==tasks[j].come_time))
{
if (tasks[j].priority>tasks[i].priority)
{
max_priority=tasks[j].priority;
i=j;
}
j++;
} /*查找第一个被调度的进程*/
/*对第一个被调度的进程求相应的参数*/
number_schel=i;
tasks[number_schel].run_begin_time=tasks[number_schel].come_time;
tasks[number_schel].run_end_time=tasks[number_schel].run_begin_time+tasks[number_schel].run_time;
tasks[number_schel].run_flag=1;
temp_time=tasks[number_schel].run_end_time;
tasks[number_schel].order=1;
temp_counter=1;
while (temp_counter<counter)
{
max_priority=0;
for(j=0;j<counter;j++)
{if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
if (tasks[j].priority>max_priority)
{
max_priority=tasks[j].priority;
number_schel=j;
}
} /*查找下一个被调度的进程*/
/*对找到的下一个被调度的进程求相应的参数*/
tasks[number_schel].run_begin_time=temp_time;
tasks[number_schel].run_end_time=tasks[number_schel].run_begin_time+tasks[number_schel].run_time;
tasks[number_schel].run_flag=1;
temp_time=tasks[number_schel].run_end_time;
temp_counter++;
tasks[number_schel].order=temp_counter;
}return 0;
}
int sjf() /*短作业优先*/
{
float temp_time=0;
inti=0,j;
intnumber_schel,temp_counter;
float run_time;
run_time=tasks[i].run_time;
j=1;
while((j<counter)&&(tasks[i].come_time==tasks[j].come_time))
{
if (tasks[j].run_time<tasks[i].run_time)
{
run_time=tasks[j].run_time;
i=j;
}
j++;
} /*查找第一个被调度的进程*/
/*对第一个被调度的进程求相应的参数*/
number_schel=i;
tasks[number_schel].run_begin_time=tasks[number_schel].come_time;
tasks[number_schel].run_end_time=tasks[number_schel].run_begin_time+tasks[number_schel].run_time;
tasks[number_schel].run_flag=1;
temp_time=tasks[number_schel].run_end_time;
tasks[number_schel].order=1;
temp_counter=1;
while (temp_counter<counter)
{
for(j=0;j<counter;j++)
{
if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
{run_time=tasks[j].run_time;number_schel=j;break;}
}
for(j=0;j<counter;j++)
{if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
if(tasks[j].run_time<run_time)
{run_time=tasks[j].run_time;
number_schel=j;
}
}
/*查找下一个被调度的进程*/
/*对找到的下一个被调度的进程求相应的参数*/
tasks[number_schel].run_begin_time=temp_time;
tasks[number_schel].run_end_time=tasks[number_schel].run_begin_time+tasks[number_schel].run_time;
tasks[number_schel].run_flag=1;
temp_time=tasks[number_schel].run_end_time;
temp_counter++;
tasks[number_schel].order=temp_counter;
}return 0;
}
int hrrn() /*响应比高优先*/
{ int j,number_schel,temp_counter;
float temp_time,respond_rate,max_respond_rate;
/*第一个进程被调度*/
tasks[0].run_begin_time=tasks[0].come_time;
tasks[0].run_end_time=tasks[0].run_begin_time+tasks[0].run_time;
temp_time=tasks[0].run_end_time;
tasks[0].run_flag=1;
tasks[0].order=1;
temp_counter=1;
/*调度其他进程*/
while(temp_counter<counter)
{
max_respond_rate=0;
for(j=1;j<counter;j++)
{
if((tasks[j].come_time<=temp_time)&&(!tasks[j].run_flag))
{respond_rate=(temp_time-tasks[j].come_time)/tasks[j].run_time;
if (respond_rate>max_respond_rate)
{
max_respond_rate=respond_rate;
number_schel=j;
}
}
} /*找响应比高的进程*/
tasks[number_schel].run_begin_time=temp_time;
tasks[number_schel].run_end_time=tasks[number_schel].run_begin_time+tasks[number_schel].run_time;
temp_time=tasks[number_schel].run_end_time;
tasks[number_schel].run_flag=1;
temp_counter+=1;
tasks[number_schel].order=temp_counter;
}
return 0;
}
int pinput() /*进程参数输入*/
{ int i;
printf("please input the processcounter:\n");
scanf("%d",&counter);
for(i=0;i<counter;i++)
{printf("******************************************\n");
printf("please input the process of %d th :\n",i+1);
printf("please input the name:\n");
scanf("%s",tasks[i].name);
printf("please input the number:\n");
scanf("%d",&tasks[i].number);
printf("please input the come_time:\n");
scanf("%f",&tasks[i].come_time);
printf("please input the run_time:\n");
scanf("%f",&tasks[i].run_time);
printf("please input the priority:\n");
scanf("%d",&tasks[i].priority);
tasks[i].run_begin_time=0;
tasks[i].run_end_time=0;
tasks[i].order=0;
tasks[i].run_flag=0;
}
return 0;
}
int poutput() /*调度结果输出*/
{
int i;
float turn_round_time=0,f1,w=0;
printf("name number come_time run_timerun_begin_time run_end_time priority order turn_round_time\n");
for(i=0;i<counter;i++)
{
f1=tasks[i].run_end_time-tasks[i].come_time;
turn_round_time+=f1;
w+=(f1/tasks[i].run_time);
printf(" %s, %d, %5.3f, %5.3f, %5.3f, %5.3f, %d, %d,%5.3f\n",tasks[i].name,tasks[i].number,tasks[i].come_time,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].priority,tasks[i].order,f1);
}
printf("average_turn_round_timer=%5.2f\n",turn_round_time/counter);
printf("weight_average_turn_round_timer=%5.2f\n",w/counter);
return 0;
}
F. 纠错:C语言:删除重复字符。
没注释, 还不如重新写一个
#include<stdio.h>
#include<stdlib.h>
intmain()
{
charLetter[80];//用于接收输入字符串
intresult[128]={0};//相当于一张空的ASCII码表
gets(Letter);
intsize=strlen(Letter);
inti,j=0;
for(i=0;i<size;i++)//该循环好比
{//字符串中的每个字符在空ASCII码表中打勾
result[Letter[i]]=1;
}
memset(Letter,'