新手小白学习计算机的第八天(老王专场)
循环编程练习本文章记录了老王今日关于循环编程的练习#define_CRT_SECURE_NO_WARNINGS//#includestdio.h//int main()//{// //int v 0;// double v 0;// for (v 36; v 0; v / 2.0)// printf(%3d, v);// //printf(%.0f, v);// 坑 1除法变成浮点除法// v / 2 现在是浮点数运算// 36.0 →18.0 →9.0 →4.5 →2.25 →1.125 →0.5625 →0.28125……// 永远不会等于 0理论上循环会无限执行// 坑 2致命错误 % 3d 打印 double// % d 要求读取一个 int4 字节但你传入的是 double8 字节浮点数。// ⚠️ C 标准规定格式符与参数类型不匹配 → 未定义行为Undefined Behavior// 简单直白解释// double 在内存里是【符号位 指数 尾数】的二进制编码// 和 int 纯粹二进制数值完全不是一套规则。// printf 只会强行截取 4 字节二进制当成整数解析输出一堆毫无意义的乱数字。// 重点它不会自动把小数转成整数很多人误以为 printf 会自动截断这是最大误区// return 0;//}//6.编写一个程序打印下面的图案要求使用嵌套循环//$$$$$$$$//$$$$$$$$//$$$$$$$$//$$$$$$$$//#includestdio.h//int main()//{// int i 0;// for (i 1; i 4; i)// {// int a 0;// for (a 1; a 8; a)// {// printf($);// }// printf(\n);// }// return 0;//}//#includestdio.h//int main()//{// int i 0;// while (i 4)// printf(Hi!);// do// printf(Bye!);// while (i 8);//// return 0;//}//8.输入Go west,young man!下面各个程序的输出结果//#includestdio.h//int main()//{// char ch;// scanf(%c, ch);// Go west,young man!// while (ch ! g)// {// printf(%c\n, ch);// printf(%c\n, ch);// scanf(%c, ch);// }// return 0;//}// 9.以下代码打印什么内容//#include stdio.h//int main(void)//{// int n, m;// n 30;// while (n 33)// printf(%d|, n);// n 30;// do// printf(%d|, n);// while (n 33);// printf(\n***\n);// for (n 1; n * n 200; n 4)// printf(%d\n, n);//// printf(\n***\n);// for (n 2, m 6; n m; n * 2, m 2)// printf(%d %d\n, n, m);//// printf(\n***\n);// for (n 5; n 0; n--)// {// for (m 0; m n; m)//// printf();// printf(\n);// }// return 0;//}// 13.定义一个函数接受一个long类型值的函数并以long类型返回参数的平方值。//#includestdio.h//long pown(int a)//{// long b 0;// b a * a;// return b;//}//int main()//{// int i 0;// scanf(%d, i);// printf(%ld,pown(i));// return 0;//}// 3.使用嵌套循环按下面的格式打印字符// F// FE// FED// FEDC// FEDCB// FEDCBA//#includestdio.h//int main()//{// char i F;// int a 0;// for (a 0; a 5; a)// {// int b 0;// for (i F; b a; b)// {// printf(%c, i - b);// }// printf(\n);// }// return 0;//}// 4.使用嵌套循环按下面的格式打印字符// A// BC// DEF// GHIJ// KLMNO// PQRSTU//#includestdio.h//int main()//{// char i A;// int a 0;// for (a 0; a 5; a)// {// int b 0;// for (i ,b 0; b a; b)// {// printf(%c, i b);// }// printf(\n);//// }// return 0;//}//#include stdio.h//int main(void)//{// char ch A;// // 外层控制行数// for (int line 1; line 6; line)// {// // 内层每行打印 line 个字母// for (int i 0; i line; i)// {// printf(%c, ch);// ch;// }// printf(\n); // 换行// //ch的值发生变化变化的在循环中内层循环每次都会改变ch的值// //变化后的值在循环中不会销毁出了循环之后ch仍然等于‘A’// }// return 0;//}//5.编写一个程序提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母// A// ABA// ABCBA// ABCDCBA// ABCDEDCBA//打印这样的图形要根据用户输入的字母来决定。例如上面的图形是用户输入E后的打印结果。// 提示用外层循环处理行每行使用3个内层循环分别处理空格、以升序打印字母、以降序打印字母。// 如果系统不使用ASCLL或其他以数字顺序编码的代码。//#includestdio.h//int main()//{// int line 0;// char input 0;// printf(请输入字母程序将以金字塔形式打印\n);// scanf(%c, input);// for (line 1; line input- A 1; line)//// // // // // // 一定要注意字母的ASCLL码值// // // // 一定要注意字母的ASCLL码值// // // // 一定要注意字母的ASCLL码值// // // // for (line 1; line input; line)这里我想当然了// //E是第五个字母我的本意是让外层循环循环五次// //但是计算机理解的是循环69次因为E的ASCLL码值为69// //所以应该用input - A 1当作外层循环次数控制打印行数// {// int c 0;// //内层循环一// for (c input-line-64;c 0 ;c--)// //循环一用来打印字符前面的空格降序打印形成金字塔型// {// printf( );// }// int i 0;// //内层循环二// for ( i 0; i (2 * line - 1)/2; i)// //循环二升序打印字母一直打印到第line个字母// {////// printf(%c,Ai);// }// int a 0;// //内层循环三// for (a (2 * line - 1) / 2 1; a 0; a--)// //循环三降序打印字母从line1个字母开始打印直到打印到A。// {// printf(%c, (Aa-1));// }// printf(\n);//每行字符打印完之后换行// }// //printf(%c, A 1);//// return 0;//}// //AI//#includestdio.h//int main()//{// char input;// printf(请输入字母程序将以金字塔形式打印\n);// scanf(%c, input);// int max_line input - A 1; //转为总行数E→5行//// for (int line 1; line max_line; line)// {// // 1.打印前置空格// for (int c 0; c max_line - line; c)// {// printf( );// }//// //2.升序 A ~ 当前字母// for (int i 0; i line; i)// {// printf(%c, A i);// }//// //3.降序从line‑2回到A// for (int a line - 2; a 0; a--)// {// printf(%c, A a);// }//// printf(\n);// }// return 0;//}//AI再次优化//#include stdio.h////int main(void)//{// char ch;// printf(请输入一个大写英文字母);// scanf(%c, ch);//// // 输入校验只接受A‑Z// if (ch A || ch Z)// {// printf(输入错误请输入大写A~Z\n);// return 1;// }//// int total ch - A 1; // 总层数输入E得到5//// // 外层控制每一行// for (int line 1; line total; line)// {// // ①打印前置空格// for (int s 0; s total - line; s)// {// printf( );// }//// // ②升序打印 A → 当前行末尾字母// for (int i 0; i line; i)// {// printf(%c, A i);// }//// // ③降序打印从倒数第二个字母回退到A// for (int i line - 2; i 0; i--)// {// printf(%c, A i);// }//// printf(\n);// }//// return 0;//}//代码优化//#includestdio.h//int main(void)//{// char c;// scanf(%c, c);// int n c - A 1;// for (int L 1; L n; L, putchar(\n))// {// for (int s 0; s n - L; s)// putchar( );// for (int i 0; i L; i)// putchar(A i);// for (int i L - 2; i 0; i--)// putchar(A i);// }// return 0;//}错误原因分析 // // 一定要注意字母的ASCLL码值 // // 一定要注意字母的ASCLL码值 // // 一定要注意字母的ASCLL码值 // // for (line 1; line input; line)这里我想当然了 //E是第五个字母我的本意是让外层循环循环五次 //但是计算机理解的是循环69次因为E的ASCLL码值为69 //所以应该用input - A 1当作外层循环次数控制打印行数猜数字游戏的实现////写一个猜数字游戏////玩完一次游戏后还想继续玩不用退出程序。////做一个菜单////1. 玩游戏 0.退出游戏////游戏运行起来菜单至少打印一次////函数---对一段代码的封装//#includestdio.h//#includestdlib.h//#includetime.h//void menu()//{// printf(*************************\n);// printf(******* 1.猜数字 ******\n);// printf(****** 0.退出游戏 ******\n);// printf(*************************\n);//}////整个游戏的逻辑//void game()//{// int guess 0;// //1.生成随机数// int r rand() % 100 1;//生成1-100的数字// //printf(%d\n, r);//// //2.猜数字// printf(请猜数字 : \n);////// while (1)// {// scanf(%d, guess);//// if (guess r)// {// printf(猜小了\n);// }// else if (guess r)// {// printf(猜大了\n);// }// else// {// printf(恭喜你猜对了\n);// break;// }// }//}////int main()//{// int input 0;// srand((unsigned int)time(NULL));// //放在主调函数中保障调用一次即可// //如果频繁调用可能会出问题生成的随机数可能不够随机//// do// {// menu();//函数的调用// printf(请选择);// scanf(%d, input);// switch (input)// {// case 0:// printf(退出游戏\n);// break;// case 1:// game();// // printf(玩游戏\n);// break;// default:// printf(选择错误\n);// break;//// }// } while (input);// return 0;//}//功能优化#includestdio.h#includestdlib.h#includetime.hvoidmenu(){printf(*************************\n);printf(******* 1.猜数字 ******\n);printf(****** 0.退出游戏 ******\n);printf(*************************\n);}//整个游戏的逻辑voidgame(){intguess0;//1.生成随机数intrrand()%1001;//生成1-100的数字//printf(%d\n, r);//2.猜数字intcount5;//表示最多猜5次printf(请猜数字 : \n);while(count)//5 4 3 2 1{printf(目前还有 %d 次机会,count);scanf(%d,guess);if(guessr){printf(猜小了\n);}elseif(guessr){printf(猜大了\n);}else{printf(恭喜你猜对了\n);break;}count--;}if(count0){printf(很遗憾5次机会已用完没能猜出数字正确的数字为%d\n,r);}}intmain(){intinput0;srand((unsignedint)time(NULL));//放在主调函数中保障调用一次即可//如果频繁调用可能会出问题生成的随机数可能不够随机do{menu();//函数的调用printf(请选择);scanf(%d,input);switch(input){case0:printf(退出游戏\n);break;case1:game();// printf(玩游戏\n);break;default:printf(选择错误\n);break;}}while(input);return0;}