🌞欢迎来到C语言的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于练气阶段,希望各位仙友顺利完成突破
📆首发时间:🌹2021年10月20日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
内存原理解析
显示是4个字节还是几个字节是拖动的效果。
实际我们电脑是64位的地址总线,程序运行的时候我们一般选择32位的地址总线,32位的数据总线,
🍈 字符输入函数getchar
当C程序执行到getchar();这条语句时,如果缓冲区中没有字符,则等待用户输入,用户输入的字符被存放在缓冲区中,当用户键入Enter键之后,getchar从缓冲区开始取走一个字符并返回该字符的ASCII码值或EOF字符。
例如顺序从键盘键入ABC三个字符,最后键入一个Enter键(在windows操作系统中,Enter键表示了两个字符'\r'和'\n',在linux系统中,只是一个字符'\n'),如果是windows系统,缓存区中就得到了四个字符('\r'为回车字符,用于触发getchar执行)。
当缓冲区有数据时,getchar从缓冲区顺序取出一个字符。例如有char ch; ch=getchar();,getchar从缓冲区取出字符的ASCII值并赋给ch。
🍉字符输出函数
putchar
从键盘输入一个字符,并输出到显示器中。
#include <stdio.h> int main(void) { char ch; printf("please input a char:\n"); //这是一条表达式语句,最后有;,下同。 ch=getchar(); //程序执行到此处时,等待用户输入字符,最后按Enter键。 //Enter键结束后,getchar()从缓冲区得到字符并赋给ch。 putchar(ch); // 把ch输出到显示器中。 putchar('\n'); //输出一个换行符常量。 return 0; }
这里键入一个字符a和Enter键,这个Enter键代表的字符也会进入缓存区,如果要在程序中用getchar输入两个字符'A','B'分别给ch1和ch2变量时,正确的键入是AB+enter,而不是输入A+enter和B+enter。
🍊格式输入函数scanf
C语言通过scanf函数读取键盘输入,键盘输入又被称为标准输入。当scanf函数读取标准输入时,如果还没有输入任何内容(缓冲区为空的时候),那么scanf函数会被卡住(专业用语为阻塞)。
行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的I/O操作。这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的I/O操作(scanf进行匹配,实际上回车也放到缓冲区)。典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout)。在键盘输入19和Enter键后,它们均进入到缓冲区,scanf根据格式控制符首先从缓冲区中取出字符'1'、'9'、'\n',再把'1'、'9'、字符解释成十进制的整数,并存入到x变量所在地址中
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { int age; char ch; scanf("%d", &age); printf("age=%d\n", age); scanf("%c", &ch); printf("ch=%c\n", ch); return 0; }
scanf函数在读取整型数、浮点数、字符串(后面介绍数组时讲解字符串)时,会忽略'\n'(回车符)、空格符等字符(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞)。scanf函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'。
#include <stdio.h> int main(void) { int age1,age2; char ch; scanf("%d",&age1); printf("age1=%d\n",age1); scanf("%d",&age2); printf("age2=%d\n",age2); return 0; }
#从键盘上输入两个数分别赋给a,b
# include <stdio.h> int main(void) { int a, b; printf("Please enter two integers separated by a space:\n"); //提示输入。 scanf("%d%d", &a, &b); printf("a= %d, b=%d\n", a , b); return 0; }
scanf函数的循环读取
scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.
什么是EOF,直接在代码里输入EOF,点击按Ctrl?
#define EOF (-1)
什么情况下scanf会出错?
在行首的位置ctrl z,回车
在行首的位置ctrl z,回车
在行首的位置ctrl z,回车
#include <stdio.h> int main(void) { int i; while(rewind(stdin),(scanf("%d",&i))!=EOF) { printf("i=%d\n",i); } return 0; }
🍋顺序结构程序设计
#include <stdio.h> #include <math.h> int main(void) { float a, b,c; float s,area; printf("Please enter the side lengths a, b, c of the triangle:\n"); //提示输入。 scanf("%f%f%f", &a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area=%-7.2f",area); return 0; }
2.从键盘输入一个英文大写字母,要求改用小写字母输出。
#include <stdio.h> #include <math.h> int main(void) { char a, b; printf("a=:"); //提示输入。 scanf("%c", &a); b=a+32; printf("a->%c",b); return 0; }
#include <stdio.h> #include <math.h> int main(void) { float a,b,c,disc,x1,x2,p,q; // disc存放的结果。 printf("Please enter a, b, and c, separated by spaces:\n"); scanf("%f%f%f",&a,&b,&c); disc=b*b-4*a*c; p=-b/(2*a); q=(float)sqrt(disc)/(2*a); // sqrt得到的值是double型,转换成float。 x1=p+q; x2=p-q; printf("\nx1=%5.2f\nx2=%5.2f\n",x1,x2); return 0; }
🥒选择结构
例1 输入两个int型数据,输出它们中的较大者。
#include<stdio.h> int main() { int a,b,max; printf("请输入两个数a,b:"); scanf("%d%d",&a,&b); a=max; if(b>a) max=b; printf("max=%d",max); }
例2输入一个整型分数,如果分数在90-100分,输出“优”,80-89,输出“良”,60-79,输出“及格”,60分以下输出“不及格”,用switch语句实现编程(假设分数是区间[0,100]上的整数)。
#include <stdio.h> int main(void) { int score; scanf("%d",&score); switch(score/10) { case 10: case 9: printf("优\n");break; case 8: printf("良\n");break; case 7: case 6: printf("及格\n");break; default: printf("不及格\n"); } return 0; }
#include <stdio.h> int main(void) { float x,y; printf("请输入x的值:\n"); x=11; if (x<=1) y=x; else { if(x>=10) y=3*x-11; else y=2*x-1; } printf("y=%f",y); return 0; }
switch语句
1.输入1-7的一个整数,输入的是几,就输出英文的星期几(例如如果输入7,则输出Sunday)。
#include <stdio.h> int main(void) { int x; printf("请输入x的值:\n"); scanf("%d",&x); switch(x) { case 1: printf("Monday\n"); break; case 2: printf("Tuseday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; case 7: printf("Sunday\n"); break; default: printf("error\n"); } return 0; }
2.从键盘输入+-*/中的任意一个字符和两个float型数据,然后把这个两个数做相应的算术操作,并输出结果。
#include <stdio.h> int main(void) { float a,b; char ch; printf("请输入a,b的值:\n"); scanf("%f%f",&a,&b); getchar(); printf("请输入需要进行的操作(+-*/):\n"); ch=getchar(); switch(ch) { case '+': printf("a+b=%f\n",a+b); break; case '-': printf("a-b=%f\n",a-b); break; case '*': printf("a*b=%f\n",a*b); break; case '/': printf("a/b=%f\n",a/b); break; default: printf("error\n"); } return 0; }
3.编程输出界面,如图4-3所示。根据界面操作,使程序根据用户选择运行。按1退出,程序结束;按2时计算,当选择计算后,输出如图4-4所示界面,提示按键选择计算平方还是立方,用户按键选择后,提示用户输入计算的数据,并给出结果,如图4-5所示。
#include <stdio.h> int main(void) { char select; int x; printf("********************************\n\n"); printf("按1 退出 按2 计算 \n\n"); printf("********************************\n"); printf("请输入您的选择:\n"); select=getch(); setbuf(stdin,NULL);//清空缓冲区 switch(select) { case '1': break; case '2': printf("按1 平方 按2 立方 \n\n"); printf("请输入您的选择:\n"); select=getchar(); setbuf(stdin,NULL);//清空缓冲区 printf("请输入需要计算X:\n"); scanf("%d",&x); switch(select) { case '1': printf("x*x=%d\n",x*x); break; case '2': printf("x*x*x=%d\n",x*x*x); break; } break; default: printf("error\n"); } return 0; }
🥬循环结构
例求1+2+3+...100的值
#include <stdio.h> int main(void) { int i=1; int sum=0; while(i<=100) { sum=sum+i; i++; } printf("sum=%d",sum); return 0; }
例:统计从键盘输入的一行字符的个数。
#include <stdio.h> int main(void) { unsigned charNum=0; //用于统计字符的个数,初始化为0。 printf("Input a string:"); while(getchar()!='\n') //把从键盘获取的字符与'\n'比较形成表达式。 charNum ++; printf("Number of characters: %u\n", charNum); return 0; }
例5-3-2 用for语句输出斐波那契数列(Fibonacci Sequence)的前10个数。
include <stdio.h> int main(void) { int predata=1; int nextdata=1; int i,temp; printf("%d %d ",predata,nextdata); for(i=3;i<=10;i++) { temp=nextdata; nextdata=predata+nextdata; predata=temp; printf("%d ",nextdata); } return 0; }
例用for语句实现从键盘输入一组字符,并输出出来。
#include <stdio.h> int main(void) { char ch; for(;(ch=getchar())!='\n';) { putchar(ch); } return 0; }
例输入一个long型数据,计算它各个位上数字的和并输出。例如输入102,则输出3。
#include <stdio.h> int main(void) { long N=301; int sum=0; int i; for(i=1;i<=3;i++) { sum+=N%10; N=N/10; } printf("%d",sum); return 0; }
例求出用 50元、20元 和 10元换100元有几种方式
#include <stdio.h> int main(void) { int i,j,z; for(i=0;i<=2;i++) for(j=0;j<=5;j++) for(z=0;z<=10;z++) { if(100==50*i+20*j+10*z) printf("i=%d j=%d z=%d\n",i,j,z); } return 0; }
例 输出九九乘法表。
#include <stdio.h> int main(void) { int i,j; for(j=1;j<=9;j++) { for(i=1;i<=j;i++) { printf("%d*%d=%d ",i,j,i*j); if(i==j) printf("\n"); } } return 0; }
break语句和continue语句
例找出一个比100大且能被47整除的整数,并输出
#include <stdio.h> int main(void) { int i,j; for(i=100;;i++) if(i%47==0) { printf("%d",i); break; } return 0; }
例从键盘输入一个整数,判断是否为素数,是就输出Y,不是就输出N
#include <stdio.h> #include <math.h> int main(void) { int m,k,i; printf("m:"); scanf("%d",&m); k=(int)sqrt(m); for(i=2;i<=k;i++) { if(m%i==0) break; } if(i>k) printf("N"); else printf("Y"); return 0; }
(2)第二种方法
#include <stdio.h> #include <math.h> int main(void) { int m,k,i; int flag=0; printf("m:"); scanf("%d",&m); k=(int)sqrt(m); for(i=2;i<=k;i++) { if(m%i==0) { flag=1; break; } } if(flag==1) printf("N"); else printf("Y"); return 0; }
例找出100到200之间的素数,并它们输出出来
#include <stdio.h> #include <math.h> int main(void) { int m,k,i,j; for(m=100;m<=200;m++) { int flag=0; k=(int)sqrt(m); for(i=2;i<=k;i++) { if(m%i==0) { flag=1; break; } } if(flag!=1) printf("m=%d\n",m); } return 0; }
例求1!+2!+...+8!的值
#include <stdio.h> int main(void) { int i,j; int sum=0; for(j=1;j<=8;j++) { int n=1; for(i=1;i<=j;i++) { n=n*i; if(i==j) sum+=n; } } printf("sum=%d",sum); return 0; }
例 求两个正整数的最大公约数和最小公倍数。
#include <stdio.h> int main(void) { int m,n; int i,j; printf("please input m(m>0) and n(n>0):\n"); scanf("%d%d",&m,&n); //求最大公约数 int gcd=(m<n?m:n);//求m和n中的最小者 for(i=gcd;i>=1;i--) { if(m%i==0&&n%i==0) { printf("i=%d\n",i); break; } } //求最小公倍数 int g=(m>n?m:n);//求m和n中的最小者 for(j=g;;j++) { if(j%m==0&&j%n==0) { printf("j=%d",j); break; } } return 0; }
goto语句
#include <stdio.h> int main(void) { int y=5,i=-3; goto label; //goto语句直接跳到label指向的标签语句执行。 for(i=8;i<0;i++) { y=20; label:printf("i=%d ,y=%d\n",i,y); //标签语句。 } return 0; }