当前位置:首页 » 编程语言 » c语言sjf算法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言sjf算法

发布时间: 2022-11-27 20:32:17

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,'',80);//重置为空字符串
for(i=0;i<128;i++)//检索ASCII码表,逐个写入字符数组中
{
if(result[i]==1)//只要ASCII码表中打了勾的字符,就写入数组
{
Letter[j++]=i;
}
}
printf(" %s",Letter);
return0;
}

G. 关于学习c语言的问题

他说的没错 这本说的确很好 我也在学习这半书
我这里有点笔记是高手们学习c语言留下的 我想也许对你会有用
C程序入门
第一讲 语言的分类
一。低级语言:计算机语言,采用二进制进行编程,用户难度大,机器易识别。
二。汇编语言:(低级语言)采用简单的英文字母进行编程,用户稍意识别,计算机不能使被识别,需翻译。
汇编程序:将汇编语言译成机器语言。
反汇编语言:将机器语言译成汇编语言。
三。高级语言∶采用近于自然语言进行编程,用户易编程,计算机不能识别,需翻译,速度慢。
解释程序:整句翻译;
编译程序:整个程序翻译;
二,C语言的特点
1,C语言是一门中级语言
低级语言:直接访问硬件
高级语言:自然语言移植性较好
2,C是一门结构化程序设计语言
有属性,循环性,选择性
3,C有丰富的数据类型和运算符
数据类型:数据在计算机内的表现形式
基本数据类型:整型 实型 字符型
int float char
控制符:
%d 整型
%f 实型
%c 字符型
4,C语言的结束符为分号大括号为一个语句或函数范围
5,C语言的构成
#include<文件名。h>
#define 宏名 字符
main 主函数
①预处理(以#开头) (不属于C语言)
②书写主函数(。C)
一个C语言程序是与主函数构成,主函数有且只有一个,main。
可以有或没有子函数
执行程序
从子函数开始从左到右,从上倒下。
补充:
数制
一。含义
由一组数组成且按照一定的规则对数据进行管理的制度
二。分类
二进制 八进 十 十六
组成:
二:0 1
八:0--7
十:0--9
十六:0--9和a--f
权:根据位置不同,所表示的数值不同。表示:基数的n次幂(n从0开始)
基数:组成该数制的数字个数。
123
1*100+2*10+3*1
三。转换
1。十制数-->其它进制
规则:
整数:除以相应数制的基数然后除余倒排列。
小数:乘以相应数制的基数然后除整数正排列。
**当乘不尽时,保留前两位.
(13.5)10=(1101.1)2
2.其它进制-->十制数
规则:按权展开,相加求和.
(1101.167)8=(13.)10
3.其它进制
二<--->八
采用421算法
(001 011 011 010 101 110.001 101 011 100)2=(133256.1534)8
规则:从小数点开始向两侧每三个二进制位为一组,不足3位的,整数部分在前面补齐,小数部分在后面补齐,然后,对每一组按权展开相加求和.
八-->二
采用421反算法
将一个八进制位拆分3个二进制位.
(75462.5041)8=(111101100110010.101000100001)2
二-->十六
采用8421算法
规则:从小数点开始向两侧每四个二进制位为一组,不足4位的,整数部分在前面补齐,小数部分在后面补齐,然后,对每一组按权展开相加求和.
(1001 1110 1110 1100 1010.1101 1001 0100)2=(9eca)16
十六-->二
采用8421反算法
将一个十六进制位拆分4个二进制位.
(10afd)16=(10000101011111101)2
八<--->十六
借助二,十进制
第二讲 数据类型 常量 变量

一.数据类型:
数据在计算机内的表现形式
整型
基本数据 单精度
实型(浮点型)
双精度
字符型

结构体
构造类型 共用体
数组

指针型,空类型.
二.常量
<一>.含义,在程序招待过程中,其值不变的量.
<二>.使用形式
1.字面量.
s=2*P*r;
2.宏符号
#define X 3.141592627
int x;
<三>分类
整型常量 实型常量 字符型常量 字符串常量
A:整型常量
1.表示形式
八进制 十进制 十六进制(二进制不能表示整型常量)
2.书写格式
十进制:由0--9组成,不能以0开头.5 6
八进制:由0--7组成,必须以0开头.eg:05 07
十六进制:由0--9和a--f组成,必须以0x开头. 0x5 0xa 0xa01
3.分类,范围,空间,控制符
十进制:
-5 1111111111111111
5 0000000000000101

123
0 1 999
有符号 (signed) int x; %d -32768----32767
短整型(2B)
无符号 unsigned int x; %u 0----65535
有符号 (signed) long (int) x; %ld -2147483648----2147483647
长整型(4B)
无符号 unsigned long (int) x; %lu 0-----429......

八进制(无符号)
符合整数的定义规则 .
短无(2B): %o 0---0177777
长无(4B):%lo 0---037777777777
十进制(无符号)
符合整数的定义规则 .
短无(2B): %x 0---0xffff
长无(4B):%lx 0---0xffffffff
B:实型常量
1。表示形式
十进制 指数形式
2.十进制
由0--9组成,必须有小数点,小数点前面或后面有数据.
单精度:float %f 10(-38)----10(38) 4B
双精度:double %lf 10(-308)---10(308) 8B
3.指数形式
阶码标志:E(e)代表10
double x=1.23457e+3;
必须有阶码标志E(e),阶码标志前和后必须有数据,且前面是整数或实数,指数部分:必须是整数.
%e 与%f一致小数点后保留6位,且E也算一位
C:字符型常量
1.书写格式
由一对单引号括起的任意一个字符.
2.分类
ASCII码字符(共256个)
'a'---'z'[97--122] 'A'--'Z'[65--90] '0'---'9' [48--57]
ASCII码值:每个字符对应的十进制整数.(无符号) 0---255
main(){ char c; scanf("%c",&c); printf("%c",c-32);}
if(c>=97&&c<=122)
printf("%c is xiaoxie",c);
else if(c>='A'&&c<='Z')
printf("%c is da xie",c);
else if(c>='0'&&c<=57)
printf("%c is shuzi",c);
else
printf("%c is qita",c);
转义字符
书写格式:以\开头,用一对单引号括起一个或多个字符,但是表示是一个字符.
分类:
'\+字母':作用:主要控制光标.
'\n':光标回车换行.
'\t':光标跳到下一个制表位
'\r':光标回到行首
'\b':光标左退一列
printf("******\n*******");
'\+标点':作用:控制输出一个标点符号
'\'':输出一个单引号
'\"':输出一个双引号
'\\':输出一个反斜杠
'\+数字': 作用:表示一个ASCII码字符.
'\0ddd':八进制转义字符:最多三位八进制数*****0可以省略.
'\xdd':十六进制转义字符:最多二位十六进制数
'\0123' '\123'
'\xa1'
printf("%c",'\61');
3.范围(1B)
有符号:-128----127
无符号:0--255
char c=-5;
printf("%c",c);

D:字符串常量
书写格式:由一对双引号括起任意零个1个或多个字符。
字符串的长度:组成该字符串的字符个数。
字符串结束标志:'\0'
空间:串长度+1个空间.
控制:%s
char x[100];
scanf("%s",x);
printf("%s",x);
printf("%s","kdfjlkdsjfsdls");
printf("%s","zheng");
"":空串.
三.变量
1.其值在执行程序中可以改变的量.
2.定义格式
存储类型 数据类型 变量名1,变量名2,......变量名n;
int x,y,z;
存储类型:变量开辟空间的类型.
auto:(默认)自动型 该变量的默认值为随机值.
static:静态型 该变量的默认值为0值.
regiester:寄存器型 该变量的默认值为随机值.
extern:外部参照型 该变量的默认值为0值. (我们使用省略extern型)
static int x;
printf("%d",x);
aaa.prg
a1.c int x;
a2.c extern int x;
a3.c
int x;
main()
{
int x;
}
变量名:
a:多个变量之间用,隔开;
b:相同类型的变量可以写在同一个语句中;
int a,b,c;
c:变量命名
必须符合合法的用户标识符
标识符:用来表明或表示变量或函数的名字或类型的符号.
关键字:用来标识类型的标识符.(32个关键)
存储类型,数据类型,流程类 ,运算符类(sizeof)
标识符:由字母,数字,下划线组成,不能以数字开头,不能与关键字重名.
int if;
_a1;
1a
a 1;
main()
{
int x,X;
float x;
****不能与同一范围内的变量名重名.*****
3.给变量赋值.
通过两种:
赋值表达式: =
输入函数:scanf()
x=3;
scanf("%d",&x);
a:赋值表达式
格式: 变量名=表达式;
左边必须是变量名,右边赋值给左边,并将左边变量的值覆盖.当一个变量进行多次赋值时,该变量只能保留最一次所赋的值.
main()
{
int x;
x=2;
x=5;
scanf("%d",&x);
printf("%d",x);
getch();
}
int x,y,z;
x=2;
y=3;

z=x;
x=y;
y=z;

x=3;
y=2;
b:scanf()
格式:scanf("控制符",地址项)
scanf("%d%f%c",&x,&y,&z);
3. 数据类型之间转换(两个自动,一个强制)
a:在赋值时,右边数据的类型自动转换成左边变量的类型.
int x;
x=1.23;
float x;
x=10;
char c=65;
int x='a';
int x=32768;
printf("%d,%u",x,x);
b:运算时,数据类型低的转换成数据类型高的(占空间的字节数)
int x;
float y;
printf("%f ",x+y);
c:强制转换
格式:(数据类型)表达式
数据类型:将要转换成的类型
表达式:要转换的对象.
(float)x+y
(float)(x+y)
x+(float)y
float x=12.345,y;
y=x-(int)x;
printf("%f",x);
(int)x%2==0
第三讲 运算符及表达式
目:根据运算对象对运算符分为:单目,双目,三目.
表达式:简单和复杂表达式
简单:无运算连接的式子. 3 x (1)
复杂:有运算连接的式子. x+y x=3 x<y
一.算术运算符 +(正)-(负)+ - / * %
规则:
/ :当运算对象都为整数时,结果取整的.若其中一个为实型,结果为实型. 1/2.
%(取余/模):要求:运算对象必须为整型.
int x,y;
x%y
x=123
x%10;
x/10%10
x/100
表达式
式子的类型:与运算对象中占空间最大的一致.
优先级:正,负-->*/%-->+,-
结合性:单目:从右向左;双目:从左向右.
- - -5
x%2/y*z
二.赋值运算符 = += -= /= *= %=(自反赋值)
规则: s=5
自反赋值:左边和右边先按指定的运算符进行运算,然后再赋值给自己.*****左边必须先有值.
x=2;
x+=5
x=x+5;
表达式:
表达式的值与左边变量的值一致.
printf("%d",x=5);
结合性:从右向左
int x=3;
x+=x-=1;
三.关系运算符 < > <= >= == !=
规则:.
表达式的值:逻辑值,当判断成立时,得到逻辑值真值(用1表示),不成立时,得到逻辑值假值(用0表示)****因为C语言中没有逻辑型数据****
类型:整型.
int x,y;
x=3;
y=4;
printf("%d ",x<y);
c<='z'&&c>='a' 'z'>=x>='a'
优先级:< > <= >= -->== !=
结合性:从左向右
x>y>z x>y && x>z
四.逻辑运算符 &&(逻辑与) 双目 ||(逻辑或) 双目 !(逻辑非)单目
规则:
格式:表达式1&&/||表达式2
&&:表达式1和表达式2必须都为真值(非零值),整个逻辑与表达式才成立.产生逻辑值真值(用1表示)
如果表达式1或表达式2其中一个是假值(0值),整个逻辑与表达式不成立.产生逻辑值假值(用0表示)
x= x=5&&6<9;
||:表达式1或表达式2成立,则整个式子成立,产生真值(用1表示).若两个式子都为假值,整个逻辑或表达式为假(用0表示)
x>='a'||x<='z'
!:格式: !表达式
当表达式为真(非零值)值,逻辑非表达式为假(用0表示)
当表达式为假(零值)值,逻辑非表达式为真(用1表示)
x=!(4>5)
优先级:!-->&&-->||
x>='a'&&x<='z' || x>='A'&&x<='Z'
*********
&&:如果表达式1为假了,系统不对表达式2进行计算了
||:如果表达式1为真了,系统不对表达式2进行计算了
int x,y;
x=3;
y=4;
x= x<y&&!5;
x,y?
x=x>y||x=9
x,y?
对&&和||而言:不是按优先级计算,而是先计算表达式1,再计算表达式2.
结合性:单目:从右向左
双目:从左向右
! ! ! ! !5
表达式的值:逻辑值
类型:整型.
int x,y;
scanf("%
if(x>y)
五。自增/减运算符 ++ -- 单目
规则:
表达式++ 表达式-- 后缀表达式
++表达式 --表达式 前缀表达式
main()
{
int x;
x=2;
printf("%d",x++);
x=2;
printf("%d",++x);
}
变量的值:会自动的增/减1;
表达式的值:
后缀表达式:与变量改变之前值一致。
前缀表达式:会与变量的值一致增/减1;
表达式:
x++ x=x+1 x+=1
六。条件运算符( ? : )三目
规则:
表达式1?表达式2:表达式3
x>y?printf("%d",x):pritnf("%d",y);
int x,y;
w=x>y?x:y;
printf("%d",w);
int x,y;
if(x>y)
printf("%d",x);
else
printf("%d",y);
先计算表达式1,若产生非零值,则执行表达式2,并将表达式2的值作为整个条件表达式的值,若产生
零值,则执行表达式3,并将表达式3的值作为整个条件表达式的值(若执行表达式2,不执行表达式3)
int x,y,w;
x=5;
y=4;
w=x>y?x++:y++;
printf("%d,%d,%d",w,x,y);
if(x>y)
x++;
else
y++;
x,y?
优先级:
单目(++,--,-+!)-->算术双目-->关系-->逻辑运算-->条件-->赋值->逗号.
结合性:从右向左分出正确的表达式,从左向右计算.

?: ? ?: : ? :
w=x>y? x>z?x: z : y>z?y: z
3个
w,x,y,z
if(x>y)
if(x>z)
w=x;
else
w=z;
else
if(y>z)
w=y;
else
w=z;
七.逗号 , 双目
作用:分隔,运算符
格式:表达式1,表达式2
规则:从左向右算,取最后一个表达式的值为整个逗号表达式的值.
int x=5,y;
y=x++,--x,x,x+1,x;
x,x+1,x,(y=x++,++x);
y=(x++,--x,x,x+1,x);
printf("%d",(x,y));
第四讲 流程控制语句
顺序 循环 选择
一.选择语句
if..else 和 switch
作用:根据条件执行程序的某一部分.
A:if...else
1.格式
if(条件表达式)
{
语句组1;
}
else
{
语句组2;
}
注意:
a:if,else为关键字必须为小写.
b:条件表达式:一般写关系或逻辑表达式.
c:else可选项,{}当执行语句只有一句时,可以省略.
2.执行过程
首先计算条件表达式的值,若为非零值,则执行if分支,否则,若有else分支,则执行else,没有时,执行下面的其它语句.
3.嵌套
在if或else分支中又出现if..else语句.
a:在else中出现if..else
if( )
.....
else if( )
.....
else if( )
.....
else
......
b:在if分支中出现if...else
if1( )
if2( )
if3( )
if4( )
.....
else4
.....
else3
.....
else2
......
else1
........
c:在if和else中出现if...else
if( )
if( )
....
else
....
else
if( )
....
else
....
if(x%4==0&&x%100!=0||x%400==0)
if(x%4==0)
if(x%100==0)
if(x%400==0)
printf("run");
else
printf("ping");
else
run;
else
ping

if(x>y)
if(x>z)
w=x;
else
w=z;
else
if(y>z)
w=y;
else
w=z;
B:多开关语句switch
格式
switch(表达式)
{
case 常量表达式1:语句组1;[break;]
case 常量表达式2:语句组2;[break;]
case 常量表达式3:语句组3;[break;]
................n:.....n;[break;]
default :语句组n+1;
}
注意:
a:表达式的类型必须与常量表达式的类型一致.整型或字符型.
b: break;是可选项, 当遇到break表示该语句执行完毕.
c:default是可选项.{}不可省略.
d:同一个switch语句中,常量表达式的值不能重复.
int x,y;
char w;
scanf("%d%d%c",&x,&y,&w);
switch(w)
{
case '+':printf("%d",x+y);break;
case '*':printf("%d",x*y);break;
case '/':printf("%d",x/y);break;
case '-':printf("%d",x-y);break;
default:printf("wu ci yun suan fu");
}
2.执行过程
......
3.嵌套.
char c;
scanf("%c",&c);
switch(c>='a'&&c<='z')
{
case 0:switch(c>='A'&&c<='Z')
{
case 0:switch(c>='0'&&c<='9')
{
case 0:printf("qita");break;
case 1:pritnf("shuzi");break;
}break;
case 1:printf("daxie");break;
}break;
case 1:printf("xiaoxie");break;
}
二.循环语句
for while do...while
作用:根据条件重复执行程序的某一部分.
A:for语句
1.格式
for(表达式1;表达式2;表达式3)
{
循环体语句;
}
for(x=1;x<=10000;x++)
{
printf("%d",x);
}
注意:
a:表达式1:给循环变量赋初值
b:表达式2:决定是否应该进入循环的条件,一般为关系或逻辑表达式.
c:表达式3:给变量重新赋值.
d:{}可以省略.3个表达式均可省略.同时省略 for(;;)无限循环.
2.执行过程
首先执行表达式1给变量赋初值,然后再判断表达式2是否成立.若成立则进入循环体,当执行到}表示一次循环体执行完毕.再执行表达式3给变量赋新值,然后再判断表达式2是否成立.若成
立,再进入循环体,否则,表示该语句执行完毕.
1.求1---100和
2.接收10个实数,对小数部分求和.

B:while语句
a.格式
while(表达式)
{
循环体;
}
注意:{}当循环体只有一句时,可以省略.表达式与表达式2一样,但不能省略.while(1)===for(;;)无限循环.
for(i=1;i<=100;i++)
printf("%d",i);

int i;
i=1;
while(i<=100)
{
printf("%d",i++);
}
补充:
输入/出单个字符的函数.**必须预处理<stdio.h>
getchar()和putchar()
格式
变量名=getchar();
putchar(变量名/常量);
main()
{
char x;
scanf("%c",&x);
printf("%c",x);
x=getchar();
putchar(x);
}
C.do ...while
a:格式
do
{
循环体;
}while(表达式);
注意:
;{}均不可省略.先执行一次循环体,再判断表达式是否成立.
至少执行一次.

main()
{
int i;
i=1;
do
{
printf("%d",i);
}while(++i<=100);
D:嵌套
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
for(k=0;k<=59;k++)
{
printf("%d:%d:%d",i,j,k);
delay(1);
}
****
***
**
*
for(i=1;i<=4;i++)
{
for(j=1;j<=5-i;j++)
printf("*");
putchar('/n');
}

1!+2!+3!+4!+....n!
阶乘。
三.转移
break;
作用:只能用在循环体或switch语句中。
用在循环体中,为了终止其所在的循环体。
while(c!='*')
c=getchar();
if(c=='*')
break;
continue;
只能用在循环体中,提前结束本次循环体语句,而进入下一次循环体。

for(i=1;i<=100;i++)
{
if(i%2)
continue;
printf("%d",i);
}
***********************************************
数组前的笔记
+qq619740933,能帮你讲得尽量帮你讲明白

H. HRRN在c语言中的意思

在操作系统调度c语言中常用的作业调度算法。HRRN算法是FCFS和SJF的结合,克服了两种算法的缺点,该算法既考虑了作业的等待时间,又考虑了作业的运行时间。

I. SJF调度算法

SJF调度算法:最短作业优先算法SJF(Shortest Job First ),SJF算法以进入系统的作业所要求的CPU时间为标准,总选取估计计算时间最短的作业投入运行。

SJF 调度算法优缺点:算法易于实现。但效率不高,主要弱点是忽视了作业等待时间;会出现饥饿现象。SJF 调度算法可证明为最佳的,这是因为对于给定的一组进程, SJF 算法的平均等待时间最小。虽然 SJF 算法最佳,但是它不能在短期CPU 调度层次上加以实现。因为没有办法知道下一个 CPU 区间的长度。

SJF算法Gantt图:

进程 区间时间


PI 6


P2 8


P3 7


P4 3

进程 P1 的等待时间是 3 ms,进程P2的等待时间为 16 ms,进程P3的等待时间为 9ms,进程P4的等待时间为 0ms。因此,平均等待时间为(3 + 16 + 9 +0) / 4 = 7 ms。

J. 操作系统问题

一:
答:操作系统是计算机发展的必然产物。
从1950年至今,操作系统的发展主要经历了如下几个阶段:
1. 手工操作阶段-------无操作系统;
2. 批处理系统---------早期批处理、执行系统;
3. 操作系统形成---------批处理操作系统、分时操作系统、实时操作系统;
4. 现代操作系统---------个人计算机操作系统、网络操作系统、分布式操作系统
它是由客观的需要而产生,并随着计算机技术的发展和计算机应用的日益广泛而逐渐发展和完善的。它的功能由弱到强,在计算机中的地位也不断提高,以至成为系统的核心。研究操作系统的发展历程是用一种历史的观点去分析操作系统,总结操作系统从无到有,直到现代操作系统,经历了几个阶段,每个阶段采用的技术、获得的成就、解决的问题以及进一步发展出现的新问题,都便于从中体会操作系统产生的必然性。

二:
答:1:操作系统是一个大型的程序系统,它负责计算机系统软,硬件资源的分配和管理;控制和协调并发活动;提供用户接口,是用户获得良好的工作环境。
2:操作系统是重要的系统软件,只有配置了操作系统这一系统软件后,才使计算机系统体现出系统的完整性和可利用性。

三:
答:
批处理:引入批量监督程序是为了实现作业建立和作业过渡的自动化。监督程序是一个常驻主寸很小的核心代码;随着处理机速度的不断提高,处理机和I/O设备之间的速度差距形成了一对矛盾;为了克服这一缺点,在批处理系统中引入了脱机I/O技术而形成了脱机批处理系统。
批处理系统是在解决人机矛盾,中央处理器高速度和I/O设备的低速度这一矛盾的过程中发展起来的。
执行系统:借助于通道与中断技术,I/O工作可以在主机控制之下完成。这时,原有的监督程序不仅要负责调度过夜自动地运行,而且还要提供I/O控制功能,它增强了原有的功能。执行系统比拖机处理前进了一步,它节省了卫星机,降低了成本,而且同样能支持主机和通道,主机和外设的并行操作。在执行系统中用户程序的I/O工作是委托给系统实现的,由系统检查其命令的合法性,这就可以避免由于不合法的I/O命令造成对系统的威胁,从而提高系统的安全性,。

四:
答(1)多道:即计算机内存中同时年放几道相互独立的程序。
(2)宠观亡并行:同时进入系统的几进程序都处于运行过程中.即它们光后开始了各自
的运行,但都未运行完毕。
(3)微观上串行;从`微观上看,主寸中的多道程序轮流或分时地占有处理机,交替执行。
分时技术:(1调制性:即众害联机用户可以同时使用一台计算机;
2:由于配置的分时操作系统是采用时间片轮转的办法使一台计算机同时为许多终端用户服务的。因此,客观效果是这地用户彼此之间都感觉不到别人也在使用这台汁计算机.好象只有自己独占计算机一样,所以分时系统响应比较快。

五:
答:网络操作系统要求网络用户在使用网络资源时首先必须了解网络资源,网络用户必须知道网络中各个计算机的功能与配置、软件资源、网络文件结构等情况,在网络中如果用户要读一个共享文件时,用户必须知道这个文件放在哪一台计算机的哪一个目录下;分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。

六:教材26页第七题
(2)cpu有空闲等待现象,在程序b输入结束后,程序a还未输入,造成等待现象。
(3)运行是没有等待现象,因为系统有一个输入机两个打印机,所以没有等待现象。
七:
答:处理机的态就是处理机当前处于何种状态,正在执行哪种程序。为了保护操作系统,至少要区分两种状态:管态和用户态。
用户程序运行时,所需资源必须向操作系统提出请求,自己不能随意取用系统资源,这两类不同的程序(管理程序和用户程序)执行时应有不同的权限,为此根据对资源和机器指令的使用权限,将处理执行时的工作状态区分为不同的状态。

八:
答:中断是指某个时间发生时,系统终止现行程序的运行,引出处理时间程序对该事件进行处理,处理完毕后返回断点,继续执行。为了实现并发活动,为了实现计算机的自动化工作,系统必须具备处理中断能力。

九:
答:强迫性中断是由某种事故或外部请求信号所引起的,而自愿中断是由于运行程序请求操作系统服务而引起的,强迫性中断则不是。(I/O,外中断,机器故障中断,程序性中断属于强迫中断,而访问管理中断是属于自愿中断。中断是处理机外部事件引起的中断,俘获则是处理机内部引起的中断。在同时发生中断和俘获请求时,俘获总是优先得到响应和处理的。(UNIX系统中的中断和俘获及处理机制在小型机和微型机中具有代表性。)整个中断处理的功能是由硬件和软件配合完成的,硬件负责中断进入过程即发现和响应中断请求,把中断原因和断点记下来供软件处理查用,同时负责引出中断处理程序。而中断分析,中断处理,恢复被中断程序现场等工作则由软件的中断处理程序来完成。

十:
答:中断源:引起中断的事件是中断源。
中断装置:确保后继指令能正确执行的那些现场状态信息。
中断响应:实质是指交换指令执行地址的处理器状态,以达到保留程序断点及有关信息;并自动转入相应的中断处理程序执行。
向量中断:当中断发生时,由中断源引导处理机进入中断服务程序的中断过程。中断装置即发现中断源而产生中断过程的设备

十一:
答:不需要,因为当中断发生时,必须立即把现场信息保存在主存中(不同程序的现场一般保存在不同区域中),因此保存现场应该是中断进管后的第一件工作,因此应由硬件和软件共同承担,但两者承担多少则由具体机器而定。

十二:
答:不需要,为了确保被中断程序从恢复点继续运行,必须在该程序重新运行之前,报保留的该程序现场信息从主存中送至相应的指令计数器,通用寄存器或者一些特殊的寄存器,所以需要硬件和软件一起承担。

十三:
答:中断向量就是存储该类型中断的中断的中断服务例行程序的入口地址和处理器状态字的存储单元。系统中所有中断类型的中断向量放在一起,形成中断向量表。在中断向量表中,存放每一个中断向量的地址成为中断向量地址。在向量中断中,由于每一个终端有自己的中断向量,所以当发生某一中断事件时,可直接进入处理该事件的中断处理程序。

十四:
答:操作系统提供两个用户接口:
程序级:系统调用。
操作命令级:作业控制语言( 早期批处理操作 系统),键盘命令(交互式操作系统,分时操作系统为代表),图形用户接口(UNIX、WINDOWS)。

十五:
答:系统调用:系统调用是操作系统与用户的接口之一,用户在程序中使用系统调用请求操作系统的服务。(系统调用命令、进管指令、访管指令)。

十六:
答:系统调用是通过访管指令实现的。在程序中,如果希望请求操作系统的服务(例如,打开一个文件,显示某个目录的内容等),就要执行一条访管指令(trap、int),系统处理这个中断,即为用户提供相应的服务(或者称响应用户的请求)。