#include
using namespace std;
int main()
{
int i,j,d=1; //d在此处是一个月的长度
char a[25][55];
cout << "星期一" << "\t";
cout << "星期二" << "\t";
cout << "星期三" << "\t";
cout << "星期四" << "\t";
cout << "星期五" << "\t";
cout << "星期六" << "\t";
cout << "星期日" << "\t";
cout<0;i<25;i++)
{
if(i==0)
{
for(j=0;j<55;j++)
{
a[i][j]='-';
cout<0&&i%4==0)
{
for(j=0;j<55;j++)
{
a[i][j]='-';
cout<%2==1)
{
for(j=0;j<55;j++)
{
a[i][j]='\0';
cout<0&&i%2==0&&i%4!=0&&d<=31)
{
if(d=1)
{
//因为一月一日是星期日所以先输出了空格
for(j=0;j<51;j++)
{
a[i][j]='\0';
cout<1]=d;
cout<1];
d++;
}
else
{
for(j=0;j<55;j++)
{
//平均分了55列,应当在这几个位置输出日期比较美观
if(j==3||j==11||j==19||j==27||j==35||j==43||j==51)
{
a[i][j]=d;
cout<'\0';
cout<0;
}
这次我成功了,输出结果是乱码的原因是,在输出日期时使用了字符数组,但未将日期转换为字符串。
在将数字转换为字符时,将使用 ASCII 码中的字符。将数字 1 转换为字符时,会输出 ASCII 码中的字符 '1',将数字 2 转换为字符时,会输出 ASCII 码中的字符 '2',依此类推。
但是,将数字转换为字符后,输出的仍然是字符,而非字符串。因此,输出的日期会显示为乱码。
要解决这个问题,可以使用 C++ 中的字符串类型 std::string 或使用 std::to_string,代码如下:
#include <iostream>
#include <string>
int main()
{
int i, j, d = 1; // d 表示一个月的天数
std::string a[25][55];
std::cout << "星期一" << "\t";
std::cout << "星期二" << "\t";
std::cout << "星期三" << "\t";
std::cout << "星期四" << "\t";
std::cout << "星期五" << "\t";
std::cout << "星期六" << "\t";
std::cout << "星期日" << "\t";
std::cout << "\n"; // 输出换行符而不是 endl 操纵符
for (i = 0; i < 25; i++)
{
if (i == 0)
{
// 生成一行连字符
for (j = 0; j < 55; j++)
{
a[i][j] = "-";
std::cout << a[i][j];
}
}
if (i != 0 && i % 4 == 0)
{
// 每隔 4 行生成一行连字符
for (j = 0; j < 55; j++)
{
a[i][j] = "-";
std::cout << a[i][j];
}
}
if (i % 2 == 1)
{
// 生成一行空格
for (j = 0; j < 55; j++)
{
a[i][j] = " ";
std::cout << a[i][j];
}
}
if (i != 0 && i % 2 == 0 && i % 4 != 0 && d <= 31)
{
if (d == 1)
{
// 由于一月一日是星期日,因此先输出空格
for (j = 0; j < 51; j++)
{
a[i][j] = " ";
std::cout << a[i][j];
}
a[i][j + 1] = std::to_string(d); // 将 d 转换为字符串并输出
std::cout << a[i][j + 1];
d++;
}
else
{
for (j = 0; j < 55; j++)
{
// 平均分布日期在 55 列,使日历布局更美观
if (j == 3 || j == 11 || j == 19 || j == 27 || j == 35 || j == 43 || j == 51)
{
a[i][j] = std::to_string(d); // 将 d 转换为字符串并输出
std::cout << a[i][j];
d++;
}
else
{
a[i][j] = " ";
std::cout << a[i][j];
}
}
}
}
std::cout << "\n"; // 输出换行符而不是 endl 操纵符
}
return 0;
}
放弃了二维数组,用了双循环做
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int i,j,d=1; //d在此处是一个月的长度
cout << "星期一" << "\t";
cout << "星期二" << "\t";
cout << "星期三" << "\t";
cout << "星期四" << "\t";
cout << "星期五" << "\t";
cout << "星期六" << "\t";
cout << "星期日" << "\t";
cout<<'\n';
for(i=0;i<25;i++)
{
if(i==0)
{
for(j=0;j<55;j++)
{
cout<<'-';
}
}
if(i!=0&&i%4==0)
{
for(j=0;j<55;j++)
{
cout<<'-';
}
}
if(i%2==1)
{
for(j=0;j<55;j++)
{
cout<<'\0';
}
}
if(i!=0&&i%2==0&&i%4!=0)
{
if(d==1)
{
cout<<setw(51)<<d;
d++;
}
else
{
cout<<setw(3);
for(j=0;j<55;j++)
{
//平均分了55列,应当在这几个位置输出日期比较美观
if(j==3||j==11||j==19||j==27||j==35||j==43||j==51)
{
if(d<10)
{
cout<<d<<setw(8);
d++;
}
if(d>=10)
{
cout<<d<<setw(7);
d++;
}
}
else
{
cout<<'\0';
}
}
}
}
cout<<'\n';
}
return 0;
}
但也出现了新的问题