C语言集训

188 阅读5分钟
gantt
title A Gantt Diagram
dateFormat  YYYY-MM-DD
section Section
A task           :a1, 2014-01-01, 30d
Another task     :after a1  , 20d
section Another
Task in sec      :2014-01-12  , 12d
another task      : 24d

第二次作业

一.代码练习(白皮书原题)

1.

int main()
{
    int start,end;

    printf("值为:");
    scanf("%d",&start);

    printf("值为:");
    scanf("%d",&end);
    printf("  Ori:     Square;  Cubic:\n");

    for (int i=start;i<=end;i++)
    {
        printf("%6d,%10d,%10d",i,i*i,i*i*i);
        printf("\n");
    }
    return 0;
}


运行结果如图 image.png

函数输入2个整形值,则取得两个数之间的所有数的平方和立方

2. - for循环的嵌套运用

#include<stdio.h>
#define CISHU 6
int main()
{
    int num,sum;
    char ch,chs;

    for (num=1,chs='A';num<=CISHU;chs=chs+num,num++)
    {
        for (ch=chs,sum=0;sum<num;sum++,ch++)
            printf("%c",ch);
            printf("\n");
    }
    return 0;
}

运行结果如图

image.png

上述代码运行情况为每一次外层循环包括了内层循环的所有循环(直至内层循环判断为假),每一次外层循环完成num值改变,chs值改变,而内层循环中sum值又再次从0开始+1(因为在循环里再次声明了sum=0)

3. for嵌套训练

int main()
{
    int i,j,num;
    char c;

    printf("Enter the core char you want to point(A...Z):");

    scanf("%c",&c);
    char ch='A';
    num=c-'A'+1;

    for (i=1;i<=num;i++)
    {
        for (j=0;j<num-i;j++)
        printf(" ");

        for (ch='A';j<num;j++)
        printf("%c",ch++);

        for (j=1,ch-=2;j<i;j++,ch--)
        printf("%c",ch);
        printf("\n");


    }
    return 0;

}

运行结果如图

image.png

为了让打出的字符成三角形则通过输出打印空格,则内层循环需要判断打印的空格数。

4.数组训练(倒叙输入的字符串)

#include<string.h>
int main()
{
    char word[30];
    printf("字母为:");
    scanf("%s",word);
    printf("字母为:%s\n",word);
    printf(":");
    printf("%d",strlen(word));
    for (int i=strlen(word)-1;i>=0;i--)
    {
        printf("%c",word[i]);

    }
    return 0;

}

运行成功如图

image.png

使用strlen()函数计算字符串数组末尾的'\0'也会算到长度中去,而stzeof()则不会计算其长度,要倒叙打印字符串则下标值要从末尾开始

5.while循环和scanf()返回值判定循环

int main()
{
    float num,sum,jieguo;

    while (scanf("%f %f",&num,&sum)==2)
    {
        jieguo=(num-sum)/(num*sum);
        
        printf("%.4f\n",jieguo);

    }
    return 0;
}

运行结果如图

image.png

通过while循环运用scanf()返回值判断,必须输入的两个数都为真(必须全为为浮点数)当然用for循环也可以如:for(;scanf("%s %s",sum,num);)也可以

6.使用函数返回值计算结果

float hanshu(float num,float sum);
int main()
{
    float num,sum;
    printf("请输入值");
    while (scanf("%f %f",&num,&sum)==2)
    {
        printf("%f",hanshu(num,sum));


    }
    printf("以上为所求值\n");
    
    return 0;
}
float hanshu(float num,float sum)
{
    float jieguo;
    
    jieguo=(num-sum)/(num*sum);
    
    return jieguo;
}

运行结果如图

image.png

6就是5一样的原理,但6运用的是新函数的返回值来计算,原理是一样的,6中运用到一个新函数(编程者自己定义的新函数)创建一个新函数流程如下

graph TD
声明函数 --> 调用函数 --> 定义函数

1.声明函数声明函数返回值类型和参数 2.调用函数将函数运用到程序中某一处 3.定义函数即刨析函数的组成程序块

7.输入8个整数,倒叙打印这8个函数


int main()
{
    int shuzi[8];
    int num;

    for (num=0;num<8;num++)
        scanf("%d",&shuzi[num]);

    for (num=7;num>=0;num--)
        printf("%d",shuzi[num]);
        printf("\n");

    return 0;



}

输入1-8结果如图

image.png

如果输入1-10

image.png

因为声明前int只向系统申请了8个字节所有只会显示输入的数值中的8个数字

二.判断语句的学习(分支与转跳)

例题1.(if语句的初利用)

int main()
{
    const int FREEZING=0;
    float temperature;
    int cold_days=0;
    int all_days=0;

    printf("Enter the list of daily low temperatures.\n");
    printf("Use Celsius,and enter q to quit.\n");
    while (scanf("%f",&temperature)==1)
    {
        all_days++;
        if (temperature<FREEZING)
            cold_days++;

    }
    if (all_days !=0)
        printf("%d days total:%.1f%% were below freezing.\n",
    all_days,100.0*(float) cold_days/all_days);
    if (all_days==0)
        printf("No data entered!\n");
    return 0;
}

运行结果如图

image.png

while循环是通过输入非数值来结束循环的如输入一个q,则scanf()返回一个0 ,while判断为假,所以循环结束。

例题2.(if else)

上述代码还可更加简洁

if (all_days !=0)
        printf("%d days total:%.1f%% were below freezing.\n",
    all_days,100.0*(float) cold_days/all_days);
    if (all_days==0)
        printf("No data entered!\n");
        
        

可以改成

        printf("%d days total:%.1f%% were below freezing.\n",
    all_days,100.0*(float) cold_days/all_days);

    else
        printf("No data entered!\n");

注意:每个else都有所属的if语句,如上述语句中对于第一个输出函数并没有用花括号括起来,因为循环的语句只有一个,但如果是个复杂语句则必须用花括号括起来

3.getchar()/putchar()输入输出函数

#define SPACE ' '
int main()
{
    char ch;

    ch=getchar();
    while (ch !='\n')
    {
        if(ch==SPACE)
            putchar(ch);
        else
            putchar(ch+1);
        ch=getchar();

    }
    putchar(ch);

    return 0;
}

运行结果如图(输入CALL ME HAL)

image.png

有一个很有意思的循环 while(ch!='\n'),他表示的是当一行未结束时就一直循环下去因为要知道检查到换行符才停止;通过对ch值的递增(增加字符的ASCII值),函数char可以来声明字符还可以来声明整数只不过数值范围小

4.多重选择else if

else if语句和if else语句核心部分都是相同的,只不过是不同的写法

graph TD
if --> elseif

else与if配对

一般来说没有花括号else与离他最近的if配对

    if(number<12)
    printf("You're close!\n");
else
    printf("Sorry you lose a turn!\n")

如上,该代码有2个if并没有花括号说明,所以else与第二个if配对

5.多层嵌套if语句

#include<stdbool.h>
int main()
{
    unsigned long num;
    unsigned long div;
    bool isPrime;

    printf("请输入值:");
    while (scanf("%lu",&num)==1)
    {
        for (div=2,isPrime=true;(div*div)<=num;div++)

        {
            if (num%div==0)
             {


            if ((div*div)!=num)
            printf("%lu %lu %lu\n",num,div,num/div);
            else
                printf("%lu %lu\n",num,div);
            isPrime=false;   //该数不是素数
             }

        }
        if (isPrime)
            printf("%lu is prime.\n",num);
        printf("Please enter another integer for analyeis;");
        printf("Enter q to quit .\n");
    }
    printf("Bye.\n");

    return 0;



}

用户输入一个数,代码反映出改数的所有约数,如输入123456

image.png

6.条件运算符: ?:

以下面例子为例

x=(y<0)?-y:y; 其意思就为如果y<0,x就等于-y否则等于y

if(x<0) x=-y; else x=y;与上面表述相同

7.辅助循环:continue和break

- continue 执行到改语句时,会跳过本次迭代的剩余部分并开始下一轮的迭代

但是如下

{
    ch=getchar();
    if(ch=='\n')
        continue;
    putchar(ch);
}

上面的一开始不是开始下一轮的迭代,而是先执行count++

- break 执行到其时会终止包含他的循环,并继续下一阶段

8.多重选择:switch和break

#include<ctype.h>

int main ()
{
   /* 局部变量定义 */
   char grade ;
   grade=getchar();


   switch(grade)
   {
   case 'A' :
      printf("很棒!\n" );
      break;
   case 'B' :
   case 'C' :
      printf("做得好\n" );
      break;
   case 'D' :
      printf("您通过了\n" );
      break;
   case 'F' :
      printf("最好再试一下\n" );
      break;
   default :
      printf("无效的成绩\n" );
   }
   printf("您的成绩是 %c\n", grade );

   return 0;
}

如上当你输入A时switch函数自动找到标签为A的版块输出 “很棒”再通过break来结束循环。假如case'A'的break被删掉则一直运行到case的break来结束循环。

一、ctype.h头文件中的字符测试函数

函数名参数为以下类型时返回值为真
isalnum()字母或数字
isalpha()字母
isdigit()数字
isupper()大写字母
islower()小写字母
isblank()标准空白字符(空格、水平制表符、换行符)
isspace()空白字符(空格、换行/页符、垂直/水平制表符、回车符)
isprint()可打印字符
isgraph()除空格外的可打印字符
ispunct()标点符号(除空格、字母和数字外的可打印字符)
iscntrl()控制字符,如Ctrl+B
isxdigit()十六进制数字符

二、ctype.h头文件中的字符映射函数(不改变原始参数值)

函数名行为
tolower()参数为大写则返回小写,否则返回原始参数
toupper()参数为小写则返回大写,否则返回原始参数

三.代码分享

QQ图片20211121223448.png

QQ图片20211121223454.png