PAT (Basic Level) Practice 1021 个位数统计 (Program received signal SIGSEGV, Segmentation fault 解决方法)

乙级1021
啊

第一眼我还以为是背包问题(因为没学过背包有点害怕)后来仔细看了下发现这个比背包简单太多了

各个月饼有总重和总售价,在这里取单价,根据性价比最高的购买就好
对于每个月饼,可以用struct保存它的总价、单价、重量,再排序一下就好
注意格式输出,C的格式输出非常方便易用

代码实现:

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<stdlib.h>
using namespace std;
struct yb{
	double weight;
	double fullprice;
	double price;
}; 
int main(){
	int n;
	double d;
	cin>>n>>d;
	yb a[n];
	
	for(int i = 0;i<n;i++){
		cin>>a[i].weight;
	}
	
	for(int i = 0;i<n;i++){
		cin>>a[i].fullprice;
	}
	
	for(int i = 0;i<n;i++){
		a[i].price = a[i].fullprice / a[i].weight;
	}
	for(int i = 0;i<n-1;i++){
		for(int j = i;j<n;j++){
			if(a[i].price<a[j].price){
				swap(a[i],a[j]);
			}
		}
	}
	double price = 0;
	for(int i = 0;i<n;i++){
		if(d<=a[i].weight){
			price += a[i].price * d;
			break;
		}else{
			price += a[i].fullprice;
			d -= a[i].weight;
		}
	}
	printf("%.2lf\n",price);
	return 0;
}

如果是这样,在运行的时候会一直出不来东西,调试的时候会跳出警告:
Program received signal SIGSEGV, Segmentation fault
本意为:程序接收到了一个无效的内存(SIGSEGV),产生了段错误
后来将错误指向了

a[i].price = a[i].fullprice / a[i].weight;

这段代码并没有问题,既然是一个无效的内存,那么就是在赋值的时候并不知道将这个值赋予到哪里,也就是说a[i].price这个东西并没有在内存中
通过查询资料以及对自身情况的理解,问题就出在

yb a[n];

这一个潦草的定义上,本身用变量定义数组只有在c能做到,c++是不能做到的,c++的定义方式是先给其开辟一个 n*sizeof(elementtype) 大的内存再进行操作(具体我暂时也不是特别了解),这时候之前对 malloc()(动态内存分配) 的博文的作用就体现出来了

malloc(size_t size);

对于结构体类型的malloc,是查阅资料后看到的,我也会在原博文上更新
此时就对main函数中的数组进行如下定义代替原来的潦草定义就可以了

yb *a = (struct yb*)malloc(n*sizeof(struct yb));

猜你喜欢

转载自blog.csdn.net/a656418zz/article/details/83589879
今日推荐