实验2
#include <stdio.h> #include <stdlib.h> int main() { int a=5, b=7, c=100, d, e, f; d = a/b*c; e = a*c/b; f = c/b*a; printf("d=%d, e=%d, f=%d\n",d,e,f); system("pause"); return 0; }
line 6: d=(5/7)*100
line 7: e=(5*100)/7
line 8: f=(100/7)*5
原因:计算机进行运算时,乘除的优先级相同,且结合顺序都是从左到右,所以默认优先进行左边的运算。而当"/"符号的左右两边的运算量的类型同时为整型时,默认进行整除的操作,即计算结果省略小数部分,也为整型。例如line6中(5/7)的结果为0.所以d的值为0。
任务2;
// ex2.cpp #include <stdio.h> #include <stdlib.h> int main() { int x=1234; float f=123.456; double m=123.456; char ch='a'; char a[]="Hello, world!"; // 定义一个数组a,数组中存放字符串常量hello,world! int y=3, z=4; printf("%d %d\n", y, z); printf("y=%d, z=%d\n", y,z); printf("%8d,%2d\n", x,x); printf("%f, %8f, %8.1f, %0.2f, %.2e\n",f,f,f,f,f); printf("%lf\n",m); printf("%3c\n", ch); printf("%s\n%15s\n%10.5s\n%2.5s\n%.3s\n",a,a,a,a,a); system("pause"); return 0; }
格式字符d的定义为按十进制整数输出,即数据若为整型时,对应的格式字符为d,一般写作%d。而d前可加数字作为修饰符,用来限定输出数据所占列的长度,倘若修饰符规定的列数大于输出数据本身的长度,则再根据数字的正负向左向右补齐,规定正数向右补齐,负数向左补齐。当修饰符规定的列数小于输出数据本身的长度,则将数据完整输出,不会强制省略;格式字符f的定义为按浮点数输出,修饰符的部分规则和d相同,但是多出一项规范小数位数的操作——修饰符可写作小数的形式,小数点前的整数部分规定浮点型数据到小数点为止所占的列数,而小数点后的小数部分则限定浮点型数据的小数位数。另外若以''%.数字e"的形式输出,则会以科学计数法将数据以指数形式输出;格式字符c的定义为按字符输出,c前面所加修饰符同理也是用来限定字符所占的列数的;最后,格式字符s的定义为按字符串输出,修饰符同样可以以写成小数形式,整数部分用来规定字符串所占的列数,而小数部分怎用来限制字符串的长度。特例“%。数字s”可单独使用,来限制字符串长度。
任务3;
#include <stdio.h> #include <stdlib.h> int main() { double x,y; char c1,c2,c3; int a1,a2,a3; scanf("%d%d%d",&a1,&a2,&a3); printf("%d,%d,%d\n",a1,a2,a3); scanf(" %c%c%c",&c1,&c2,&c3); printf("%c%c%c\n",c1,c2,c3); scanf("%lf%lf",&x,&y); printf("%lf,%lf\n",x,y); system("pause"); return 0; }
任务4;
#include <stdio.h> #include <stdlib.h> int main() { char x; x = getchar(); if( x>='0'&&x<='9') // 判断x是数字字符表达式 printf("%c是数字字符\n", x); else if(( x>='a'&&x<='z') ||(x>='A'&&x<='Z') ) // 判断x是大写或小写英文字母的表达式 printf("%c是英文字母\n", x); else printf("%c是其它字符\n", x); system("pause"); return 0; }
任务5;
#include <stdio.h> #include <stdlib.h> int main() { char ans1, ans2; printf("复习了没? (输入y或Y表示复习了,输入n或N表示没复习) : "); ans1 = getchar(); // 从键盘输入一个字符,赋值给ans1 getchar(); printf("\n动手敲代码了没? (输入y或Y表示敲了,输入n或N表示木有敲) : "); ans2 = getchar(); if((ans1=='y'||ans1=='Y')+(ans2=='y'||ans2=='Y')==2) printf("\n罗马不是一天建成的:)\n"); else printf("\n罗马不是一天毁灭的。。。\n"); system("pause"); return 0; }
思考;若将中间的getchar()拿掉,则在输入第一个字符并按下回车后程序会将后续的所有东西直接打印。所以此处的getchar()是用来进行缓冲的——当程序调用getchar时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止。
任务6;
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int a,n,sum; sum=0; a=0; printf("输入一个10以内的正整数n,求数列2的n次方和\n"); scanf("%d",&n); while (a<=n) { sum=sum+pow(2,a); a=a+1; } printf("当n=%d时,sum=%d",n,sum); system("pause"); return 0; }
任务7;
#include <stdio.h> #include <stdlib.h> int main () { int a,b,i,n; scanf("%d",&n); for(b=n;b>=0;b--) { for(i=n-b;i>0;i--) { printf("\t"); } for(a=2*b-1;a>=1;a--) { printf(" O\t"); } printf("\n"); for(i=n-b;i>0;i--) { printf("\t"); } for(a=2*b-1;a>=1;a--) { printf("<H>\t"); } printf("\n"); for(i=n-b;i>0;i--) { printf("\t"); } for(a=2*b-1;a>=1;a--) { printf("I I\t"); } printf("\n"); } return 0; }
实验总结;1,格式字符的修饰符使用万变不离其宗,d,f,s,c这几种格式字符的修饰符都有一个共同点——整数部分限定数据所占的列数,而小数部分则针对本身有长度的数据(字符例外),可以限制本身的长度。
2,scanf函数相较于printf函数,多了一个加地址符的限定,即以'&变量'的形式,这是打程序的时候容易疏忽的一点。另外,对于格式字符的要求,scanf函数要比printf函数更严格,区别在于printf函数可以强制将数据转换成格式字符规定的类型然后输出,而scanf函数的格式字符则要求与之前程序规定的变量类型一样才能输入。
3,条件语句设置条件时,不仅可以单独地进行逻辑判断,比如比较大小,限定范围。还可以将逻辑运算的结果进行数据的运算,即真为1,假为0,从而设置不同的逻辑判断条件。
4,循环语句的嵌套使用可以考虑将多个循环中的不同变量产生数学上的函数关系,从而构建更加有序的输出结果。在排列小人的时候可以先考虑如何输出一个倒金字塔形状的1,再将1换成小人。