/*
从键盘输入一个一百分制成绩(无小数),
将输入的数据转换成等级“ABCDEFGHIJX”。
90 ~ 100→A,80 ~ 89→B,70 ~ 79→C,
60 ~ 69→D,50 ~ 59→E,40 ~ 49→F,
30 ~ 39→G,20 ~ 29→H,10 ~ 19→I,0 ~ 9→J,
其它输入超正常范围分数的则为X。
*/
#include <stdio.h>
int main(void)
{
int score,grade;
printf("please input the score(0~100):");
scanf("%d",&score);
grade = score/10;
if(score>=0 && score<=100){
switch(grade){
case 0:
printf("score=%d,grade=J\n",score);
break;
case 1:
printf("score=%d,grade=I\n",score);
break;
case 2:
printf("score=%d,grade=H\n",score);
break;
case 3:
printf("score=%d,grade=G\n",score);
break;
case 4:
printf("score=%d,grade=F\n",score);
break;
case 5:
printf("score=%d,grade=E\n",score);
break;
case 6:
printf("score=%d,grade=D\n",score);
break;
case 7:
printf("score=%d,grade=C\n",score);
break;
case 8:
printf("score=%d,grade=B\n",score);
break;
case 10:
case 9:
printf("score=%d,grade=A\n",score);
break;
default:
printf("X\n");
}
}else
printf("X\n");
return 0;
}
总结:
①通过switch多分枝语句实现成绩评等级。
/*
从键盘读入一个等级成绩,输出对应的百分制成绩。
A→95、B→85、C→75、D→65、
E→55、F→45、G→35、H→25、
I→15、J→0。
若输入的等级成绩非A ~ J,则输出“Error”。
*/
#include <stdio.h>
int main(void)
{
char grade,score;
printf("please input the grade:");
scanf("%c",&grade);
if(grade<'A' || grade>'J'){
printf("Error\n");
}else{
switch(grade){
case 'A':
score=95;
break;
case 'B':
score=85;
break;
case 'C':
score=75;
break;
case 'D':
score=65;
break;
case 'E':
score=55;
break;
case 'F':
score=45;
break;
case 'G':
score=35;
break;
case 'H':
score=25;
break;
case 'I':
score=15;
break;
case 'J':
score=0;
break;
default:;
}
printf("grade=%c,score=%d\n",grade,score);
}
return 0;
}
总结:
①利用switch多分枝语句实现输入等级,输出对应的分数。
/*
字符串“abcd”每个字符都向右移位,
最右的则移动到第一个字符的位置,就变为“dabc”,
这称为对串进行位移为1的轮换。
同理,“abcd”变为“cdab”则称为位移为2的轮换。
要求从键盘读入一个字符串str
(约定字符串中字符数 ≤ 80字节,字符串中可以有空格)
和需要位移的值n(n > str的长度时,循环位移),
输出对该字符串进行位移为n的轮换结果。
*/
#include <stdio.h>
#include <string.h>
int main(void){
char str[81];
int num,len,i;
printf("Please input the string:");
gets(str);
len = strlen(str);
printf("Please input n:");
scanf("%d",&num);
printf("\nThe result is:");
if (num <= len){
for(i = len-num;i < len;i++){
printf("%c",str[i]);
}
for(i = 0;i < len-num;i++){
printf("%c",str[i]);
}
}
else{
for(i = len-num%len;i < len;i++){
printf("%c",str[i]);
}
for(i = 0;i < len-num%len;i++){
printf("%c",str[i]);
}
}
putchar('\n');
return 0;
}
总结:
①这里使用gets()函数获取字符,用putchar()函数输出字符。
②句内逻辑看一遍代码还不算难。
/*
从键盘输入3个可带空格的字符串
(约定:字符数 ≤ 127字节),
输出长度最大的字符串的长度。
*/
#include <stdio.h>
#include <string.h>
int main(void){
char str1[128],str2[128],str3[128];
printf("Please input the first string:\t");
gets(str1);
printf("Please input the second string:\t");
gets(str2);
printf("Please input the third string:\t");
gets(str3);
if(strlen(str1) > strlen(str2)){
if(strlen(str1) > strlen(str3)){
printf("最长字符串长度为:%d\n",strlen(str1));
}
else{
printf("最长字符串长度为:%d\n",strlen(str3));
}
}
else{
if(strlen(str2) > strlen(str3)){
printf("最长字符串长度为:%d\n",strlen(str2));
}
else{
printf("最长字符串长度为:%d\n",strlen(str3));
}
}
return 0;
}
总结:
①使用gets()函数strlen()统计字符串的长度。
②这里还可以定义一个变量接收最大值,这样会看起来没那么臃肿。
/*
从键盘输入3个可带空格的字符串
(约定:字符数 ≤ 127字节),
输出最大的字符串。
*/
#include <stdio.h>
#include <string.h>
int main(void){
char str1[128],str2[128],str3[128],strmax[128];
printf("Please input the first string:\t");
gets(str1);
printf("Please input the second string:\t");
gets(str2);
printf("Please input the third string:\t");
gets(str3);
if(strcmp(str1,str2) > 0){
strcpy(strmax,str1);
}
else{
strcpy(strmax,str2);
}
if(strcmp(str3,strmax) > 0){
strcpy(strmax,str3);
}
printf("最大的字符串是:%s\n",strmax);
return 0;
}
总结:
①使用strcmp()函数比较字符串大小,比较规则是:自左到右,直到出现不同字符或'\0'为止。如果字符串1和字符串2相同时,函数值为0;如果字符串1 > 字符串2时,则函数值为一个正数;如果字符串1 < 字符串2时,则函数值为一个负数。
②strcpy()函数用于复制字符串。strcpy(A,B),是将B复制到A,并覆盖。
/*
设某企业2006年的产值为5000万,
计划以后每年的增长率为x
(x从键盘输入,例如输入8.75表示8.75%),
计算该企业的产值在哪年实现翻番以及翻番时的产值,
然后输出(输出时以万为单位,应考虑有小数)。
*/
#include <stdio.h>
int main(void){
double increase,output=5000;
int year;
printf("Please input x:");
scanf("%lf",&increase);
for(year = 2007;;year++){
output += output * increase/100;
if(output >= 10000){
break;
}
}
printf("year = %d 年,厂值 = %.2f\n",year,output);
return 0;
}
总结:
①这里的for循环没有结束条件,直到当满足内嵌的if条件时,才跳出循环,确实有点巧妙。
/*
从键盘读入一个字符串(约定:字符数 ≤ 127字节),
检查该字符串是否是回文。
所谓回文即正向与反向的拼写都一样,例如“adgda”。
*/
#include <stdio.h>
int main(void)
{
int i,j,n,flag=0;
char str[128];
printf("Please input string:");
gets(str);
n = strlen(str);
for(i=0,j=n-1;i<=j;i++,j--){
if(str[i]!=str[j]){
flag = 1;
break;
}
}
if(flag == 0){
printf("%s 是回数。\n",str);
}else
{
printf("%s 不是回数。\n",str);
}
return 0;
}
总结:
①通过循环遍历,不满足回数条件时,flag变为1,并跳出循环。
/*
猴子吃桃问题。
猴子第一天摘下若干个桃子,当即吃了一半,
还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第n(n从键盘输入)天早上想再吃时,
就只剩下一个桃子了。
求第一天共摘了多少个桃子
(不考虑猴子是否真的能吃多少桃子)。
*/
#include <stdio.h>
int main(void)
{
int n,total=1,i;
printf("Please input n:");
scanf("%d",&n);
for(i=n-1;i>=1;i--){
total = (total+1)*2;
}
printf("total=%d\n",total);
return 0;
}
总结:
①利用逆向思维:前一天的桃子个数 = (当天的桃子个数+1)* 2。
/*从键盘读入一个整数Num,
按从小到大的顺序依次输出所有满足条件的3位数:
该数各位数字的立方和等于Num。
*/
#include <stdio.h>
int main(void)
{
int Num,i,b,s,g,flag = 0;
printf("Please input n:");
scanf("%d",&Num);
for(i=100;i<1000;i++){
b = i/100;
s = i/10%10;
g = i%10;
if(b*b*b+s*s*s+g*g*g == Num){
printf("%d\t",i);
flag = 1;
}
}
if(flag == 0){
printf("not find!");
}
putchar('\n');
return 0;
}
总结:
①遍历100-999之间的数,若满足条件,则输出对应结果;若没有满足条件,则信号值变为0;
/*
从键盘读入两个整数iBegin和iEnd,(默认iEnd > iBegin)
要求输出 ≥ iBegin且 ≤ iEnd的所有整数。
*/
#include <stdio.h>
int main(void)
{
int i,iBegin,iEnd;
printf("Please Input two number");
scanf("%d%d",&iBegin,&iEnd);
printf("Result:");
for(i=iBegin;i<=iEnd;i++){
printf("%4d",i);
}
putchar('\n');
return 0;
}
总结:
①利用for循环,遍历输出两个数之间的数。