1. 1 using System;
  2. 2 using System.Collections.Generic;
  3. 3 using System.Linq;
  4. 4 using System.Text;
  5. 5 using System.Threading.Tasks;
  6. 6 using System.Drawing;
  7. 7 using System.Reflection;
  8. 8 using System.Net.NetworkInformation;
  9. 9
  10. 10 namespace play
  11. 11 {
  12. 12 class Program
  13. 13 {
  14. 14 //短期利率与长期利率
  15. 15 double lowRate = 0;
  16. 16 double highRate = 0;
  17. 17
  18. 18 //KeyValuePair<DateTime, >;
  19. 19 DateTime dt1 = new DateTime(2015, 3, 1);
  20. 20 DateTime dt2 = new DateTime(2015, 5, 11);
  21. 21 DateTime dt3 = new DateTime(2015, 6, 28);
  22. 22 DateTime dt4 = new DateTime(2015, 8, 26);
  23. 23 //贷款金额
  24. 24 static double totalMoney, balance;
  25. 25
  26. 26 static string choice;
  27. 27 static string newChoice;
  28. 28 //期数
  29. 29 int n;
  30. 30 //月供
  31. 31 double payMonth;
  32. 32 double rate;
  33. 33 double interest;
  34. 34 /// <summary>
  35. 35 /// 用来构建欢迎界面
  36. 36 /// </summary>
  37. 37 void Paint()
  38. 38 {
  39. 39 Console.WriteLine("***************************");
  40. 40 Console.WriteLine("***************************");
  41. 41 Console.WriteLine("***************************");
  42. 42 Console.WriteLine("欢迎使用房贷计算器");
  43. 43 Console.WriteLine("***************************");
  44. 44 Console.WriteLine("***************************");
  45. 45 Console.WriteLine("***************************");
  46. 46
  47. 47 Console.WriteLine("请按任意键继续");
  48. 48 Console.ReadKey();
  49. 49 Console.Clear();
  50. 50 }
  51. 51 /// <summary>
  52. 52 /// 按日期选择利率
  53. 53 /// </summary>
  54. 54 /// <param name="dt">输入的日期</param>
  55. 55 void RateChoose(DateTime dt)
  56. 56 {
  57. 57 if (dt >= dt4)
  58. 58 {
  59. 59 lowRate = 0.0275;
  60. 60 highRate = 0.0325;
  61. 61 }
  62. 62 else if (dt >= dt3)
  63. 63 {
  64. 64 lowRate = 0.03;
  65. 65 highRate = 0.035;
  66. 66 }
  67. 67 else if (dt >= dt2)
  68. 68 {
  69. 69 lowRate = 0.0325;
  70. 70 highRate = 0.0375;
  71. 71 }
  72. 72 else if (dt >= dt1)
  73. 73 {
  74. 74 lowRate = 0.035;
  75. 75 highRate = 0.04;
  76. 76 }
  77. 77 else
  78. 78 {
  79. 79 Console.WriteLine("你输入的日期不在范围内");
  80. 80 Console.ReadKey();
  81. 81 Environment.Exit(0);
  82. 82 }
  83. 83 }
  84. 84 /// <summary>
  85. 85 /// 计算月供
  86. 86 /// </summary>
  87. 87 void Payment(DateTime dt)
  88. 88 {
  89. 89 //设置缓冲区高度,即设置显示的最大行数
  90. 90 Console.BufferHeight = 1000;
  91. 91 RateChoose(dt);
  92. 92 switch (choice)
  93. 93 {
  94. 94 case "1":
  95. 95 {
  96. 96 //等额本息,月供计算方法
  97. 97 for (n = 1; n <= 360; n++)
  98. 98 {
  99. 99
  100. 100
  101. 101 if (n <= 60)
  102. 102 {
  103. 103 rate = lowRate;
  104. 104 }
  105. 105 else
  106. 106 {
  107. 107 rate = highRate;
  108. 108 }
  109. 109 //计算月供
  110. 110 double p;
  111. 111 p = rate / 12;
  112. 112 payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));
  113. 113 //利息
  114. 114 interest = n * payMonth;
  115. 115 if (n % 2 == 0)
  116. 116 {
  117. 117 Console.ForegroundColor = ConsoleColor.Blue;
  118. 118 }
  119. 119 else
  120. 120 {
  121. 121 Console.ForegroundColor = ConsoleColor.White;
  122. 122 }
  123. 123 Console.WriteLine("{0}期按揭贷款的月供是{1:0.00}元,总利息是{2:0.00}元", n, payMonth, interest);
  124. 124
  125. 125 }
  126. 126 }
  127. 127 break;
  128. 128 case "2":
  129. 129 {
  130. 130 //等额本金,月供计算方法
  131. 131 for (n = 1; n <= 360; n++)
  132. 132 {
  133. 133 if (n <= 60)
  134. 134 {
  135. 135 rate = lowRate;
  136. 136 }
  137. 137 else
  138. 138 {
  139. 139 rate = highRate;
  140. 140 }
  141. 141 //计算月供
  142. 142 double p;
  143. 143 p = rate / 12;
  144. 144 payMonth = (totalMoney / n) + totalMoney * p;
  145. 145 interest = ((totalMoney / n + totalMoney * p) + totalMoney / n * (1 + p)) / 2 * n - totalMoney;
  146. 146 Console.WriteLine("{0}期按揭贷款的首月还款额是{1:0.00}元,总利息是{2:0.00}元", n, payMonth, interest);
  147. 147 }
  148. 148 }
  149. 149 break;
  150. 150 }
  151. 151 }
  152. 152
  153. 153 /// <summary>
  154. 154 /// 月贷计算方法
  155. 155 /// </summary>
  156. 156 /// <param name="n">还款期数</param>
  157. 157 void Compute(int n)
  158. 158 {
  159. 159 Console.WriteLine("期次\t\t偿还利息\t\t偿还本金\t\t还款额\t\t剩余本金");
  160. 160 switch (choice)
  161. 161 {
  162. 162
  163. 163 case "1":
  164. 164 //等额本息法计算房贷
  165. 165 {
  166. 166 if (n <= 60)
  167. 167 {
  168. 168 rate = lowRate;
  169. 169 }
  170. 170 else
  171. 171 {
  172. 172 rate = highRate;
  173. 173 }
  174. 174
  175. 175 double p;
  176. 176 p = rate / 12;
  177. 177 payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));
  178. 178 for (int i = 1; i <= n; i++)
  179. 179 {
  180. 180 //string s = i.ToString();
  181. 181 interest = totalMoney * p;
  182. 182 double capital = payMonth - interest;
  183. 183 totalMoney -= capital;
  184. 184 Console.WriteLine("{0}\t\t{1:0.00}\t\t{2:0.00}\t{3:0.00}\t{4:0.00}", i, interest, capital, payMonth, totalMoney);
  185. 185 }
  186. 186 }
  187. 187 break;
  188. 188 case "2":
  189. 189 //等额本金法计算房贷
  190. 190 {
  191. 191 if (n <= 60)
  192. 192 {
  193. 193 rate = lowRate;
  194. 194 }
  195. 195 else
  196. 196 {
  197. 197 rate = highRate;
  198. 198 }
  199. 199 double p;
  200. 200 p = rate / 12;
  201. 201 double capital = totalMoney / n;
  202. 202 for (int i = 1; i <= n; i++)
  203. 203 {
  204. 204
  205. 205 interest = totalMoney * p;
  206. 206 payMonth = capital + interest;
  207. 207 totalMoney -= capital;
  208. 208
  209. 209 Console.WriteLine("{0}\t\t{1:0.00}\t\t\t{2:0.00}\t\t{3:0.00}\t{4:0.00}", i, interest, capital, payMonth, totalMoney);
  210. 210 }
  211. 211 }
  212. 212 break;
  213. 213
  214. 214 }
  215. 215 }
  216. 216 /// <summary>
  217. 217 /// 计算还款状况
  218. 218 /// </summary>
  219. 219 /// <param name="n0">还款期数</param>
  220. 220 /// <param name="dt">首次还款时间</param>
  221. 221 void Repayment(int n0, DateTime dt)
  222. 222 {
  223. 223 balance = totalMoney;
  224. 224 DateTime dt0 = dt;
  225. 225 double rate0;
  226. 226 double capital;
  227. 227 double p;
  228. 228 Console.WriteLine("还款时间\t\t偿还利息\t\t偿还本金\t\t还款额\t\t剩余本金");
  229. 229 switch (choice)
  230. 230 {
  231. 231 case "1":
  232. 232 {
  233. 233
  234. 234 RateChoose(dt0);
  235. 235 if (n0 <= 60)
  236. 236 {
  237. 237 rate0 = lowRate;
  238. 238 }
  239. 239 else
  240. 240 {
  241. 241 rate0 = highRate;
  242. 242 }
  243. 243 n = n0;
  244. 244 for (int i = 1; i <=n0; i++)
  245. 245 {
  246. 246 RateChoose(dt);
  247. 247 rate = (n0 <= 60 ? lowRate : highRate);
  248. 248
  249. 249 if (dt.Year != dt0.Year && rate != rate0)//这里应该有问题?
  250. 250 {
  251. 251 double p0 = rate0 / 12;
  252. 252 double payMonth0= (p0 * totalMoney * Math.Pow((1 + p0), n)) / ((Math.Pow(1 + p0, n) - 1));
  253. 253 double interest0 = balance * p0;
  254. 254 double capital0 = payMonth0 - interest0;
  255. 255
  256. 256 rate0 = rate;
  257. 257
  258. 258 interest = balance * (rate0/12);
  259. 259 totalMoney = balance;
  260. 260 balance -= capital0;
  261. 261
  262. 262 payMonth = capital0 + interest;
  263. 263 n =n0 - i+1;
  264. 264 Console.WriteLine("{0}\t{1:0.00}\t\t\t{2:0.00}\t\t\t{3:0.00}\t\t{4:0.00}", dt, interest, capital0, payMonth, balance);
  265. 265 dt = dt.AddMonths(1);
  266. 266 continue;
  267. 267 }
  268. 268
  269. 269
  270. 270
  271. 271 p = rate0 / 12;
  272. 272 payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));
  273. 273
  274. 274 interest = balance * p;
  275. 275 capital = payMonth - interest;
  276. 276 balance -= capital;
  277. 277 Console.WriteLine("{0}\t{1:0.00}\t\t\t{2:0.00}\t\t\t{3:0.00}\t\t{4:0.00}", dt, interest, capital, payMonth, balance);
  278. 278 dt = dt.AddMonths(1);
  279. 279
  280. 280 }
  281. 281
  282. 282 }
  283. 283 break;
  284. 284 case "2":
  285. 285 {
  286. 286 RateChoose(dt0);
  287. 287 rate0 = (n0 <= 60 ? lowRate : highRate);
  288. 288 n = n0;
  289. 289 for (int i = 0; i < n0; i++)
  290. 290 {
  291. 291 RateChoose(dt);
  292. 292 rate = (n0 <= 60 ? lowRate : highRate);
  293. 293 if (dt.Year!=dt0.Year&&rate!=rate0)
  294. 294 {
  295. 295 rate0 = rate;
  296. 296 }
  297. 297 p = rate0 / 12;
  298. 298 capital = totalMoney / n0;
  299. 299 interest = balance * p;
  300. 300 payMonth = capital + interest;
  301. 301 balance -= capital;
  302. 302 Console.WriteLine("{0}\t{1:0.00}\t\t\t{2:0.00}\t\t\t{3:0.00}\t\t{4:0.00}", dt, interest, capital, payMonth, balance);
  303. 303 dt = dt.AddMonths(1);
  304. 304 }
  305. 305 }
  306. 306 break;
  307. 307 }
  308. 308 }
  309. 309 /// <summary>
  310. 310 ///实现提前还款功能
  311. 311 /// </summary>
  312. 312 /// <param name="n">还款总期数</param>
  313. 313 /// <param name="dt1">首次还款时间</param>
  314. 314 /// <param name="dt2">提前还款时间</param>
  315. 315 void Prepayment(int n0,DateTime dt1,DateTime dt2,double money)
  316. 316 {
  317. 317 balance = totalMoney;
  318. 318 DateTime dt0 = dt1;
  319. 319 double rate0;
  320. 320 double capital;
  321. 321 double p;
  322. 322 bool flag = false;
  323. 323 Console.WriteLine("还款时间\t\t偿还利息\t\t偿还本金\t\t还款额\t\t剩余本金");
  324. 324 switch (choice)
  325. 325 {
  326. 326 case "1":
  327. 327 {
  328. 328 RateChoose(dt0);
  329. 329 rate0 = (n0 <= 60 ? lowRate : highRate);
  330. 330 n = n0;
  331. 331 for(int i=1;i<=n0;i++)
  332. 332 {
  333. 333 RateChoose(dt1);
  334. 334 rate = (n0 <= 60 ? lowRate : highRate);
  335. 335
  336. 336
  337. 337 if (dt1.Year != dt0.Year && rate != rate0)//这里应该有问题?
  338. 338 {
  339. 339 double p0 = rate0 / 12;
  340. 340 double payMonth0 = (p0 * totalMoney * Math.Pow((1 + p0), n)) / ((Math.Pow(1 + p0, n) - 1));
  341. 341 double interest0 = balance * p0;
  342. 342 double capital0 = payMonth0 - interest0;
  343. 343
  344. 344 rate0 = rate;
  345. 345
  346. 346 interest = balance * (rate0 / 12);
  347. 347 totalMoney = balance;
  348. 348 balance -= capital0;
  349. 349
  350. 350 payMonth = capital0 + interest;
  351. 351 n = n0 - i + 1;
  352. 352 Console.WriteLine("{0}\t{1:0.00}\t\t\t{2:0.00}\t\t\t{3:0.00}\t\t{4:0.00}", dt1, interest, capital0, payMonth, balance);
  353. 353 dt1 = dt1.AddMonths(1);
  354. 354 continue;
  355. 355 }
  356. 356
  357. 357
  358. 358
  359. 359 p = rate0 / 12;
  360. 360 if (dt2.Year == dt1.Year && dt2.Month == dt1.Month)
  361. 361 {
  362. 362 balance -= money;
  363. 363 totalMoney = balance;
  364. 364 switch (newChoice)
  365. 365 {
  366. 366 case "1":
  367. 367 {
  368. 368
  369. 369 n = n0 - i + 1;
  370. 370 flag = true;
  371. 371 }
  372. 372 break;
  373. 373 case "2":
  374. 374 {
  375. 375 double temp = Math.Log((payMonth / (payMonth - totalMoney * p)), (1 + p));
  376. 376 n= (int)Math.Ceiling(temp);
  377. 377 n0 = n + i - 1;
  378. 378 }
  379. 379 break;
  380. 380 }
  381. 381
  382. 382 }
  383. 383 payMonth = (p * totalMoney * Math.Pow((1 + p), n)) / ((Math.Pow(1 + p, n) - 1));
  384. 384
  385. 385
  386. 386 interest = balance * p;
  387. 387 capital = payMonth - interest;
  388. 388 balance -= capital;
  389. 389 if (flag)
  390. 390 {
  391. 391 payMonth += money;
  392. 392 capital += money;
  393. 393 flag = false;
  394. 394 }
  395. 395 Console.WriteLine("{0}\t{1:0.00}\t\t\t{2:0.00}\t\t\t{3:0.00}\t\t{4:0.00}", dt1, interest, capital, payMonth, balance);
  396. 396 dt1 = dt1.AddMonths(1);
  397. 397 }
  398. 398 }
  399. 399 break;
  400. 400 case "2":
  401. 401 {
  402. 402
  403. 403 }
  404. 404 break;
  405. 405 }
  406. 406 }
  407. 407 static void Main(string[] args)
  408. 408 {
  409. 409
  410. 410 {
  411. 411 Program p = new Program();
  412. 412 p.Paint();
  413. 413 Console.WriteLine("请选择您的操作!1.房贷计算 2.月供速算 3.还款状况 4.提前还款");
  414. 414 Console.WriteLine("请选择您的还款方式?1.等额本息 2.等额本金");
  415. 415 choice = Console.ReadLine();
  416. 416 Console.WriteLine("请输入你的贷款金额");
  417. 417 totalMoney = Convert.ToDouble(Console.ReadLine());
  418. 418 Console.WriteLine("请输入您贷款的期数");
  419. 419 int number = Convert.ToInt32(Console.ReadLine());
  420. 420 Console.WriteLine("请输入你的首次贷款时间");
  421. 421 DateTime dT = Convert.ToDateTime(Console.ReadLine());
  422. 422 Console.WriteLine("请输入你的提前还款时间");
  423. 423 DateTime dTR = Convert.ToDateTime(Console.ReadLine());
  424. 424 Console.WriteLine("请输入你的还款金额");
  425. 425 double partMoney = Convert.ToDouble(Console.ReadLine());
  426. 426 Console.WriteLine("请选择你要的后续操作!1.减少月供 2.缩短年限");
  427. 427 newChoice = Console.ReadLine();
  428. 428 //Console.WriteLine("你输入的日期是{0},短期利率是{1},长期利率是{2}",dT,p.lowRate,p.highRate);
  429. 429 //dT= dT.AddMonths(1);
  430. 430 // Console.WriteLine(dT);
  431. 431 // p.Repayment(number, dT);
  432. 432 // p.Compute(number);
  433. 433 // p.Payment(dTR);
  434. 434 p.Prepayment(number, dT, dTR, partMoney);
  435. 435 Console.ReadKey();
  436. 436 }
  437. 437 }
  438. 438 }
  439. 439 }

    经过两三天的修改,代码进一步完善。但是鉴于自己水平有限,代码错误之处在所难免。不足之处,希望大家提出宝贵意见,使代码进一步完善。

版权声明:本文为xiaochen0409原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaochen0409/p/11741798.html