C语言集训

243 阅读5分钟

第三次作业

一.电杭题目

1.输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。2000

#include<stdio.h>
int main()
{
    char ch,cs,cd;
    char max,min,mzx;
    int i=0;

    printf("请输入字符\n");

    while (scanf("%c%c%c\n",&ch,&cs,&cd)!=EOF)
    {

    if (ch>cs)
       {
           max=ch;
           min=cs;
       }
    else
       {
            max=cs;
            min=ch;
       }
    if (cd>max)
       {
            mzx=max;
            max=cd;
       }
    else
       {
           if (cd>min)
           mzx=cd;
           else
           {
               mzx=min;
               min=cd;
           }

       }

    printf("%c %c %c\n",min,mzx,max);

    }

    return 0;

}

运行结果如图

image.png

在输入%c时第一次循环结尾的回车键会输入换行符,从而保存在缓冲区,从而扰乱代码正常输入,解决方法就为while (scanf("%c%c%c\n",&ch,&cs,&cd)!=EOF)

2.输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。2001

#include<stdio.h>
#include<math.h>
int main()
{
    float x1,x2,y1,y2;
    float d,d2,x,y;

    while (scanf("%f %f %f %f",&x1,&y1,&x2,&y2)==4)
    {
        x=(x1-x2)*(x1-x2);
        y=(y1-y2)*(y1-y2);
        d2=x+y;
        d=sqrt(d2);

        printf("两点间距离为:%.2f",d);

    }
    printf("恭喜计算成功\n");
    return 0;
}

运行结果如图

image.png

因为在代码中很难写出代码来开平方,所有要运用到数学库中的tfmath.h文件,同时运用scanf的返回值来控制循环,若输入4个数都为数字则循环继续,结束循环的话只需输入一个字符。

3.根据输入的半径值,计算球的体积。2002

#include<stdio.h>
#define PI 3.1415927
int main()
{
    float V,R;
    printf("请输入半径:\n");
    while (scanf("%f",&R)==1)
    {
        V=(4.0/3.0)*PI*(R*R*R);
        printf("%.31f",V);
    }
    return 0;

}

运行结果如图

image.png

4.求实数的绝对值。2003

#include<stdio.h>
int main()
{
    float ch;
    while (scanf("%f",&ch))
    {
        if (ch>0)
            printf("%.2f",ch);
        else
           {
           ch=-ch;
           printf("%.2f",ch);
           }
    }
    return 0;
}

运行结果如图

image.png

5.输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:\2004

90~100为A

80~89为B

70~79为C

60~69为D

0~59为E

#include<stdio.h>
int main()
{
    int fenshu;
    printf("请您输入分数\n");
    while (scanf("%d",&fenshu)==1)
    {
        if (fenshu>=90&&fenshu<=100)
            printf("您的成绩等级为A\n");
        else if (fenshu>=80&&fenshu<=89)
            printf("您的成绩等级为B\n");
        else if (fenshu>=70&&fenshu<=79)
            printf("您的成绩等级为C\n");
        else if (fenshu>=60&&fenshu<=69)
            printf("您的成绩等级为D\n");
        else if (fenshu>=0&&fenshu<=59)
            printf("您的成绩等级为E\n");
        else
            printf("Score is error!");
    }
    printf ("以上即为成绩等级\n");

    return 0;
}

运行结果如图

image.png

6.第几天?2005

#include<stdio.h>
//某某月前的日期总数(比如:五月前有89天)
#define ER 31
#define SAN 59
#define SI 90
#define WU 120
#define LIU 151
#define QI 181
#define BA 212
#define JIU 243
#define SHI 273
#define SHIYI 304
#define SHIER 334
int main()
{
   int nian;
   int yue;
   int ri;

   printf("请您输入日期\n");
   while (scanf("%d/%d/%d",&nian,&yue,&ri)==3)
   {
       printf("%d 年 %d 月 %d 日\n",nian,yue,ri);
//要考虑年份是不是闰年
    switch (yue)
    {
     case 1:
         printf("%d",ri);
         break;
     case 2:
         printf("%d",ER+ri);
         break;
     case 3:
         if (nian%4==0&&nian%100!=0)
         printf("%d",SAN+ri+1);
         else
         printf("%d",SAN+ri);
         break;
     case 4:
       if (nian%4==0&&nian%100!=0)
         printf("%d",SI+ri+1);
         else
         printf("%d",SI+ri);
         break;
     case 5:
        if (nian%4==0&&nian%100!=0)
         printf("%d",WU+ri+1);
         else
         printf("%d",WU+ri);
         break;
     case 6:
        if (nian%4==0&&nian%100!=0)
         printf("%d",LIU+ri+1);
         else
         printf("%d",LIU+ri);
         break;
     case 7:
         if (nian%4==0&&nian%100!=0)
         printf("%d",QI+ri+1);
         else
         printf("%d",QI+ri);
         break;
     case 8:
         if (nian%4==0&&nian%100!=0)
         printf("%d",BA+ri+1);
         else
         printf("%d",BA+ri);
         break;
     case 9:
         if (nian%4==0&&nian%100!=0)
         printf("%d",JIU+ri+1);
         else
         printf("%d",JIU+ri);
         break;
     case 10:
         if (nian%4==0&&nian%100!=0)
         printf("%d",SHI+ri+1);
         else
         printf("%d",SHI+ri);
         break;
     case 11:
         if (nian%4==0&&nian%100!=0)
         printf("%d",SHIYI+ri+1);
         else
         printf("%d",SHIYI+ri);
         break;
     case 12:
         if (nian%4==0&&nian%100!=0)
         printf("%d",SHIER+ri+1);
         else
         printf("%d",SHIER+ri);
         break;
     default:
        break;
    }
   }
   return 0;
}

运行结果如图(分闰年与非闰年)

image.png

第一个该注意的是年份,闰年一年有366天,所有必须判断是不是闰年,因此要加一个判断语句来确定闰年(能被4整除,且不能被100整除的年份为闰年)。第二就是case的标签。写代码时有以下错误。

swithc(k)
{
case 1: //k的值为1跳到此行\
case 'A': //k的值为'A'跳到此行,'A'代表字母A的ASCII码,即0x41 或65\
case '5': //k的值为'5'跳到此行,'5'代表数字5的ASCII码,即0x35 或53\
}

一开始用'1'做标签,但'1'表示ASCII码。

7.给你n个整数,求他们中所有奇数的乘积。2006

#include<stdio.h>
int main()
{
    int n;
    int i=0;
    int a[1000];
    int jishu=1;
    char ch;

    do
    {
        scanf("%d",&a[i++]);
        n=i;
    }while ((ch=getchar())!='\n');

    for (i=0;i<=n;i++)
    {
        if ((a[i]%2)!=0)
        jishu=jishu*a[i];
    }
    printf("%d\n",jishu);

}

运行结果如图

image.png

其实这个代码主要就是要输入不限数的数字,所以要运用循环来控制。以下是输入有限个数量但数量较多的循环方法

for(int i=0;i<n;i++)

scanf("%d",&a[i]);

以下则是不限数量的输入方式

int i=0;

while(scanf("%d",&a[i]))

{

i++;

}

通过循环与数组的关系来摆弄输入的数

8.给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。2007

#include<stdio.h>
int main()
{
    int min,max,i;
    int jnum=0;
    int onum=0;
    int jpf,olf;

   while (scanf("%d %d",&min,&max)==2)
 {
    jnum=0;
    onum=0;

    for (i=min;i<=max;i++)
    {
        if (i%2==0)
            {
                jpf=i*i;
                jnum+=jpf;
            }
            else
            {
                olf=i*i*i;
                onum+=olf;
            }
    }
    printf("%d %d\n",jnum,onum);
 }
    return 0;

}

运行结果如下

image.png

二.函数与指针简介

1.创建并使用简单函数

#include<stdio.h>
#define MEIJU "我站在万人中央,我孤独的十分漂亮"
#define MINGYAN "雨水冲刷着我的灵魂,我感到无比自由"
#define GESHU 40

void starbar();//声明函数

int main()
{
    starbar();//调用函数
    printf("%s\n",MEIJU);
    printf("%s\n",MINGYAN);
    starbar();

    return 0;
}
void starbar()//定义函数
{
  int i;
  for (i=1;i<=GESHU;i++)
        printf("*");
  printf("\n");
}

运行结果如图

image.png

- 注意:i是局部变量,意思是只属于starbar()的变量,在mian()中也可以使用i,两个是同名的不同变量。

2.定义带形式参数的函数。

#include<string.h>
#define NAME "GIGATHINK, INC."
#define ADDRESS "101 Megabuck Plaza" 
#define PLACE "Megapolis, CA 94904"
#define WIDTH 40
#define SPACE ' '

void show_n_char(char ch,int num);

int main()
{
	int spaces;
	show_n_char('*',WIDTH);
	putchar('\n');
	show_n_char(SPACE, 12);
	printf("%s\n",NAME);
	spaces = (WIDTH - strlen(ADDRESS)) / 2;
	
	show_n_char(SPACE, spaces);
	printf("%s\n",ADDRESS);
	show_n_char(SPACE,(WIDTH - strlen(PLACE)) / 2);
	
	printf("%s\n",PLACE);
	show_n_char('*',WIDTH);
	putchar('\n');
	
	return 0;
}

void show_n_char(char ch, int num)
{
	int count;	
	
	for(count = 1; count <= num; count++)
		putchar(ch);
		
}

如上,show_n_char()使用俩个参数ch和num这两个参数被称为形式参数。通过主调函数把实参赋值给变量,也就是形参。

定义带形式参数的函数

void show_n_char(char ch,int num) 这个告诉编译器show_n_char()使用两个参数ch和num,ch是char类型num是int类型,这两个变量被称为形式参数简称形参,形参是局部变量,属于函数私有,也就是在其他函数中运用同名变量 注意:每个变量前都要声明其类型不能写成这个样子 void swap(int x, y) 正确的应该这样写 void swap(int x, int y)

声明带形式参数函数的原型

在使用函数之前,要用ANSI C形式声明函数原型: void show_n_char(char ch,int num); 函数原型用逗号分隔的列表指明参数(变量名可省略)

调用带实际参数的函数

在函数调用中提供了ch和num的值。

形式参数是被调函数中的变量;实际参数是主调函数赋给被调函数的具体值

实际参数可以是变量,常量,或甚至是更复杂的表达式,无论实际参数是什么形式都要被求值,然后这个值被拷贝给被调用函数相应的形式参数 例如: show_n_char(SPACE,(WIDTH - strlen(PLACE)) / 2); 这个第二个实参是一个很长的表达式 无论被调用函数对拷贝数据做了什么,主调函数中的原始数据都不会被影响。

注意:实际参数和形式参数

实际参数是出现在函数调用圆括号中的表达式,形式参数是函数定义的函数头中声明的变量调用函数时,创建了声明为形式参数的变量并初始化为实际参数的求职结果

3.使用return从函数中返回值

int imin(int,int);

int main()
{
    int m,n;
    printf("请您输入数值\n");
    while (scanf("%d %d",&m,&n)==2)
    {
      printf("%d %d 最小值为 %d",m,n,imin(m,n));

    }
    return 0;
}
int imin(int n ,int m)
{
    int min;

    if (n<m)
        min=n;
    else
        min=m;

    return min;
}

运行结果如图

image.png

4.递归

有循环的地方一般可以用递归。使用时依情况而论。

void hanshu(int);

int main()
{
    hanshu(1);
    return 0;
}
void hanshu(int n)
{
    printf("%d:%p\n",n,&n);
    if(n<4)
    hanshu(n+1);
    printf("X%d:%p\n",n,&n);
}

运行结果如图

image.png

graph TD
第一调用 --> 第二调用 --> 第三调用 --> 第四调用  

graph TD
第四调用 --> 第三调用 -->第二调用 --> 第一调用

其实就如上图的流程第四调用完后,控制权返回第三调用,最后返回第一调用,在返回调用时,if语句下的输出函数也将被运行运行完成后再把控制权交给上一级调用。

5.指针简介

1.什么是指针?

指针是一个值为内存地址的变量(或数据对象)例如:ptr=&pooh;//把pooh的地址赋给ptr。 可以说ptr“指向”pooh

2.间接运算符:*

ptr=&pooh,vct=*ptr--->vct=pooh;

3.声明指针

  1. int * pi; //pi是指向int类型变量的指针 2.char*pc; //pc是指向char类型变量的指针

3.float*pf; //pf是指向float类型变量的指针

使用指针在函数间通信

void hanshu(int * u,int * v);

int main()
{
    int x=5,y=10;
    printf("%d %d\n",x,y);
    hanshu (&x,&y);
    printf("%d %d",x,y);

    return 0;

}
void hanshu(int * u,int * v)
{
    int temp;
    temp=*u;
    *u=*v;
    *v=temp;
}

运行结果如图

image.png