1. 程式人生 > 其它 >簡易電子表格的設計

簡易電子表格的設計

簡易電子表格的設計

問題描述

設計一個支援基本計算統計功能和其它一些表格管理/處理功能的軟體,使使用者可在該軟體的支援下,用互動方式進行表格建立、資料輸入、資料編輯及其它一些表格操作。即類似於簡易Execel表格處理軟體。

基本要求

(1)建立表格:建立空白表格,同時在螢幕上顯示,使其處於可輸入資料的狀態。使用者可指定新建表格的行列數。
(2)輸入資料與編輯資料:通過鍵盤將資料輸入到顯示在螢幕上的電子錶上。
(3)基本統計計算:可選擇按行或列合計、求平均、求最大最小。
(4)排序:使任意指定的行或列中的資料按大小(升或降)排列,對字元型據,還可選擇大小寫敏感。
(5)表格儲存:使電子表格以磁碟檔案的方式儲存在磁碟上,並可隨時讀入,供繼續處理。

(6)公式支援:單元格內可輸入公式(表示式),使對應單元格的最終內容為公式的計算結果。公式最基本的形式是算術計算公式,可按名引用其它單元格。

演算法思路

void MyExcel::on_ConfirmButton_pressed()
{
    int calculate_row=-1;
    int calculate_column=-1;

    if(ui->RCBox->currentText()=="行")
    {
        calculate_row=ui->lineEdit->text().toInt();
        if
(calculate_row<1||calculate_row>ui->tableWidget->columnCount()) { QMessageBox::about(this,"Warning","輸入錯誤的行數"); } } else if(ui->RCBox->currentText()=="列") { calculate_column=ui->lineEdit->text(
).toInt(); if(calculate_column<1||calculate_column>ui->tableWidget->columnCount()) { QMessageBox::about(this,"Warning","輸入錯誤的列數"); } } if(ui->FunctionBox->currentText()=="合計") { if(calculate_row!=-1) { if(SumColumnPos==-1) { SumColumnPos=ui->tableWidget->columnCount(); ui->tableWidget->insertColumn(ui->tableWidget->columnCount()); //計算某一行的合計時,就是插入新的一列,專門用於計算合計的 } double sum=0; for(int i=0;i<Column;i++) { if(ui->tableWidget->item(calculate_row-1,i)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ sum=sum+ui->tableWidget->item(calculate_row-1,i)->text().toDouble(); } qDebug()<<sum; } QTableWidgetItem *SUM=new QTableWidgetItem(QString::number(sum)); ui->tableWidget->setItem(calculate_row-1,SumColumnPos,SUM); } else if(calculate_column!=-1) { if(SumRowPos==-1) { SumRowPos=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(ui->tableWidget->rowCount()); //就是插入新的一行,專門用於計算合計的 } double sum=0; for(int i=0;i<Row;i++) { if(ui->tableWidget->item(i,calculate_column-1)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ sum=sum+ui->tableWidget->item(i,calculate_column-1)->text().toDouble(); } qDebug()<<sum; } QTableWidgetItem *SUM=new QTableWidgetItem(QString::number(sum)); ui->tableWidget->setItem(SumRowPos,calculate_column-1,SUM); } } else if(ui->FunctionBox->currentText()=="求平均") { if(calculate_row!=-1) { if(AverageColumnPos==-1) { AverageColumnPos=ui->tableWidget->columnCount(); ui->tableWidget->insertColumn(ui->tableWidget->columnCount()); //計算某一行的平均時,就是插入新的一列,專門用於計算合計的 } double sum=0; for(int i=0;i<Column;i++) { if(ui->tableWidget->item(calculate_row-1,i)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ sum=sum+ui->tableWidget->item(calculate_row-1,i)->text().toDouble(); } qDebug()<<sum; } QTableWidgetItem *Average=new QTableWidgetItem(QString::number(sum/Column)); ui->tableWidget->setItem(calculate_row-1,AverageColumnPos,Average); } else if(calculate_column!=-1) { if(AverageRowPos==-1) { AverageRowPos=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(ui->tableWidget->rowCount()); //計算某一行的平均時,就是插入新的一列,專門用於計算合計的 } double sum=0; for(int i=0;i<Row;i++) { if(ui->tableWidget->item(i,calculate_column-1)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ sum=sum+ui->tableWidget->item(i,calculate_column-1)->text().toDouble(); } qDebug()<<sum; } QTableWidgetItem *Average=new QTableWidgetItem(QString::number(sum/Row)); ui->tableWidget->setItem(AverageRowPos,calculate_column-1,Average); } } else if(ui->FunctionBox->currentText()=="最大值") { if(calculate_row!=-1) { if(MaxColumnPos==-1) { MaxColumnPos=ui->tableWidget->columnCount(); ui->tableWidget->insertColumn(ui->tableWidget->columnCount()); //計算某一行的平均時,就是插入新的一列,專門用於計算合計的 } double maxNumber=0; for(int i=0;i<Column;i++) { if(maxNumber<ui->tableWidget->item(calculate_row-1,i)->text().toDouble()) { if(ui->tableWidget->item(calculate_row-1,i)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ maxNumber=ui->tableWidget->item(calculate_row-1,i)->text().toDouble(); } qDebug()<<maxNumber; } } QTableWidgetItem *MaxNumber=new QTableWidgetItem(QString::number(maxNumber)); ui->tableWidget->setItem(calculate_row-1,MaxColumnPos,MaxNumber); } else if(calculate_column!=-1) { if(MaxRowPos==-1) { MaxRowPos=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(ui->tableWidget->rowCount()); //計算某一行的平均時,就是插入新的一列,專門用於計算合計的 } double maxNumber=0; for(int i=0;i<Row;i++) { if(maxNumber<ui->tableWidget->item(i,calculate_column-1)->text().toDouble()) { if(ui->tableWidget->item(i,calculate_column-1)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ maxNumber=ui->tableWidget->item(i,calculate_column-1)->text().toDouble(); } qDebug()<<maxNumber; } } QTableWidgetItem *MaxNumber=new QTableWidgetItem(QString::number(maxNumber)); ui->tableWidget->setItem(MaxRowPos,calculate_column-1,MaxNumber); } } else if(ui->FunctionBox->currentText()=="最小值") { if(calculate_row!=-1) { if(MinColumnPos==-1) { MinColumnPos=ui->tableWidget->columnCount(); ui->tableWidget->insertColumn(ui->tableWidget->columnCount()); //計算某一行的平均時,就是插入新的一列,專門用於計算合計的 } double minNumber=ui->tableWidget->item(calculate_row-1,0)->text().toDouble(); for(int i=0;i<Column;i++) { if(minNumber>ui->tableWidget->item(calculate_row-1,i)->text().toDouble()) { if(ui->tableWidget->item(calculate_row-1,i)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ minNumber=ui->tableWidget->item(calculate_row-1,i)->text().toDouble(); } qDebug()<<minNumber; } } QTableWidgetItem *MinNumber=new QTableWidgetItem(QString::number(minNumber)); ui->tableWidget->setItem(calculate_row-1,MinColumnPos,MinNumber); } else if(calculate_column!=-1) { if(MinRowPos==-1) { MinRowPos=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(ui->tableWidget->rowCount()); //計算某一行的平均時,就是插入新的一列,專門用於計算合計的 } double minNumber=ui->tableWidget->item(0,calculate_column-1)->text().toDouble(); for(int i=0;i<Row;i++) { if(minNumber>ui->tableWidget->item(i,calculate_column-1)->text().toDouble()) { if(ui->tableWidget->item(i,calculate_column-1)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ minNumber=ui->tableWidget->item(i,calculate_column-1)->text().toDouble(); } qDebug()<<minNumber; } } QTableWidgetItem *MinNumber=new QTableWidgetItem(QString::number(minNumber)); ui->tableWidget->setItem(MinRowPos,calculate_column-1,MinNumber); } } else if(ui->FunctionBox->currentText()=="升序排序") { if(calculate_row!=-1) { double array[100]; for(int i=0;i<Column;i++) { if(ui->tableWidget->item(calculate_row-1,i)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ array[i]=ui->tableWidget->item(calculate_row-1,i)->text().toDouble(); } } std::sort(array,array+Column); for(int i=0;i<Column;i++) { QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i])); ui->tableWidget->setItem(calculate_row-1,i,arrayItem); } } else if(calculate_column!=-1) { double array[100]; for(int i=0;i<Row;i++) { if(ui->tableWidget->item(i,calculate_column-1)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ array[i]=ui->tableWidget->item(i,calculate_column-1)->text().toDouble(); } } std::sort(array,array+Row); for(int i=0;i<Row;i++) { QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i])); ui->tableWidget->setItem(i,calculate_column-1,arrayItem); } } } else if(ui->FunctionBox->currentText()=="降序排序") { if(calculate_row!=-1) { double array[100]; for(int i=0;i<Column;i++) { if(ui->tableWidget->item(calculate_row-1,i)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else{ array[i]=ui->tableWidget->item(calculate_row-1,i)->text().toDouble(); } } std::sort(array,array+Column); for(int i=Column-1;i>=0;i--) { QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i])); ui->tableWidget->setItem(calculate_row-1,Column-1-i,arrayItem); } } else if(calculate_column!=-1) { double array[100]; for(int i=0;i<Row;i++) { if(ui->tableWidget->item(i,calculate_column-1)==0) { QMessageBox::about(this,"Warning","有格沒有被定義"); break; } else { array[i]=ui->tableWidget->item(i,calculate_column-1)->text().toDouble(); } } std::sort(array,array+Row); for(int i=Row-1;i>=0;i--) { QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i])); ui->tableWidget->setItem(Row-1-i,calculate_column-1,arrayItem); } } } //調整行列寬度,避免和原來的表格資料混淆 for(int i=Column;i<ui->tableWidget->columnCount();i++) { ui->tableWidget->setColumnWidth(i,5); } for(int i=Column;i<ui->tableWidget->rowCount();i++) { ui->tableWidget->setRowHeight(i,3); } }