关于读取文件中数据对数组进行操作问题
我们老师布置了一道题,在文件中输入一串数字,第一行的数字为数组的行(row)和列(column),下面3行4列的数据为数组,下面要对数组进行相关操作:每行最后输出他们的和,每列最后输出他们的和,最后还需要输出每列和的总和,我想问各位大神,能不能给我一个好建议和好思路,我只会写到下面的程序了,
希望哪位大大可以帮我写一下,然后注释下,最后再附上思路,谢谢你们了!!
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main() {
int sum=0;
double num;
ifstream file("../data.txt");
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <4; j++) {
file >> num;
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j <4; j++) {
cout <<left<<setw(4)<< num << " ";
sum +=num;
}
cout<<"sum = "<<sum<<endl;
}
cout<<"---------------------------------"<<"\n";
file.close();
return 0;
} 本帖最后由 superbe 于 2019-9-18 19:39 编辑
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main() {
ifstream file("3c.dat");
if(!file.is_open()){
cout<<"open file 3c.dat error!"<<endl;
return 0;
}
int nr,nc; //行数、列数
file>>nr>>nc; //读入行数、列数
int **p = new int* ; //下面四行创建一个nr+1行nc列的数组(多一行是用于保存列的和)
for(int i=0;i<nr+1;i++){
p = new int();
}
for(int i=0;i<nr;i++){ //从文件中读入矩阵到数组
for(int j=0;j<nc;j++){
file>>p;
}
}
int total=0; //矩阵所有数的总和
for(int i=0;i<nr;i++){
int sr=0; //行的和
for(int j=0;j<nc;j++){
sr+=p; //累加一行
total+=p; //累加总和
p+=p; //累加一列
cout<<left<<setw(5)<<p;//打印矩阵中的数
}
cout<<"rowsum = "<<sr<<endl; //打印行的和
}
cout<<"---------------------------------"<<endl;
for(int j=0;j<nc;j++){
cout<<left<<setw(5)<<p; //打印列的和
}
cout<<"totalsum = "<<total<<endl; //打印矩阵总和
for(int i=0;i<nr;i++) delete[]p; //下面两行释放内存
delete []p;
file.close();
return 0;
}
我知道晚了,不过既然都写完了,那就贴出来吧
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
class c_t
{
public:
c_t(const std::string &filename)
{
std::ifstream file(filename);
size_t cols, rows;
file >> rows >> cols;
for(size_t y = 0; y < rows; ++y)
{
this->data.push_back(std::vector<int>());
for(size_t x = 0; x < cols; ++x)
{
int temp;
file >> temp;
this->data.push_back(temp);
}
}
}
friend std::ostream &operator <<(std::ostream &os, const c_t &rhs)
{
for(size_t y = 0; y < rhs.data.size(); ++y)
{
int rowsum = 0;
for(size_t x = 0; x < rhs.data.size(); ++x)
{
rowsum += rhs.data;
os << std::setw(4) << rhs.data;
}
os << "\trowsum = " << rowsum << std::endl;;
}
os << "-----------------------------------------" << std::endl;
int totalsum = 0;
for(size_t x = 0; x < rhs.data.size(); ++x)
{
int colsum = 0;
for(size_t y = 0; y < rhs.data.size(); ++y)
colsum += rhs.data;
os << std::setw(4) << colsum;
totalsum += colsum;
}
os << "\ttotalsum = " << totalsum << std::endl;
return os;
}
private:
std::vector<std::vector<int>> data;
};
int main()
{
c_t c("3C.dat");
std::cout << c << std::endl;
return 0;
}
5 9 2 3 rowsum = 19
212-2 0 rowsum = 12
-514 7 111 rowsum = 127
-----------------------------------------
235 7 114 totalsum = 158
本帖最后由 丶不离不弃 于 2019-9-19 08:18 编辑
人造人 发表于 2019-9-18 22:09
我知道晚了,不过既然都写完了,那就贴出来吧
谢谢,你也很棒!不过你写得我都看不懂呢。。friend用法我才自学考试到一点都不会。。。。 superbe 发表于 2019-9-18 17:17
谢谢你! superbe 发表于 2019-9-18 17:17
我想问你今个问题呢,你有空的时候可以帮我回答一下嘛,谢谢了呢!
1.在读取文件数据的时候,前面的3 4 这个数据用来作为函数的行和列,那么在读取的时候将他们依次读取到nr , nc中,那么接下来读取数组中的内容的时候,会不会连3 4 也一起读进去了呢?还是将前免得数据读取并存入之后,计算机就会自动读取并存取接下来的内容了呢?
2.你在最初创建nr+1行nc列的数组的时候(16行),你可以解释下为啥这样定义吗?**p还有int* 这个是定义了一个指针吗? 可以直接定义一个数组吗如 int a可以吗?
3.还有17-18行是什么意思?
4.在29-30 行,累加一行和列加总和的结果不都是一样的吗?这样写是为了什么呢?
5.在31行,p【nr】不都已经超过数组的范围了吗?i<nr的呀?在那里是如何累加一列的呢?可以解释下吗?谢谢了呢。
6.41行开始,释放内存是什么意思呢?
谢谢你帮我解答!!!
本帖最后由 superbe 于 2019-9-20 14:20 编辑
1. 不会再读3 4的,可以想象有一个指示文件中当前位置的“指针”,一边读一边移动“指针”,读完了的数据就会移动到它后面,然后再从新位置开始读。
2. 3. 不能这样int a,编译通不过的,必须定义时指定具体数值,不能用变量。而文件中第一行指定的行数、列数是不固定的,所以才使用了动态数组,具体方法是先用这行int **p = new int* ;分配一个包含nr+1个元素的空间(每个元素p[ i ]是一个指针,指向一行),再用 for(int i=0;i<nr+1;i++){ p[ i ] = new int(); } 给每行分配nc个元素的空间(并初始化为0),把这行的地址给p[ i ]。上面[人造人]大神使用的vector内嵌套vector是个好方法, 不用new动态分配内存了。
4. 将所有行加起来 或 将所有列加起来都等于总和,如果那样实现也是可以的。
5. p没有超过数组范围,定义的是nr+1行,行的范围是0--nr,nr是最后一行。要知道数组下标是从0开始的,而定义中数组中nr+1是行数,所以可使用的行号是0--nr。
6. 释放内存是把前面new动态分配的内存交还给系统,免得其它程序内存不够用,实际上如果不delete,象这个简单的程序运行一下就马上退出,系统会自动回收,影响不大,但是其它程序比如一个后台服务程序,在退出前不释放就可能会长期占用,所以一般最好new和delete成对使用。
superbe 发表于 2019-9-20 12:29
1. 不会再读3 4的,可以想象有一个指示文件中当前位置的“指针”,一边读一边移动“指针”,读完了的数据就 ...
这位大神,我今天在编译我自己的程序的时候,发现了一个错误,就是你的程序的第18行,在知道动态指针数组的行数的时候,你在定义列的时候后面的小括号是干什么的,我今天在编译的时候少了这个(),结果最后算列的和的时候,是很长的一串错误数字,你可以解释一下吗?
谢谢!
( )是初始化为0,不能少。 各路大侠各显神勇,膜拜
页:
[1]