C++程序设计函数小结
/*
C++程序设计第六章函数小结笔记
1.函数
定义:函数名,参数,返回值类型和主体
函数必须在main函数之前
调用栈保存函数各参量的活动记录
可以用return来在非法值时调用函数终结
不正常的情况下可以使用exit(int),在头文件<cstdlib>里
2.以传值方式传递参数
3.模块化代码
4.函数的重载:
使用相同的名称,但是不同的参数
注意模糊调用的问题
5.函数原型:
就是一个没有函数实现(函数体)的的单纯的函数声明;在函数原型中可以不必些参数名称,只写参数类型就可
6.缺省参数:
类似于void printArea(double radis = 1),给参数赋予默认值
7.内联函数:
在函数最前面加上inline,可以避免函数调用的开销,对于短函数建议使用,对于多次调用的长函数不建议使用;同时编译器可能会忽略inline关键字
8.局部,全局和静态局部变量:
局部:函数内,无缺省值
全局:函数外,缺省值为0
符合就近原则
应避免使用全局变量
避免在嵌套的for循环里生命相同的变量
局部变量在函数调用后会被销毁
静态局部变量会一直驻留在内存中,声明关键字为static
9.以引用方式传递参数
值传递有一些局限性,参数的值是不会改变的
引用变量:可以被作用函数参数中来引用原变量;变量名前或是数据类型后加(&)
10.常量引用参数
参数在函数中不能被改变,就可以使用这个:参数形式为 const type& name
11.函数抽象和逐步取精:
图表和分治;
自顶向下设计或自底向上实现
实例;对给定年月输出日历
*/
//#pragma comment(lib,"winsock.lib")
#include <iostream>
#include <string>
#include <iomanip>
#include <windows.h>
using namespace std;
void printMonth(int year,int month);
void printMonthTitle(int month,int year);
void printMonthBody(int year, int month);
int getStartDay(int totalDay);
int getTotalDay(int year, int month);
int getMonthDay(int year, int month);
bool isLeapYear(int year);
//设定一个初始值,可以判断1800年以后的日历
const int STARTDAY1800 = 3;
int main() {
cout << "请输入你想的到日历的年" << endl;
int year;
cin >> year;
cout << "请输入你想的到日历的月" << endl;
int month;
cin >> month;
cout << "你所想要查看的日历是:\n" << endl;
printMonth(year,month);
cout << endl;
int ex;
cout << "如果退出,请输入0" << endl;
cin >> ex;
if (ex == 0) {
return 0;
}
else
{
cout << "你还想看什么?没有了,知道不" << endl;
system("pause");
cout << " 88888888 88888888" << endl;
cout << " 8888 8888 8888 8888" << endl;
cout << " 8888 8888 8888 8888" << endl;
cout << " 8888 8888 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 I am with you 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 8888" << endl;
cout << " 8888 8888 " << endl;
cout << " 8888 8888" << endl;
cout << " 8888" << endl;
Sleep(3000);
/*
*/
}
}
//打印日历表
void printMonth(int year, int month) {
printMonthTitle(month,year);
cout << "- - - - - - - - - - - - - - - - -" << endl;
printMonthBody(year,month);
}
//打印日历头元素
void printMonthTitle(int month,int year) {
string mon;
//输出月份英语
switch (month)
{
case 1:
mon = "January";
break;
case 2:
mon = "February";
break;
case 3:
mon = "March";
break;
case 4:
mon = "April";
break;
case 5:
mon = "May";
break;
case 6:
mon = "June";
break;
case 7:
mon = "July";
break;
case 8:
mon = "August";
break;
case 9:
mon = "September";
break;
case 10:
mon = "October";
break;
case 11:
mon = "November";
break;
case 12:
mon = "December";
break;
default:
break;
}
cout << setw(16) << mon << " " << year << endl;
}
//打印日历体
void printMonthBody(int year, int month) {
cout << "Sun Mon Tue Wed Thu Fri Sat" << endl;
int startDay = getStartDay(getTotalDay(year,month));
//循环输出空元素
for (int i = 0; i < startDay; i++) {
cout << " ";
}
//循环打印日期
for (int i = 1; i <= getMonthDay(year,month); i++,startDay++) {
//判断是否到了每周的末尾,如果末尾则换行
if (startDay % 7 == 6) {
cout << setw(3) << i << endl;
}
else
{
cout << setw(3) << i << " ";
}
}
}
//获得该年该月第一天的星期几
int getStartDay(int totalDay){
return (totalDay + STARTDAY1800) % 7;
}
//获得从1800年到输入日期的总年分
int getTotalDay(int year,int month){
int sum = 0;
//循环加入每一年的天数
for (int i = 1800; i < year; i++)
{
if (isLeapYear(i)) sum += 366;
else sum += 365;
}
//循环加入月份的天数
for (int i = 1; i < month; i++) {
sum += getMonthDay(year, i);
}
return sum;
}
//获得某年某月的天数
int getMonthDay(int year,int month) {
int mon;
switch (month)
{
case 2:
if (isLeapYear(year)) mon = 29;
else mon = 28;
break;
case 4:
case 6:
case 9:
case 11:
mon = 30;
break;
default:
mon = 31;
break;
}
return mon;
}
//判断该年是否为闰年
bool isLeapYear(int year){
if ( (year % 400) == 0 || (year % 4 == 0 && (year % 100) != 0)
) return true;
else return false;
}
写了一个实例,包含一点小小的彩蛋,也没什么技术含量,希望大牛看到,不要感觉污了眼