关于#c++#的问题,请各位专家解答!


#include <iostream>
using namespace std;
int a[1005][1005], b[1005][1005], c[1005];

int main() {
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
for (int t = 1; t <= k; t++) {
if (j == b[a[i][j]][t])
break;
if (j != b[a[i][j]][t] && b[a[i][j]][t] == 0) {
b[a[i][j]][t] = j;
c[a[i][j]]++;
break;
}
}
}
for (int i = 1; i <= k; i++) {
cout << c[i] << " ";
}
return 0;
}

#include <iostream>
using namespace std;

int main() {
int n, m, k, a[1005][1005], b[1005][1005], c[1005];
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
for (int t = 1; t <= k; t++) {
if (j == b[a[i][j]][t])
break;
if (j != b[a[i][j]][t] && b[a[i][j]][t] == 0) {
b[a[i][j]][t] = j;
c[a[i][j]]++;
break;
}
}
}
for (int i = 1; i <= k; i++) {
cout << c[i] << " ";
}
return 0;
}

上述两端代码为什么执行结果不同?

把数组定义在函数外面,自动赋值成0,定义在main函数或者其他函数里面,自动赋值成随机数

主要是几个数组放在了全局还是函数里
这个二维数组需要大约4MB(一千乘以一千乘以四字节),可能造成堆栈不足,所以放在全局比较好。

因为数组太大会炸掉,所以得在全局定义。如果在内部的话,500x500好像不会炸

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7628344
  • 你也可以参考下这篇文章:考研复习之c++各种排序算法代码汇总
  • 您还可以看一下 夏曹俊老师的C++微服务架构及安全云盘项目实训课程中的 完成了客户端的文件上传指令处理小节, 巩固相关知识点
  • 除此之外, 这篇博客: #C++# 利用单链表输入成绩表,排序后输出(附单链表的基本操作)中的 代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    #include<iostream>
    using namespace std;
    
    struct Transcript
    {
    	char sNum[20];
    	char name[10];
    	double cScore;
    	double mScore;
    	double eScore;
    	double sum;
    	double averange;
    };
    
    struct Node
    {
    	Transcript tran;
    	Node *next;
    };
    
    typedef Node* LinkList;
    
    LinkList CreateFromHead()//  头插法建表 
    {
    	LinkList L;//  头指针 
    	Node *s; 
    	int flag=1;
    	Transcript x;
    	L=new Node;//  为头节点分配存储空间 
    	L->next=NULL;//  头节点指向空指针 
    	while(flag)
    	{
    		puts("Please enter the school number:");
    		cin>>x.sNum;
    		puts("Please enter the name:");
    		cin>>x.name;
    		puts("Please enter the Chinese score:");
    		cin>>x.cScore;
    		puts("Please enter the Math score:");
    		cin>>x.mScore;
    		puts("Please enter the English score:");
    		cin>>x.eScore;
    		x.sum=x.cScore+x.eScore+x.mScore;
    		x.averange=x.sum/3;
    		s=new Node;//  为新节点分配存储空间 
    		s->tran=x;//  为新节点数据域赋值
    		s->next=L->next;//  插入新指针 
    		L->next=s; 
    		puts("next?(1/0)");//  判断是否继续输入数据 
    		cin>>flag;
    	}
    	return L;
    }
    
    LinkList CreateFromTail()//  尾插法建表 //  未使用 
    {
    	LinkList L;//  头指针 
    	Node *r,*s;
    	int flag=1;
    	Transcript x;
    	L=new Node;//  为头节点分配存储空间
    	L->next=NULL;
    	r=L;//  r指针始终动态指向链表当前表尾结点
    	while(flag)
    	{
    		puts("Please enter the school number:");
    		cin>>x.sNum;
    		puts("Please enter the name:");
    		cin>>x.name;
    		puts("Please enter the Chinese score:");
    		cin>>x.cScore;
    		puts("Please enter the Math score:");
    		cin>>x.mScore;
    		puts("Please enter the English score:");
    		cin>>x.eScore;
    		x.sum=x.cScore+x.eScore+x.mScore;
    		x.averange=x.sum/3;
    		s=new Node;//  为新节点分配存储空间
    		s->tran=x;//  为新节点数据域赋值 
    		r->next=s;//  插入新节点 
    		r=s; 
    		r->next=NULL;//  尾节点指向空指针 
    		puts("Next?(1/0)");
    		cin>>flag;
    	} 
    	return L;
    }
    
    int InsList(LinkList L,int i,Transcript e)//  插入节点 //  未使用 
    {
    	int k=0;
    	Node *pre=L,*s;
    	while(pre!=NULL && k<i-1)//  搜索第i-1个节点,并保证第i-2个节点不为尾节点 
    	{
    		pre=pre->next;
    		k++;
    	}
    	if(pre==NULL)
    	{
    		puts("Unreasonable insertion!");
    		return 0;
    	}
    	s=new Node;//  为新节点分配存储空间
    	s->tran=e;//  为新节点数据域赋值 
    	s->next=pre->next;//  插入新节点 
    	pre->next=s;
    	return 1;
    }
    
    int DelList(LinkList L,int i,Transcript *e)//  删除节点 //  未使用 
    {
    	int k=0;
    	Node *pre=L,*r;
    	while(pre->next!=NULL && k<i-1)//  搜索第i-1个节点,并保证第i-1个节点不为尾节点 
    	{
    		pre=pre->next;
    		k++;
    	}
    	if(pre->next==NULL)
    	{
    		puts("Unreasonable deletion!");
    		return 0;
    	}
    	*e=pre->next->tran;
    	r=pre->next;//  删除r节点 
    	pre->next=r->next; 
    	delete r;//  释放被删除的r节点的内存空间 
    	return 1;
    }
    
    void Traver(LinkList p)//  遍历并输出链表 
    {
    	Node *s;
    	s=p->next;
    	while(s)
    	{
    		cout<<s->tran.sNum<<"\t"<<s->tran.name<<"\t"<<s->tran.cScore<<"\t"<<s->tran.mScore<<"\t"<<s->tran.eScore<<"\t"<<s->tran.sum<<"\t"<<s->tran.averange<<endl;
    		s=s->next;
    	}
    }
    
    void DesList(LinkList L)//  释放链表内存 
    {
    	Node *s=L,*r;
    	r=s->next;
    	while(r)
    	{
    		delete s;
    		s=r;
    		r=s->next;
    	}
    	delete s;
    }
    
    void order(LinkList L)//  链表排序 //  选择排序 
    {
    	Node *p,*q,*t;
    	Transcript x;
    	for(p=L->next;p->next!=NULL;p=p->next)//  设置比较趟数 //  遍历至倒数第二个节点 
    	{
    		t=p;
    		for(q=t->next;q!=NULL;q=q->next)//  搜索每趟中最大值 //  遍历至尾节点
    		{
    			if(t->tran.averange<q->tran.averange)  t=q;
    		}
    		if(t!=p)//  交换数据域 
    		{
    			x=p->tran;
    			p->tran=t->tran;
    			t->tran=x;
    		}
    	} 
    }
    
    int main()
    {
    	LinkList p;//头指针 
    	p=CreateFromTail();//  建表
    	order(p);//  排序 
    	Traver(p);//  遍历并输出 
    	DesList(p);//  释放内存 
    	return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^