今天继续学习了 循环结构算法
#include <stdio.h> int main() { int ch = 0; // EOF - end of file 文件结束标志 while ((ch = getchar()) != EOF) { putchar(ch); } return 0;
程序运行过程当中,直接输入EOF并不能结束程序,EOF - end of file 为文件结束标志,在程序运行窗口输入Ctrl+z,会显示^Z的字样,为程序结束标志的码值输入。windows
#include <stdio.h> int main() { int ch = 0; int ret = 0; char password[16] = { 0 }; printf("请输入密码:>\n"); scanf("%s", password); // 输入了密码 并存放在password数组中 // 缓冲区还剩余一个 '\n', //因而读取一个 '\n'; while ((ch = getchar()) != '\n') { ; } //getchar(); //读取了输入密码以后的用于确认字符串的回车 //当密码中输入空格的时候 scanf只会读取空格前内容 因此须要用getchar把空格后的字符读完 //才能在下一步进行确认 printf("请确认:> Y/N\n"); //此时输入密码后的回车会被getchar获取 字符\n的码值为10 为真 ret = getchar(); // if (ret == 'Y') { printf("确认成功\n"); } else { printf("放弃确认\n"); } return 0; }
其中的注释起来的单独一行“//getchar(); //读取了输入密码以后的用于确认字符串的回车”是前面为了把输入在scanf函数里的数字最后一位用于确认的回车“\n”字符拿掉,“\n”的返回值部位0,没有拿掉这个字符,下面的if条件句就不能正确的执行。 后来考虑到输入后可能会有空格,而空格之后的字符一个 scanf 没法获取,就使用了一个 while 循环将 scanf 能拿掉的字符以后的字符拿取干净,而后才能让下面的 if 语句正确执行。数组
#include <stdio.h> int main() { int i = 0; int j = 0; for ( ; i < 10 ; i++) { for ( ; j < 10; j++) { printf("hehe "); } //内部循环省略赋初值以后会致使第一次循环完成以后变量再也不进行赋初值 //下一次进入循环的时候 j==10 没法再次循环 } return 0; }
原本想写一个可以输出一百个“hehe”的程序,可是因为内层循环里的赋初值省略了,最终只能十个“hehe”ide
#include <stdio.h> int main() { int x,y; for (x = 0, y = 0; x<2 && y<5; ++x, y++) { printf ("hehe "); } return 0; }
for 语句的使用也能够是好几个赋初值和判断句构成函数
计算 1!+ 2! + 3!+...+10!学习
#include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for (n = 1; n <= 3; n++) { for (i = 1; i <= n; i++) { ret = ret * i; } sum = ret + sum; }//1 + 2 + 6 == 9 n=3 时打印出结果为15 printf("%d \n ", sum); return 0; }
以上,是有问题的,由于直接10!的阶乘比较大,难以确认,因此用前三位来进行确认,以上程序运行的结果为15, 1!+ 2! + 3! = =9,很明显有问题。通过逐步调试,发现了问题所在。纠正后源代码以下:设计
#include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for (n = 1; n <= 10; n++) { for (i = 1; i <= n; i++) { ret = ret * i; } sum = ret + sum; ret = 1; //ret 运算事后保留了值 要重置才能正确加入下一次阶乘运算 } printf("%d \n ", sum); return 0; }
问题也很明确,过程当中的阶乘初值 ret=1 ,但在过程当中并未重置为1,因此得不到正确的结果,固然该代码还有改进的余地,以下:调试
#include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for (n = 1; n <= 10; n++) { ret = ret * n; sum = sum + ret; // 直接进行累乘 时最简单的算法 只须要进行一次循环 printf(" ret=%d sum=%d\n", ret, sum); } return 0; }
以上代码之中也将过程的变化量打印了出来,方便观察,并且只用了单个循环code
顺序数组,指a[0]<=a[1]<=a[2]...字符串
#include <stdio.h> int main() { int i = 0; int v[100] = { 0 }; for (i = 0; i < 100; i++) { v[i] = 2 * i + 1; } int k = 0; printf("请输入你想要寻找到的数字:\n"); scanf("%d", &k); int sz = sizeof v / sizeof v[0]; for (i = 0; i < sz; i++) { if (k ^ v[i]) continue; else { printf("找到了 v[%d]=%d \n", i, v[i]); break; } } if (i == sz) { printf("找不到!!!"); } return 0; }
我先用循环填充了一个内含100个元素的数组v[100],而后用异或进行判断,使用 if 语句,其中“ k ^ v[i] ”返回值为零时,进入else,找到对应数字,中止循环,“ k ^ v[i] ”返回值不为零,跳过该次循环。
#include <stdio.h> #include <string.h> #include <windows.h> #include <stdlib.h> int main() { char arr1[] = "Li yan qing LOVE Xie yu qing "; char arr2[] = "*****************************"; int right = strlen(arr1) - 1; int left = 0; while(right >= left) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf(" %s \n", arr2); //休息一秒,须要调用Windows.h头文件 Sleep(1000); system("cls");//执行系统命令的函数 清空屏幕 须要调用stdlib.h头文字 left++; right--; } printf(" %s \n", arr2); return 0; }
代码运行的效果为,一行字符逐渐被另外一串字符替换,(本人夹带私货,给女友表白了一波,【doge】),strlen函数的做用为求字符串长度,须要stdlib.h的头文件。Sleep为让程序暂停的函数,后面括号里的数字单位为毫秒,所需头文件为windows.h。system("cls");//执行系统命令的函数 清空屏幕 须要调用stdlib.h头文字。须要注意的为,一个字符串被另外一个字符串所代替的过程当中,下标,字符串最后一位为结束字符‘\0’,并不会在字符串后显示,但也占一位,因此在计算字符串长度的时候须要 -1;
#include <stdio.h> #include <string.h> int main() { int i = 0; printf("请输入密码:\n"); char password[20] = { 0 }; for (i = 0; i < 3; i++) { scanf("%s", password); if (strcmp(password, "100086") == 0) { printf("登陆成功\a\n"); break; } printf("输入错误!!!\a\n"); } if (i == 3) { printf("三次机会已用完,程序退出!!!\a \n"); } return 0; }
其中'\a'为提示音,此程序中值得注意的一点是,字符串是否相等并不能直接将字符串写在 == 两边进行判断,须要用到一个函数,strcmp 函数,头文件为string.h,其中的所须要验证的密码是由源代码书写人定的,之后或许能设计出更完善的登陆端口