PAT (Basic Level) Practice 1021 个位数统计 (Program received signal SIGSEGV, Segmentation fault 解决方法)
第一眼我还以为是背包问题(因为没学过背包有点害怕)后来仔细看了下发现这个比背包简单太多了
各个月饼有总重和总售价,在这里取单价,根据性价比最高的购买就好
对于每个月饼,可以用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));