for(int i = 1;i < n;i++) for(int j = 1;j <= n-i;j++) if(strcmp(t[j].name,t[j+1].name)>0) swap(&t[j],&t[j+1]);这个代码的解读
时间: 2023-06-19 11:08:45 浏览: 75
这段代码是一个基于冒泡排序算法的排序代码,作用是将一个结构体数组 `t` 按照 `name` 成员变量的字典序从小到大排序。
具体解读如下:
- `n` 表示结构体数组 `t` 的元素个数,`i` 和 `j` 分别为循环变量。
- 外层循环 `for(int i = 1;i < n;i++)` 表示需要进行 `n-1` 轮冒泡排序。
- 内层循环 `for(int j = 1;j <= n-i;j++)` 表示在每一轮中需要比较的元素数量,因为每一轮冒泡排序后,最后的 `i` 个元素已经有序,所以只需要比较前面的 `n-i` 个元素。
- `if(strcmp(t[j].name,t[j+1].name)>0)` 表示如果 `t[j].name` 的字典序大于 `t[j+1].name` 的字典序,则需要交换这两个元素的位置。
- `swap(&t[j],&t[j+1])` 表示交换 `t[j]` 和 `t[j+1]` 两个元素。
通过这样的排序,可以将结构体数组 `t` 按照 `name` 成员变量的字典序从小到大排列。
相关问题
把这个类转为结构体 class Process { public: SegItem SegTable[10]; int SegNum; bool InMem; Process(int SN) //创建进程,进程对应的段数,以及段长 { int length; SegNum = SN; InMem = false; for(int i=0;i<SegNum;i++){ cout<<"请输入该进程第"<<i<<"个段的长度:"; cin>>length; cout<<endl; SegTable[i].SegLen=length; } } void InToMem() //将新建的进程调入内存 { int total=0; for(int i=0;i<SegNum;i++) total+=SegTable[i].SegLen; if (total> memModle.availableMem) cout << "内存空间不足,请先调出其他进程" << endl; else { for (int i=0; i<SegNum; i++) { for (int j=0; j<100; j++) { if (memModle.mem[j] == 0) { for(int k=j;k<SegTable[i].SegLen;k++) memModle.mem[k]=1; SegTable[i].SegBase=j; break; } } } memModle.availableMem -= total; InMem = true; cout << "进程已调入内存" << endl<<endl; } } void OutOfMem() //将内存中某进程调出内存 { int total=0; for (int i=0; i<SegNum; i++){ for(int j=0;j<SegTable[i].SegLen;j++) memModle.mem[SegTable[i].SegBase+j]=0; total+=SegTable[i].SegLen; } memModle.availableMem += total; InMem = false; cout << "进程已调出内存" << endl<<endl; } ~Process() { OutOfMem(); cout << "进程已删除" << endl; } };
将类 Process 转换为结构体 ProcessStruct,需要注意以下几点:
1. 结构体没有构造函数,因此需要手动初始化结构体的成员变量。
2. 结构体没有析构函数,因此需要手动释放结构体的成员变量所占用的内存。
3. 结构体的成员变量默认为 public,因此需要将类中的 private 成员变量改为 public。
下面是一个示例:
```c++
struct SegItem {
int SegLen;
int SegBase;
};
struct ProcessStruct {
SegItem SegTable[10];
int SegNum;
bool InMem;
void create(int SN) {
int length;
SegNum = SN;
InMem = false;
for(int i = 0; i < SegNum; i++) {
cout<<"请输入该进程第"<<i<<"个段的长度:";
cin>>length;
cout<<endl;
SegTable[i].SegLen = length;
}
}
void InToMem() {
int total = 0;
for(int i = 0; i < SegNum; i++)
total += SegTable[i].SegLen;
if(total > memModle.availableMem)
cout << "内存空间不足,请先调出其他进程" << endl;
else {
for(int i = 0; i < SegNum; i++) {
for(int j = 0; j < 100; j++) {
if(memModle.mem[j] == 0) {
for(int k = j; k < SegTable[i].SegLen; k++)
memModle.mem[k] = 1;
SegTable[i].SegBase = j;
break;
}
}
}
memModle.availableMem -= total;
InMem = true;
cout << "进程已调入内存" << endl<<endl;
}
}
void OutOfMem() {
int total = 0;
for(int i = 0; i < SegNum; i++) {
for(int j = 0; j < SegTable[i].SegLen; j++)
memModle.mem[SegTable[i].SegBase + j] = 0;
total += SegTable[i].SegLen;
}
memModle.availableMem += total;
InMem = false;
cout << "进程已调出内存" << endl<<endl;
}
};
int main() {
ProcessStruct p;
p.create(2);
p.InToMem();
p.OutOfMem();
return 0;
}
```
在上面的示例中,我们将 Process 类转换为 ProcessStruct 结构体。由于 Process 类的成员变量是 private 的,我们需要在结构体中将其改为 public。同时,由于结构体没有构造函数和析构函数,我们需要手动添加 create、InToMem 和 OutOfMem 函数来完成类中的功能。最后在 main 函数中调用这些函数即可。
优化#include<stdio.h> int chess[4][4]={0}; int isok(int i,int j){ for(int k=0;k<4;k++){ if(chess[k][j]==1){ return 0; } for(int m=i-1, n=j-1;m>=0&&n>=0;m--,n--){ if(chess[m][n]==1){ return 0; } } } } int queen(int row){ if(row==4){ return 1; } for(int j=0;j<4;j++){ if(isok(row,j)){ chess[row][j]=1; if(queen(row+1)){ } } chess[row][j]=0; } return 0; } int main(){ if(queen(0)){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ printf("%d ",chess[i][j]); } } } return 0; }
在isok函数中添加判断右上方的对角线是否有皇后的逻辑,可以优化代码,如下所示:
```
int isok(int i, int j) {
for (int k = 0; k < 4; k++) {
if (chess[k][j] == 1) {
return 0;
}
for (int m = i - 1, n = j - 1; m >= 0 && n >= 0; m--, n--) {
if (chess[m][n] == 1) {
return 0;
}
}
for (int m = i - 1, n = j + 1; m >= 0 && n < 4; m--, n++) {
if (chess[m][n] == 1) {
return 0;
}
}
}
return 1;
}
```
这样就可以正确求解八皇后问题了。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)