2017-04-25 89 views
1

首先,让我通过问好!这是我第一次使用这个资源(...并且可能不是我的最后一个)。话虽如此,我会尽我所能解释我的问题。这里没有'...日历作业

该任务是使用C++给定一个二维数组,给定一个月,一年和一周中的日期以便开始使用日历。我设法尽可能地从用户,年份和开始日期收集天数(对于一个月),但是我无法包装头,无法正确填充二维数组而无法获得读取权限错误,如下所示:

“在Calendar.exe中0x01288B7F引发的异常:0xC0000005:访问冲突读取位置0x00290000。”

输出的一个例子可以看这里:

“输入月份:二月

进入一年2016

输入一周中的一天:周六 一个 乙 d Ë ˚F G 周日周一周二周三周四周五周六 H

8 9 10 11 12 13 14 H

15 16 17 18 19 20 21 H

22 16 17 18 19 20 21 H

22 23 24 25 26 27 28 H

29 23 24 25 26 27 28 H

29 23 24 25 26 7 1409053844ħ

0 0 2130567168 7 -858993460 -858993460 -858993460ħ

-858993460 3930364 -858993460 -858993460 3930360 -858993460 -858993460^h

3930364 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 H”

正如你所看到的,它就会朝端靠不住,甚至在它开始吐出垃圾之前。

有问题的功能是在这里:

void displayMonth(int leapRes, int start) 
{ 
    int month[6][7] = { 0, 0 }; 

    cout << "F" << endl; 

    for (int i = 0; i < 6; i++) 
    { 
     for (int j = month[i][j]; j < leapRes; j++) 
     { 
      month[i][j] = j; 
     } 
    } 

    cout << "G" << endl; 

    cout << "Sun Mon Tues Wed Thurs Fri Sat" << endl; 

    for (int i = 0; i < 6; i++) 
    { 
     for (int j = month[i][start]; i < leapRes; j++) 
     { 
      if (j % 7 == 0) 
      { 
       cout << "H" << endl; 
       cout << "\n" << month[i][j] << " "; 
      } 
      else 
       cout << month[i][j] << " "; 
     } 
    } 
} 

我可以提供进一步的解释,我所提供的代码的任何部分。

再说一次,不要对我太粗糙。我在别处寻找可能的线索,告诉我如何以最佳的方式驾驭这项工作,而且运气不错。

编辑:

因为我已经做了一些修改功能代码,而它的填充与天的正确数量的阵列,它既不开始在正确的位置排列或对准网格格式。

void displayMonth(int numDays, int start) 
{ 
const int ROW = 6; 
const int COL = 7; 
int month[ROW][COL] = { 0, 0 }; 
int k = 1; 

cout << "F" << endl; 
//trying to populate the 2D array 
for (int i = 0; i < ROW; i++) 
{ 
    for (int j = 0; j < COL; j++) 
    { 
     month[i][j] = k; 
     k++; 
     //things like this are just bench checking 
     cout << "this is position " << j << " in the array: " << month[i][j] 
<< endl; 
     system("pause"); 
     //again, bench checking 
     cout << "1" << endl; 
     if (k >= numDays) 
      break; 
    } 
} 

cout << "G" << endl; 

cout << "Sun Mon Tue Wed Thu Fri Sat" << endl; 
//attempting to print said array 
for (int i = 0; i < ROW; i++) 
{ 
    for (int j = 0; j < COL; j++) 
    { 
     if (month[i][j] <= 0) 
     { 
      //cout << "2" << endl; 
      cout << "---"; 
     } 
     else 
     { 
      //cout << "3" << endl; 
      cout << setw(3) << month[i][j] << " "; 
     } 
    } 
} 
+1

此:'为(INT J =每月[i] [j];Ĵ UnholySheep

+0

当我将j更改为0或开始日期时,循环在开始新行后停止迭代,并重复之前的值。 –

+0

也是这样的:'for(int j = month [i] [start]; i UnholySheep

回答

0

在我看来,这是一个地方ctimestruct tm,会派上用场。这也有助于将它包装在课程中(月)。

要正确地填充阵列,您需要2个数据,第一天的工作日和总天数。对于第一个tm包含该字段(tm_wday)。对于第二个可以通过减去下个月第一天的年份('tm_yday')和本月第一天的第一天来计算。这具有自动允许闰年的优点。

声明数组时要记住的另一件事。一个月可以在日历中用完6周的部分时间。

因为我们需要两个tm对象,所以创建和填充结构的帮助函数将会很有帮助。

由于大多数人更习惯于将月份作为名称,但tm使用索引,map<string,int>将允许构造函数获取月份名称并有效地将其转换为索引,并允许类存储名称稍后打印出来。

的类可以是这个样子:

#include <iostream> 
#include <string> 
#include <map> 
#include <ctime> 
#include <iomanip> 

using std::cout; 
using std::cin; 
using std::string; 
using std::map; 
using std::ostream; 
using std::setw; 
class Month 
{ 
    static const int MAX_WEEK_DAYS = 7; 
    static const int MAX_WEEKS = 6; 
    map<string,int> months = 
    { 
     {"January",0}, 
     {"February",1}, 
     {"March",2}, 
     {"April",3}, 
     {"May",4}, 
     {"June",5}, 
     {"July",6}, 
     {"Auguat",7}, 
     {"September",8}, 
     {"October",9}, 
     {"November",10}, 
     {"December",11} 
    }; 
    string _name = ""; 
    int _days = 0; 
    int _weeks[MAX_WEEKS][MAX_WEEK_DAYS]; 
    int _year = 0; 
    void InitNewDate(int year , int month , int day,tm& date) 
    { 
     time_t rawTime; 
     time(&rawTime); 
     tm* tempDate = localtime(&rawTime); 
     tempDate->tm_year = year - 1900; 
     tempDate->tm_mon = month; 
     tempDate->tm_mday = day; 
     rawTime = mktime(tempDate); 
     tempDate = localtime(&rawTime); 
     date = *tempDate; 
    } 
public: 
    Month(int year, string name) 
    { 
     _year = year; 
     tm newDate; 
     InitNewDate(year , months[name] , 1,newDate); 
     tm tempDate; 
     if (months[name] == 12) 
     { 
      InitNewDate(year + 1 , 0 , 1,tempDate); 
     } 
     else 
     { 
      InitNewDate(year , months[name] + 1 , 1,tempDate); 
     } 
     _days = tempDate.tm_yday - newDate.tm_yday; 
     _name = name; 
     int day = 1; 
     for (int i = newDate.tm_wday; i < 7; i++,day++) 
     { 
      _weeks[0][i] = day; 
     } 
     for (int week = 1; week < MAX_WEEKS; week++) 
     { 
      for (int j = 0; j < MAX_WEEK_DAYS && day <= _days; j++ , day++) 
      { 
       _weeks[week][j] = day; 
      } 
     } 

    } 
    void PrintMonth(ostream& out) 
    { 
     out << _name << ", " << _year << '\n'; 
     out << "Sun Mon Tue Wed Thu Fri Sat\n"; 
     for (int week = 0; week < MAX_WEEKS; week++) 
     { 
      for (int day = 0; day < MAX_WEEK_DAYS; day++) 
      { 
       if (_weeks[week][day] <= 0) 
       { 
        out << "--- "; 
       } 
       else 
       { 
        out << setw(3) << _weeks[week][day] << ' '; 
       } 
      } 
      out << '\n'; 
     } 
    } 
}; 

构造函数将初始化所有的变量,包括二维阵列(Month m(2016 , "February");)。 PrintMonth函数将打印格式化的显示(m.PrintMonth(cout);)。

输出二月,2016年

February, 2016 
Sun Mon Tue Wed Thu Fri Sat 
--- 1 2 3 4 5 6 
    7 8 9 10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 29 --- --- --- --- --- 
--- --- --- --- --- --- --- 
+0

我很感谢你的帮助,但你的代码超出了我所在班级的范围。 –