小白学C语言的记录博。
题目都是实验课老师布置的,代码有参考其他大佬,特此致谢!
使用教材:C语言程序设计(第3版) 何钦铭、颜晖主编 高等教育出版社
一、C程序的编程环境和运行方法
1
在屏幕上显示语句。
#include<stdio.h>
int main()
{
printf("Welcome to You!\n");
return 0;
}
样例
2
加法运算。
#include <stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("sum=%d\n",a+b);
return 0;
}
样例
3
加法运算。
#include<stdio.h>
int main(void)
{
int a,b,sum;
a=123;
b=456;
sum=a+b;
printf("sum is %d\n",sum);
return 0;
}
样例
二、顺序结构程序设计
1
将华氏温度转换为摄氏温度。
#include <stdio.h>
int main()
{
float c,f;
scanf("%f",&f);
c=(5.00/9)*(f-32);
printf("c=%.2f\n",c,f);
return 0;
}
样例
2
计算圆柱体体积。
#include<stdio.h>
#define PI 3.1415926
int main(void)
{
float r,h,v;
scanf("%f%f",&r,&h);
printf("v=%.2f\n",PI*r*r*h);
return 0;
}
样例
3
计算一元二次方程ax²+bx+c=0的根x₁,x₂。
自编(if-else语句)
#include<stdio.h>
#include<math.h>
int main(void)
{
float a,b,c,delt,x1,x2;
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
delt=b*b-4*a*c;
if(delt>=0){
x1=(-b+sqrt(delt))/(2*a),x2=(-b-sqrt(delt))/(2*a);
printf("x1=%.2f\nx2=%.2f",x1,x2);
return 0;
}
else{
printf("error\n");
return 0;
}
}
范例(顺序结构)
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,delt,x1,x2;
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
delt=b*b-4*a*c;
printf("x1=%.2f\n",(-b+sqrt(delt))/(2*a));
printf("x2=%.2f",(-b-sqrt(delt))/(2*a));
return 0;
}
样例
三、分支结构
1
输入月份1-12,输出其对应的季节。
#include<stdio.h>
int main(void)
{
int n;
scanf("%d",&n);
if(n==2||n==3||n==4){
printf("Spring");
}
else if(n==5||n==6||n==7){
printf("Summer");
}
else if(n==8||n==9||n==10){
printf("Autumn");
}
else if(n==11||n==12||
n==1){
printf("Winter");
}
else{
printf("Error");
}
return 0;
}
样例
2
输入一个整数,判断它能否被3,5整除,并输出该数所属类型。A:能同时被3,5整除;B:能被3整除;C:能被5整除;D:不能被3,5任一个整除。
#include<stdio.h>
int main(void)
{
int n;
scanf("%d",&n);
if(n%3==0&&n%5==0)
printf("A");
else if(n%3==0)
printf("B");
else if(n%5==0)
printf("C");
else
printf("D");
return 0;
}
3
输入x,求分段函数的值,函数如下,函数值保留两位小数:
#include<stdio.h>
int main(void)
{
float x,y;
scanf("%f",&x);
if(x<1){
y=x;
printf("y=%.2f",y);
}
else if(x<10){
y=x-1;
printf("y=%.2f",y);
}
else{
y=3*x-11;
printf("y=%.2f",y);
}
return 0;
}
样例
4
输入三个点的坐标值,若该三点能构成三角形则输出周长和面积,否则输出Impossible。(三角形判断条件:任意两边之和大于第三遍)
#include<stdio.h>
#include<math.h>
int main(void)
{
float x1,x2,x3,y1,y2,y3;
float a,b,c,L,S;
scanf("%f,%f",&x1,&y1);
scanf("%f,%f",&x2,&y2);
scanf("%f,%f",&x3,&y3);
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
if(a+b>c&&a+c>b&&c+b>a){
L=a+b+c;
S=sqrt(0.5*L*(0.5*L-a)*(0.5*L-b)*(0.5*L-c));
printf("primeter=%.2f,area=%.2f\n",L,S);
}
else{
printf("Impossible\n");
}
return 0;
}
样例
5
输入三个整数a、b、c,将它们由大到小依次显示出来。
#include<stdio.h>
int main(void)
{
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
if(a>b){
if(b>c){
printf("%d,%d,%d",a,b,c);
}
else if(a>c){
printf("%d,%d,%d",a,c,b);
}
else{
printf("%d,%d,%d",c,a,b);
}
}
else{
if(a>c){
printf("%d,%d,%d",b,a,c);
}
else if(b>c){
printf("%d,%d,%d",b,c,a);
}
else{
printf("%d,%d,%d",c,b,a);
}
}
return 0;
}
样例
第4题和第5题,scanf的格式控制字符串中我添加了逗号,运行时也输入了逗号,但是运行结果总是出错,想问是哪里出了问题?
隔天,我发现不是代码的问题,而是我的输入法的问题,我的输入法在不同软件上中英文切换是不同步的,在运行时输入我用的是中文标点所以导致出错。
6
输入一个大写字母,输出该字母及其对应的ASCII码值,同时输出其小写字母及其对应的ASCII码的值。
#include<stdio.h>
int main(void)
{
char ch;
ch=getchar();
if(ch>='A'&&ch<='Z')
{
printf("upper:%c,%d\n",ch,ch);
printf("lower:%c,%d\n",ch+32,ch+32);
}
return 0;
}
样例
7
输入两个数字字符并分别存放在字符型变量a和b中(char a,b;),将这两个数字字符对应的数值相加并输出。
#include<stdio.h>
int main(void)
{
char a,b;
int c;
scanf("a=%c,b=%c",&a,&b);
c=a-'0'+b-'0';
printf("%d+%d=%d",a-'0',b-'0',c);
return 0;
}
样例
8
输入一个3位的整数,然后将它们逆序输出。
#include<stdio.h>
int main(void)
{
int n;
scanf("%d",&n);
printf("%d",(n%10)*100+(n/10%10)*10+n/100);
return 0;
}
样例
9
输入1个字母后,输出该字母的前序字母、该字母、该字母的后序字母(例如:输入g,则输出fgh;输入a,则输出zab;输入M,则输出LMN;输入Z,则输出YZA),若不是字母则显示该字符本身。
#include<stdio.h>
int main(void)
{
char b;
b=getchar();
if((b>='b'&&b<='y')||(b>='B'&&b<='Y'))
printf("%c%c%c",b-1,b,b+1);
else if(b=='A'||b=='a')
printf("%c%c%c",b+25,b,b+1);
else if(b=='Z'||b=='z')
printf("%c%c%c",b-1,b,b-25);
else
putchar(b);
return 0;
}
样例
10
教材P66-三(3):出租车计价问题。
#include<stdio.h>
int main(void)
{
float h,n,m;
int t;
scanf("%f,%d",&h,&t);
if(t<5)
n=0;
else
n=t/5*2;
if(h<=3){
m=10;
printf("money=%.0f",m+n+0.5);
}
else if(h<=13){
m=10+(h-3)*2;
printf("money=%.0f",m+n+0.5);
}
else{
m=10+(10-3)*2+(h-10)*3;
printf("money=%.0f",m+n+0.5);
}
return 0;
}
样例
11
将人生按照年龄划分为童年[A](0<age<10)、少年[B](10≤age<20)、青年[C](20≤age<30)、中年[D](30≤age<50)、老年[E](50≤age<70)、暮年[F](≥70),现编程输入一个人的年龄(整数),输出他所属的年龄阶段(要求:使用switch或if与switch嵌套结构完成,非法年龄则显示Error。
#include<stdio.h>
int main(void)
{
int n;
scanf("%d",&n);
if(n>0){
switch(n){
case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:
printf("age=%d:A\n",n);
break;
case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:
printf("age=%d:B\n",n);
break;
case 20:case 21:case22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:
printf("age=%d:C\n",n);
break;
case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:
case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:
printf("age=%d:D\n",n);
break;
case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 58:case 59:
case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:
printf("age=%d:E\n",n);
break;
default:
printf("age=%d:F\n",n);
break;
}
}
else
printf("Error");
return 0;
}
样例
12
某年某月某日是当年的第几天(switch月份倒序)。
#include<stdio.h>
int judgeyear(int year){
int flag=0;//平年返回0
if ((year%4==0 && year%100 !=0) || year%400==0)
flag=1;//闰年返回1
return flag;
}
/*本题不考虑日期的合法性,输入的日期是合法的*/
int main()
{
int year,month,day;
int dayNumber=0;
scanf("%d%d%d",&year,&month,&day);
switch (month){
case 12:dayNumber +=30;
case 11:dayNumber +=31;
case 10:dayNumber +=30;
case 9 :dayNumber +=31;
case 8 :dayNumber +=31;
case 7 :dayNumber +=30;
case 6 :dayNumber +=31;
case 5 :dayNumber +=30;
case 4 :dayNumber +=31;
case 3 :if((year%4==0 && year%400!=0)||year%400==0){dayNumber +=29;}else {dayNumber +=28;};//3月的情况,请填写多行代码
case 2 :dayNumber +=31;//2月的情况,请填写一行代码
case 1 :dayNumber +=0;break;//1月的情况,请填写多行代码
default:printf("Input error!");
}
printf("%d",dayNumber+day);
}
样例
四、循环结构
1
输入多个字符(以回车作为输入的结束),统计其中大小写元音字母的个数。
#include <stdio.h>
int main (void)
{
char n;
int Lower,Capital;
Lower=0;
Capital=0;
scanf("%c",&n);
while((n=getchar())!='\n')
{ if(n=='A'||n=='E'||n=='I'||n=='O'||n=='U')
Capital++;
else if(n=='a'||n=='e'||n=='i'||n=='o'||n=='u')
Lower++;
}
printf("Lower:%d\nCapital:%d",Lower,Capital);
return 0;
}
样例
2
编程按每行5个数来输出200以内所有能被7或17整除的偶数,并求出其和。
#include<stdio.h>
int main(void)
{
int count,i,n,sum;
count=0;
n=200;
sum=0;
for(i=2;i<=n;i+=2)
{ if(i%7==0 || i%17==0)
{printf("%6d",i);
sum=sum+i;
count++;
if(count%5==0)
printf("\n");
}
}
printf("\nSum=%d",sum);
}
样例
3
输入一个年份区间,例如[1900,2015],求该区间内的闰年的个数。
#include <stdio.h>
int main()
{
int y1,y2,count=0,i;
scanf("[%d,%d]",&y1,&y2);
if(y1>y2)
{
i=y1;
y1=y2;
y2=i;
}
for(i=y1;i<=y2;i++)
if((i%400==0) || (i%4==0 && i%100!=0))
count++;
printf("years=%d",count);
return 0;
}
样例
4
输入两个正整数,求它们的最大公约数和最小公倍数。
#include <stdio.h>
int getgys(int a,int b)
{
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}
return a;
}
int main (void)
{
int a,b,gys,gbs;
scanf("%d,%d",&a,&b);
gys=getgys(a,b);
gbs=a*b/gys;
printf("gys=%d,gbs=%d",gys,gbs);
return 0;
}
样例
5
教材P92课后习题三(4):求序列和。
#include <stdio.h>
#include <math.h>
int main (void)
{
int i,a,n;
int sum,f1,f2,m;
sum=0;
scanf("%d,%d",&a,&n);
f1=a;
printf("%d",a);
for(i=1;i<n;i++)
{ f2=a*(pow(10,i))+f1;
f1=f2;
printf("+%d",f1);
sum=sum+f1;
}
sum=sum+a;
printf("=%d",sum);
return 0;
}
样例
6
猴子吃桃问题:一只猴子第一天摘了一堆桃子,每天它都要吃掉一半,之后还要多吃一个,如此吃法,到第n天一早起来时,它发现只剩下一个桃子了,从键盘上输入n,求它第一天摘的桃子总数。
#include <stdio.h>
int main(void)
{
int i,x=1,n;
scanf("%d",&n);
for(i=1;i<n;i++)
{
x=(x+1)*2;
}
printf("Totals=%d",x);
return 0;
}
样例
7
教材P92课后习题三(2):展开式求和。
#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
int i=1;
double item=1,sum=0;
double x;
scanf ("%lf",&x);
while (fabs(item)>=0.00001)
{
item=pow(x,i)/fact(i);
sum+=item;
i++;
}
printf ("s=%.2lf",sum);
return 0;
}
double fact (int n)
{
int j;
double fact;
fact=1;
for (j=1;j<=n;j++)
fact*=j;
return fact;
}
8
菱形图像显示问题:输入一个正奇数([5,21]区间内),显示由*组成的菱形图像。
#include<stdio.h>
int main (void)
{
int n,j,i;
scanf("%d",&n);
if(n>=5 && n<=21 && n%2!=0)
{
for(i=1;i<=n/2+1;i++)
{ for(j=1;j<=n/2+i;j++)
{ if(j>=n/2-i+2)
printf(" *");
else
printf(" ");
}
printf("\n");
}
for(i=n/2;i>=1;i--)
{ for(j=1;j<=n/2+i;j++)
if(j>=n/2-i+2)
printf(" *");
else
printf(" ");
printf("\n");
}
}
return 0;
}
9
中国古代数学家张丘建提出的“百鸡问题”:一只大公鸡值五个钱,一只母鸡值三个钱,三个小鸡值一个钱。现有100个钱,要刚好买100只鸡,且三种鸡都有。
#include <stdio.h>
int main(void)
{ int x,y,z;
for(x=1;x<=20;x++)
for(y=0;y<=33;y++)
for(z=0;z<=100;z+=3)
if(x+y+z==100 && 5*x+3*y+z/3==100)
printf("%5d%5d%5d\n",x,y,z);
return 0;
}
10
输入n,求[1,n]之间所有完数(一个数等于它的所有因子之和,这个数就称为完数,例如28的因子1+2+4+7+14=28,则28即为一个完数)。
#include <stdio.h>
int main (void)
{ int i,j,n,s;
scanf("%d",&n);
for(i=2;i<=n;i++)
{ s=0;
for(j=1;j<i;j++)
{ if(i%j==0)
s+=j;
}
if(s==i)
printf("%d\n",i);
}
return 0;
}
11
输入年、月、日,输出该日是该年的第几天。
#include<stdio.h>
int main()
{ int year,month,day,days,i,d;
printf("input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
days=0;
for(i=1;i<month;i++)
{ switch(i)
{ case 1:case 3:case 5:case 7:case 8:case 10:case 12:d=31;break;
case 4:case 6:case 9:case 11:d=30;break;
case 2:
if((year%4==0 && year%100!=0)|| year%400==0)
d=29;
else
d=28;
}
days=days+d;
}
printf("%d年%d月%d日是第%d天\n",year,month,day,days+day);
return 0;
}
12
编程输出如下图形(要求以第30列为对称轴,即菱形的顶点在第30列)。
#include <stdio.h>
int main(void)
{ int i,j;
for (i=1;i<=7;i++)
{ for (j=1;j<=30-i;j++)
printf(" ");
for (j=1;j<=2*i-1;j++)
printf("%d",i);
printf("\n");
}
for(i=6;i>0;i--)
{ for(j=29-i;j>=0;j--)
printf(" ");
for(j=2*i-2;j>=0;j--)
printf("%d",i);
printf("\n");
}
return 0;
}
12
素数问题:输入正整数n,m,求不大于n的m个互不相同的最大的素数。
代码错误,待修正!
#include <stdio.h>
#include <math.h>
int main (void)
{ int i,j,t;
int n,m;
scanf("%d,%d",&n,&m);
for(i=n;i>0;i--)
{ t=sqrt(i);
for(j=2;j<=t;j++)
if(j%i==0) break;
if(j>t)
{ printf("%d\n",j);
m--;
}
if(m==0) break;
}
return 0;
}
13
求水仙花数。(3-17,因为用了数学函数,从8开始运行速度就很慢了)
#include<stdio.h>
int power(int x,int y)
{
int i=1,a=1;
while(i<=y)
{ a=a*x;
i++;
}
return a;
}
int main(void)
{
int i,h,n,s,m=0,b;
scanf("%d",&n);
if(n>=3 && n<=17)
{ for(s=power(10,n-1);s<power(10,n);s++)
{ b=s;
m=0;
for(i=1;i<=n;i++)
{ h=b%10;
m=m+power(h,n);
b=b/10;
}
if(m==s) printf("%d\n",m);
}
}
return 0;
}
14
从键盘输入两个整型变量a和n的值,求a+aa+aaa+aa……a(n个a)之和。例如,若输入2和3,则输出序列和为246(2+22+222)。
#include <stdio.h>
#include <math.h>
int fun (int a,int n)
{
int i,x=0;
for (i=1;i<=n;i++)
{ x+=a;
a*=10;
}
return x;
}
int main (void)
{
int a,n,j,s=0;
scanf("%d %d",&a,&n);
for (j=1;j<=n;j++)
s+=fun(a,j);
printf("s=%d",s);
return 0;
}
15
教材P145:第6章课后习题题三(3)-使用函数显示给定范围内的完数。
代码错误,待修正!
#include <stdio.h>
int factorsum (int m,int n)
{
int i,j,s;
for (i=m;i<=n;i++)
{ s=0;
for (j=1;j<i;j++)
if (i%j==0)
s+=j;
if (s==i)
return s;
}
}
int main (void)
{
int m,n,i;
scanf("%d,%d",&m,&n);
if (m>=1 && n<=1000)
for (i=m;i<=n;i++)
printf("%d\n",factorsum(m,n));
return 0;
}
16
教材P117:第5章课后习题题三(5)-使用函数统计指定数字(2)的个数。
#include <stdio.h>
int countdigit (int number,int digit)
{
if (number=='2')
digit++;
return digit;
}
int main (void)
{ char n;
int count=0;
while ((n=getchar())!='\n')
count=countdigit(n,count);
printf("count=%d",count);
return 0;
}
17
编写一个闰年判断函数【int Isleap(int year)】、一个验证日期合法性的函数【int IsDate(int year,int month,int day)】和一个计算日期对应天数的函数【int Days(int year,int month,int day),要求计算前调用IsDate()函数判断日期的合法性,调用Isleap()判断闰年】,在main函数输入给定日期的年-月-日,调用Days函数求出这天是该年的第几天。
#include<stdio.h>
int lpy[]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年每月天数
int nlp[]={31,28,31,30,31,30,31,31,30,31,30,31};//非闰年每月天数
int Isleap(int year) //判断闰年
{ if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
int Isdate(int year,int month,int day) //判断日期的合法性
{ if(year<1000||year>9999||month<1||month>12) return 0;//年份4位整数,月份介于1-12
if(Isleap(year))
if(day<=0||day>lpy[month-1])
return 0;
else
return 1;
else
if(day<=0||day>nlp[month-1])
return 0;
else
return 1;
}
int Days(int year,int month,int day) //计算天数
{ int i,days=0;
if(Isleap(year))
for(i=1;i<month;i++)
days+=lpy[i-1];
else
for(i=1;i<month;i++)
days+=nlp[i-1];
return days+day;
}
int main()
{ int y,m,d;
scanf("%d-%d-%d",&y,&m,&d);
if(Isdate(y,m,d))
printf("NO:%d",Days(y,m,d));
else
printf("DateError");
return 0;
}
五、数组
1
从键盘输入一个十进制正整数n,将n转换成二进制并输出。
#include <stdio.h>
int main (void)
{
int n,i=0,a[30];
scanf("%d",&n);
while (n!=0)
{
a[i]=n%2;
n=n/2;
i++;
}
for (i=i-1;i>=0;i--)
printf("%d",a[i]);
return 0;
}
2
从键盘任意输入一个整数x,在数组a中顺序查找,如果找到,则给出该数所在的下标值。
#include <stdio.h>
int main (void)
{
int a[10]={1,2,3,4,5,6,7,8,9,10},i,x;
scanf("%d",&x);
i=0;
while (a[i]!=x)
i++;
if (i<10)
printf("pos:%d",i);
else
printf("no!");
return 0;
}
3
输入10个整数,求大于平均值的偶数和奇数各有多少个?
#include <stdio.h>
int main (void)
{ int a[10],i,even=0,odd=0;
double p,s=0;
for (i=0;i<10;i++)
{ scanf("%d\n",&a[i]);
s+=a[i];
}
p=s/10;
for (i=0;i<10;i++)
{if (a[i]>p)
{ if (a[i]%2==0)
even++;
else
odd++;
}
}
printf("Even:%d\nOdd:%d",even,odd);
return 0;
}
4
教材P176:第7章课后习题题三(1)-选择法排序。
#include <stdio.h>
int main (void)
{
int i,index,k,n,t;
int a[10];
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (k=0;k<n-1;k++)
{
index=k;
for (i=k+1;i<n;i++)
if (a[i]>a[index])
index=i;
t=a[index];
a[index]=a[k];
a[k]=t;
}
printf("Result:");
for (i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}