首页 > 代码库 > 第六次作业
第六次作业
一、实验内容
1.实验要求
有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4倍,请找出一个这样的四位数。
代码
#include<stdio.h> int main() { int a,b,c,d,n,m,temp;; for(n=1000;n<9999;n++) { a=n/1000; b=n%1000/100; c=n%1000%100/10; d=n%10; temp=a; a=d; d=temp; temp=b; b=c; c=temp; m=a*1000+b*100+c*10+d; if(n==m*4) { printf("%d",n); } } return 0; }
程序运行结果截图
2.实验要求输入任意一个多位的数字,求各位数字之和。如果在【1,12】之内,则输出与和数字对应的月份的英文名称,否则输出***。
样例: 输入123, 输出 6 June
输入12345,输出 15 ***
代码
#include<stdio.h> int main() { long n; int sum=0; printf("请输入 一个整数:\n"); scanf("%ld",&n); while(n>0) { sum=sum+n%10; n=n/10; } if(sum<=12) { switch(sum) { case 1: printf("%d,January\n",sum); break; case 2: printf("%d,February\n",sum); break; case 3: printf("%d,March\n",sum); break; case 4: printf("%d,April\n",sum); break; case 5: printf("%d,May\n",sum); break; case 6: printf("%d,June\n",sum); break; case 7: printf("%d,July\n",sum); break; case 8: printf("%d,Auguest\n",sum); break; case 9: printf("%d,September\n",sum); break; case 10: printf("%d,October\n",sum); break; case 11: printf("%d,November\n",sum); break; case 12: printf("%d,December\n",sum); break; } } else printf("%d,***",sum); return 0; }
程序运行结果截图
3.实验要求
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:输入在一行中给出A。
输出格式:输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:2
输出样例:234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
代码
#include<stdio.h> int main() { int A,B,m,n,a,b,c,d; printf("请输入一个不超过6的正整数:\n"); scanf("%d‘\n‘",&A); B=A+(A+1)+(A+2)+(A+3); n=0; for(a=A;a<=(A+3);a++) { for(b=A;b<=(A+3);b++) { for(c=A;c<=(A+3);c++) { if(b==a) { continue; } for(c=A;c<=(A+3);c++) { if(c==a) { continue; } if(c==b) { continue; } for(d=A;d<=(A+3);d++) { if(d==a) { continue; } if(d==b) { continue; } if(d==c) { continue; } if(B==a+b+c+d) { m=a*1000+b*100+c*10+d; printf("%d",m/10); n=n+1; if(n%6==0) { printf("\n"); } else { printf(" "); } } } } } } } return 0; }
程序运行结果
4.自动出题
代码
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int i,n=0,a,b,d,answer,sum,difference,product,quotient,remainder,result,num; char op,f; num=0; do { n=n+5; for(i=1;i<=5;i++) { srand(time(NULL)); a=rand()%100+1; b=rand()%100+1; d=rand()%4+1; switch(d) { case 1: op=‘+‘; sum=a+b; printf("%d%c%d=?\n",a,op,b); scanf("%d",&answer); if(answer==sum) { printf("恭喜,答对了\n"); num=num+1; } else { printf("答案错误,正确答案是%d\n",sum); } break; case 2: op=‘-‘; difference=a-b; printf("%d%c%d=?\n",a,op,b); scanf("%d",&answer); if(answer==difference) { printf("恭喜,答对了\n"); num=num+1; } else { printf("答案错误,正确答案是%d\n",difference); } break; case 3: op=‘*‘; product=a*b; printf("%d%c%d=?\n",a,op,b); scanf("%d",&answer); if(answer==product) { printf("恭喜,答对了\n"); num=num+1; } else { printf("答案错误,正确答案是%d\n",product); } break; case 4: op=‘/‘; quotient=a/b; remainder=a%b; printf("%d%c%d=?请输入商和余数\n",a,op,b); scanf("%d%d",&answer,&result); if(answer==quotient&&result==remainder) { printf("恭喜,答对了\n"); num=num+1; } else { printf("答案错误,正确答案是%d,%d\n",quotient,remainder); } break; } } printf("你的正确率是%.2f\n",num/(float)n); printf("是否继续?是输入y,否输入n\n"); scanf(" %c",&f); if(f!=‘y‘) { break; } }while(1); return 0; }
程序运行结果截图
二、知识点总结
(一)顺序结构
变量和常量
变量用于程序中存放数据,即一个存放数据的内存单元,这个内存单元中的数据是可以不断被变化的。
一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。
变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。标识符:用来标识变量、常量、函数、数组、类型、文件的有效字符序列
标识符由字母、数字、下划线组成,且第一个字母必须是字母或下划线,大小写敏感,长度通常不超过31个字母。
变量赋值和初始化
赋值运算符: =
格式:变量标识符 = 表达式
作用:将一个数据(常量或表达式)赋给一个变量
数据类型
整型数据
int类型是处理整型数据的基本选择,可以是正值、负值和0,其取值范围依赖于计算机系统。早期计算机是16位系统,因此,int在内存中占2个字节16位,表示数据的范围-32768~32767。
现在计算机为32位系统,则int在内存中占4个字节32位,表示数据范围为-231 ~(231-1)
十进制整数:由数字0~9和正负号表示.如 123,-456,0
八进制整数:由数字0开头,后跟数字0~7表示.如0123,011
十六进制整数:由0x开头,后跟0~9,a~f,A~F表示. 如0x123,0xff
(1) short int类型,简写为short类型,16位。
(2) long int类型,简写为long类型,32位。
(3) long long int类型,简写为long long类型,64位。
(4) unsigned int类型,用于非负值的场合,取值范围比有符号数扩大一倍。如16位unsigned int取值范围为0~65535。
在整常量后加字母l或L,认为它是long int 型常量
字符数据
(1) 字符型数据类型标识符char。在内存中占用一个字节,以所存字符的ASCII码存储。字符ASCII码值为0-255。
(2) 字符常量:用单引号括起来的单个普通字符或转义字符。’a’ –97 ‘A’—65 ‘0’—48 ‘\n’--10
(3) 转义字符:反斜线后面跟一个字符或一个代码值表示转义字符及其含义。
(4) 字符变量:字符型变量用来存放字符常量,只能放一个字符。一个字符变量在内存中占一个字节。
(5) 既可以以字符形式输出又可以以整数形式输出。以字符型数据输出时,先将存储单元中的ASCII码值转换成相应字符,然后再输出。以整数形式输出时,直接将ASCII码作为整数输出。字符型数据还可以进行算数运算,相当于他们的ASCII码值参与运算
(6) 字符串常量:用双引号(“”)括起来的字符序列字符常量与字符串常量不同。比如‘a’ 长度为1个字符,“a”长度为2个字符。
(7) 字符型数据的输入输出c格式符:在输入输出函数中,字符型数据的格式控制使用%c表示,用来输入输出一个字符。
(8) putchar函数(字符输出函数)格式: putchar( c ) putchar函数(字符输出函数)格式: putchar( c )
格式化输入函数scanf
格式:scanf(“格式控制串”,地址表列)
格式控制串指定输入数据的格式与类型,由“%”和格式字符组成,用双引号括起来,地址表列表示输入数据存放的变量地址,常用取地址运算符&,并依次用逗号分割。
d格式符:每个%d对应一个输入的十进制int值
scanf(“%d%d”,&a,&b);
scanf函数中的“格式控制串”后面应当是变量地址,而不应是变量名。
scanf(“%d,%d”,a,b);错
scanf(“%d,%d”, &a, &b);对
如果在“格式控制串”中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。
格式化输出函数printf
格式:printf(“格式控制串”,输出表列)
格式控制串指定输出数据的格式与类型,由“%”和格式字符组成,输出表列表示要输出的数据,依次用逗号分割。每个%d对应于输出表列中int变量、int常量或int类型的表达式。
printf(“%d,%d”,a,b);
在格式控制串中,只有含%的格式符会被替换为后面对应位置的数据输出,其它的内容则原样输出。
(1)%ld,输出长整型数据
(2)%o,以八进制无符号形式输出整数。
(3) x格式符,以十六进制无符号形式输出整数。
C语言程序基本结构
声明 |
Declaration |
int a,b,sum; |
输入 |
Input |
scanf("%d%d",&a,&b); |
计算 |
Compute |
sum = a+b; |
输出 |
Output |
printf("%d+%d=%d\n",a,b,sum); |
(二)选择结构
关系运算符和关系表达式
种类:< <= == >= > !=
结合方向:自左向右
关系运算符的优先级低于算术运算符,高于赋值运算符
关系表达式:用关系运算符将两个表达式连接起来的式子,称关系表达式。
关系表达式的值:是逻辑值“真”或“假”,用1和0表示
逻辑运算符和逻辑表达式
种类: ! && ||
逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。
逻辑表达式的值:是逻辑值“真”或“假”,用1和0表示
C语言中 ,运算量 : 0表示假 ,非 0表示真
运算结果 :假用0表示 ,真用1表示
逻辑运算符的短路特性:若表达式的值可由先计算的左操作数的值单独推导出来,那么将不再计算右操作数的值。
复合语句
由一对花括号{}括起来的一组语句,称为复合语句,在语法上视为一条语句。
条件运算符
一般形式: 表达式1 ? 表达式2 : 表达式
功能:如果表达式1的值为非0,则表达式2的值作为条件表达式的值,否则以表达式3的值作为条件表达式的值。
条件表达式常用于赋值语句中。
if…else语句
if…else语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
格式: if(表达式)
{
语句
}
功能:首先对表达式求解,若表达式的值为真,则执行语句1,否则执行语句2。
格式:
if (表达式)
{
语句1
}
else
{
语句2
}
功能:依次判断表达式的值,当某个表达式 i 为真时,则执行其对应的语句 i ,然后执行if语句后面的程序。如果所有的表达式均不为真,则执行语句n+1,然后执行后续程序。
格式:
if(表达式1)
{ 语句1 }
else if(表达式2)
{ 语句2 }
…
else if(表达式n)
{ 语句n }
else
{ 语句n+1 }
switch…case语句
switch(表达式)
{
case 常量1:
语句序列1
break;
case 常量2:
语句序列2
break;
…
default :语句序列n
}
表达式是整数型的结果
常量可以是常数也可以是常量表达式,且值互不相同。
根据表达式的结果,寻找匹配的case,并执行case后面的语句,直到break为止。
所有的case都不匹配,则执行default后面的语句
swith语句的穿透性
“case 常量”只是起语句标号作用,在执行完该分支的语句后,若没有break语句,则会顺序执行到下一个case分支中去,称之为switch语句的穿透性。因此,为了保证各分支的正确执行,必须用break语句跳出。
(三)循环结构
for 语句
for(表达式1;表达式2;表达式3)
{
循环体语句
}
for语句中表达式可以部分或全部省略,但两个“;”不能省略。当省略表达式2时,因为缺少循环条件的判断,会形成无限循环。
for语句中的表达式可以是任意有效的C语言表达式。
表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。
while 语句
while(表达式)
{
循环体语句;
}
特点:
先判断表达式,后执行循环体,循环体有可能一次也不执行
do ~ while 语句
do
{
循环体语句;
} while(表达式);
特点:
先执行循环体,后判断表达式,至少执行一次循环体。
循环次数已知 |
计数控制的循环 for语句 |
循环次数未知 由给定条件控制 |
条件控制的循环 while语句 |
循环体至少要执行一次 |
do…while语句 |
2.break和continue区别何在?
都是循环控制语句。
break语句:在循环语句和switch语句中,终止并跳出循环体或开关体。
break只能终止并跳出最近一层的结构
break只能用于循环语句和switch语句中
在循环语句中,break语句一般都是与if语句一起使用。
while(表达式1)
{
语句组1
if(表达式2) break;
语句组2
}
continue语句:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。
continue语句只能用在循环语句中。一般都是与if语句一起使用。
while(表达式1)
{
语句组1
if(表达式2) continue;
语句组2
}
continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
3.从本次课开始,我们接触到了一些典型算法,对累加型问题和阶乘型问题进行总结,注意事项是什么?
累加:
和初始化为0或第一项
关键是寻找累加和的构成规律(通项)
1. 寻找累加项与循环变量之间的关系
2. 寻找累加项前后项之间的关系
s=0;
for( i=1 ;i<=n ;i++ )
{
s=s+通项;
}
阶乘:乘积初始化为1
p=1;
for( i=1 ;i<=n ;i++ )
{
p=p*通项;
}
4.理解循环嵌套
三种循环可互相嵌套,层数不限
外层循环可包含两个以上内循环,但不能相互交叉。
for( ; ;)
{ ……
do
{ ……
}while();
……
while()
{ ……
}
…...
}
三、实验总结
1.外层循环只能循环一次,内层循环一次运行
2.字符型数据只占一个字节
第六次作业