C语言教程(下),超详细~

P1函数

  • 函数是执行一个特定功能的语句。每个 C 程序都至少有一个函数,即主函数 main() 。
  • 你可以自己创建一个函数,让这个函数执行一个特定的任务。注意:你写的自定义函数要写在main函数前面。
  • 在 C 语言中,函数由下列几个元素组成:
    1. 返回类型:一个函数可以返回一个值。返回的值可以是整型、浮点型、字符型。有些函数不能可以不返回值,在这种情况下,要在函数名前面加void。如int Sum(){},int就是返回类型。
    2. 函数名称:这是函数的实际名称。如int Sum(int a){},Sum就是函数名,根据函数的功能来给函数命名
    3. 参数:当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数由数据类型 变量名组成,如int Sum(int a){}int a就是实际参数,但他要放在函数名的括号里面。
    4. 函数主体:就是大括号里面的内容,要执行的语句,它可能完成一个特定的功能。比如getchar()就是获取一个字符,当然你也可以自己写一个属于自己的函数。它的名字可以是MyGetchar

P2命名规定

  • 前面说过C语言的命名有见名之意,及看到这个名字就大概知道这是变量或函数是做什么的。
  • 驼峰命名法:骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,这样的变量名或函数名看上去就像骆驼峰一样此起彼伏,故得名。
  • 小驼峰命名法:一般命名为变量。第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母。例如:strLen(字符串的长度)、numLen(数字的长度)
  • 大驼峰命名法:一般命名为函数。例如:MyGetchar(我自己创建的一个获取字符的函数)、MyGetcharAscii(我自己创建的一个获取字符ascii的函数)
  • 下划线命名:str_len、my_getchar、my_Getchar都是正确的

P3无返回类型的函数

例:用函数输出英文、中文

  • 下面一共有3个函数:主函数main(),两个自己定义函数分别是OpenAirConditioner()(作用:打开空调)和OpenLights()(作用:打开灯)。
  • void OpenAirConditioner()void OpenLights()void表示函数没有返回值,OpenAirConditionerOpenLights是两个不同的函数名,他们的功能是不同的。因为他们都没有返回值,所以函数名前面是void。
#include "stdio.h"
void OpenAirConditioner(){
    printf("飞沙 打开了空调\n");
}
void OpenLights(){
    printf("MrFlySand 打开了灯\n");
}
void main(){
    printf("欢迎\n");
    OpenLights();
    printf("拜拜\n");
}
  • C语言首先会从main()函数开始执行,并且自顶向下(自上而下)。下面是main中的三条语句:
    1. main函数中首先会输出欢迎,就比如main是一个房子,首先进入大门,它会对你说“欢迎”。
    2. 然后会调用OpenLights()这个自定义函数。在房子中有一个开关叫做OpenLights();,并且把这个开关打开了(调用上面的函数),它就会把灯打开。在房子中还有另一个开关叫做OpenAirConditioner();,但这个开关并没有被打开,所以即使有空调也不会开空调。
    3. 最后输出拜拜。

P4传参函数

例:输出两个数中较大的那个数

  • Max()函数中有两个参数 num1 和 num2,这个函数的作用是输出这两个数中较大的那个数。
  • 下面的代码和上面的代码比较可以发现函数的圆括号中都多了一点东西。
  • 在函数main()中调用了函数Max(),并且Max(a, b)中有a、b,他们都是整形int。a会把值给num1,b会把值给num2,这个过程叫做传参。把东西给别人之后,这个东西(数字:520和1314)就不归a、b所管,但a、b里面还是有520、1314,只是num1=520,num2=1314。然后num1、num2拿到东西(520、1314)就可以跑路了,num1、num2不管怎么变化都和a、b无关。
  • 在函数Max(int num1, int num2)中定义了两个变量num1、num2。因为a、b都是整型,所以num1、num2也要定义为整型int。
  • Max()函数中我们又定义了一个变量max,这个变量max只属于Max()函数。如果要在main函数中输出max的值就是错误的,因为在main函数中max是没有定义的,只是在Max()函数中定义。所以在main()中写printf("%d",max);是错误的。
  • 注意函数是由函数名和括号组成,所以Max()是函数,max是整型变量,他们是不同的。
  • 看下图,注意箭头方向(以后也要注意)。

例:交换两个数字

#include "stdio.h"
void swap(int x, int y){
  printf("第1次看看x、y的值:%d %d\n", x, y);
  int temp;
  temp = x;    
  x = y;      
  y = temp;    /* 把 temp 赋值给 y */
  printf("第2次看看x、y的值:%d %d\n", x, y);
}
void main(){
  int a = 520, b = 1314;
  printf("第一次看看a、b的值:%d %d\n", a, b);
  swap(a, b);
  printf("第二次看看a、b的值:%d %d\n", a, b);
}
  1. 练习:输出两个数中较小的那个数。

例:putchar()

  • putchar()是C语言函数库中的一个函数,它的作用是:输出一个字符。
#include"stdio.h"
main(){
  char c;
  scanf("%c",&c);//用输入获取一个字符,把字符a给了c
  printf("%c",c);//输出变量c的值

  putchar(c);//用函数输出变量c的值
}

例:MyPutchar()函数

  • 你也可以自己写一个输出字符的函数,它的函数名可以是MyPutchar
  • 用函数直接输出字符,所以没有return,函数名前就要用void。
#include"stdio.h"
void Myputchar(char c){
  printf("%c", c);
}
main(){
  char c = 'a';
  MyPutchar(c);
}
  1. 练习:写一个输出字符ascii的函数,它的函数名可以是MyPutcharAscii()
#include"stdio.h"
void MyPutcharAscii(char c){
  printf("%d",c);
}
main(){
  char c = 'a';
  MyPutcharAscii(c);
}

P5 有返回值的传参函数

例:返回两个数中较大的那个数

  • 和上面的代码比较可以发现Max()前面从void改为int,并且Max()函数中多了个return max
  • return就是返回return后面的值,这个值可以是整型、浮点型、字符型。return 最终返回的是一个数或者字符。return n;n
    最终必须是一个数。比如:return 3*5;return a*b;return a>b?a:b;return pow(2,5);都是正确的,只要后面最终的结果为一个数即可,因为它们通过计算后会得到一个结果(整型、浮点型、字符型)。
  • 如下变量max是整型,所以要把函数Max()前面的void改为int。注意:有return就没有void,有void就没有return.
  • 最后Max(a, b)这一整块的值就是max的值,也就是return后面的值。你可以把Max(a, b)这个值赋值给c,也可以直接输出。因为它变成了一个型型值,所以输出要用%d
  • 扩展:有时函数名前没有申明类型(被省略了),它的默认类型就是int。但最好不要省略。

P6 return

  • 在函数中,只要执行到return,在这个函数中return后面的任何语句都不会执行。表示这个函数已经执行完成。
#include"stdio.h"
int Function(int n){
    printf("MrFlySand");
    return n;
    printf("飞沙");
}
main(){
    printf("%d\n", Function(520));
}
/*
运行结果:
MrFlySand520
*/
  1. 练习:返回两个数中较小的那个数
//以下是四种方法
int FindMin1(int a,int b){
    int min;
    if(a>b){
        min=b;
    }else
        min=a;
    return min;
}
int FindMin2(int a, int b){
    if(a>b)
        return b;
    else
        return a;
}
int FindMin3(int a, int b){
    if(a>b)
        return b;   
    return a;
}
int FindMin4(int a, int b){
    return a>b ? b : a;
}

例:getchar()

  • 在C语言中有获取字符的库函数getchar(),它的作用是获取一个字符
  • 注意:输入的是ab,不是a b,ab中间不能有空格,因为空格也是一个字符,空格的ascii是32。
#include"stdio.h"
main(){
  char c;
  scanf("%c",&c);//用输入获取一个字符,把字符a给了c
  printf("%c",c);

  c = getchar();//用函数获取一个字符,把字符b赋值给了c
  printf("%c",c);
}
/*
输入:
ab

输出:
ab
*/

例:MyGetchar()函数

  • 当然你也可以自己写一个获取字符的函数,它的函数名可以是MyGetchar
#include"stdio.h"
char MyGetchar(){
  char c;
  scanf("%c",&c);
  return c;
}
main(){
  printf("%c",MyGetchar());  
}
  1. 练习:写一个获取字符ascii的函数,它的函数名可以是MyGetcharAscii()
    注意:因为ascii是整数,所以函数名前面是int。
#include"stdio.h"
int MyGetcharAscii(char c){
  return c;
}
main(){
  char c = 'a';
  printf("%d",MyGetcharAscii(c));
}
  1. 练习:返回一个数的绝对值
int MyAbs(int x){
    if(x < 0)
        return -x;//如果是负数,则返回它的相反数
    return x; 
}
void main(){
    printf("%d %d\n", MyAbs(520), MyAbs(-1314));
}
  1. 练习:返回一个数的相反数
int MyAbs(int a){
    return -a;    
}
  1. 练习:写三个函数,输入日期,分别输出年份、月份、天数。如:date=20211204,Year(date)返回的值为2021;Month(date)返回的值为12;Day(date)返回的值为4。
/**函数解释说明:
@param {int} date - 年月日时间,如20211204、20210101 
*/
int Year(int date){
  return date/10000;
}
int Month(int date){
  return date/100%100;
}
int Day(int date){
  return date%100;
}

例:年月日

  • 输入年月日,计算这一年过去多少天。
Example 1:
Input: 20210123
Output: 23
Reason:一年中的第1个月过去了23天

Example 2:
Input: 20210220
Output: 51
Reason: 到了2月份。1月份已经过去31天,再加2月份过去的天数。就是这一年过去的天数。31+20=51

Example 3:
Input: 20210310
Output: 69
Reason: 到了3月份。1月份已经过去31天,3月份已经过去28天(不是闰年),再加3月份过去的天数。31+28+10=69

Example 3:
Input: 20200310
Output: 70
Reason: 到了3月份。1月份已经过去31天,3月份已经过去29天(是闰年),再加3月份过去的天数。31+29+10=70
/**
@param {int} date - 年月日时间,如20211204、20210101 
*/
int Year(int date){
  return date/10000;
}
int Month(int date){
  return date/100%100;
}
int Day(int date){
  return date%100;
}
int GetDate(int date){
  int sumDay,monDay;
  int year = Year(date);
  int month = Month(date);
  int day = Day(date);
  switch(month){
    case 1:monDay=0;break;
    case 2:monDay=31;break;//1月已经过去,共31天
    case 3:monDay=59;break;//2月28天,共59天
    case 4:monDay=90;break;//3月31天,共90天
    case 5:monDay=120;break;
    case 6:monDay=151;break;
    case 7:monDay=181;break;
    case 8:monDay=212;break;
    case 9:monDay=243;break;
    case 10:monDay=273;break;
    case 11:monDay=304;break;
    case 12:monDay=334;break;
    default:printf("data error");break;
  }
  sumDay = monDay + day;//总天数 = 月份所得的天数 + 天数  
  if(year%4==0 && year%100!=0 || year%400==0){//判断是否为闰年
     if(month>2)//如果是2月12日不用加闰年29天,只能过了2月才能有闰年的问题
      ++sumDay;
  }  
  return sumDay;
}
  1. 练习:输入两个年月日,输出它们相隔多少天。
  2. 练习:输入年月日(y、m、d)和天数(n),输出n天后的年月日(y、m、d)。

P7for循环

  • C 语言中 for 循环的语法:
for(init; condition; increment){
   statement(s);
}

解释:

  1. init:init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不写任何语句,只要有一个分号出现即可。
  2. condition条件:只有当condition成立时才会执行statement;如果不成立,则不会执行statement。
  3. statement:由任意行代码组成,是你要执行的步骤。
  4. increment:在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空。执行完第4步之后,再跳到第2步判断(请回到第2条上)。

实例

main(){  
  int a;
  for(a = 10; a < 12; a++){
    printf("a的值为: %d\n", a);
  }
  printf("MrFlySand-飞沙\n");
}
/*
当上面的代码被编译和执行时,它会产生下列结果:
a 的值: 10
a 的值: 11

解释说明:
第1步:定义,定义了一个变量a = 10
第2步:判断,判断10 < 12是否成立,成立
第3步:做事情,输出a的值,a的值为:10
第4步:做事情,使变量a自增,=11

第5步:判断,判断11 < 12是否成立,成立
第6步:做事情,输出a的值,a的值为:11
第7步:做事情,使变量a自增,a=12

第8步:判断,判断12 < 12是否成立,不成立,for执行完成。继续执行下面的代码。
第9步:输出MrFlySand-飞沙
*/

例:输出10 ~ 100中的数,且这些数中不能有5的倍数

  • 注意:有些编译器要求init里面不能有int,所以要像上面的代码一样单独用一行定义。
  • 因为10和100都是5的倍数,所以可以从11 ~ 99来判断
void Function(){
  for(int i = 11; i < 100; ++i){
    if(i%5 != 0){
      printf("%d ", i);
    }
  }
}
  • 可以发现,这样的数字有很多,不利于阅读。所以现在要求它每8个数字输出一行。
  • 比如,11 ~ 20之间有8个符合要求的数字;21 ~ 30之间有8个符合要求的数字。它们最后一个数字(20、30)都是10的倍数,所以当i是10的倍数时我们就需要输出\n
void Function(){
  for(int i = 11; i < 100; ++i){
    if(i%5 != 0){
      printf("%d ", i);
    }
    if(i%10 == 0){
      printf("\n");
    }
  }
}
  • 当我们要输出m ~ n中的数字时,我们又需要改变函数里面的东西。所以我们可以传一个范围给它。
#include"stdio.h"
void Function(int begin, int end){
  for(int i = begin; i <= end; ++i){
    if(i%5 != 0){
      printf("%d ", i);
    }
    if(i%10 == 0){
      printf("\n");
    }
  }
}
main(){
  Function(1,20);
  printf("\n\n");
  Function(1000,10000);
}
  • 接下来,我们要输出m ~ n中的数字,且这些数中不能有x的倍数,每10个输出一行。
  • 当我们调用函数Function(1,20,3),发现它输出的并不是每10个输出一行。因为i是要判断是不是3的倍数,即使10不是3的倍数,当碰上第2个if时成立了,所以换行了。
void Function(int begin, int end, int x){
  for(int i = begin; i <= end; ++i){
    if(i%x != 0){
      printf("%d ", i);
    }
    if(i%10 == 0){
      printf("\n");
    }
  }
}
  • 所以我们要计算符合要求的数字有多少个,当符合要求的数字有10个时,则换行。这就要我们再声明一个变量count,用来计算符合要的数字有多少个。下面是改进的代码:
void Function(int begin, int end, int x){
  int count  = 0;//能被x整除的数有0个,所以初始值要为0
  for(int i = begin; i <= end; ++i){
    if(i%x != 0){
      printf("%d ", i);
      ++count;// 符合要求的数字增1
    }
    if(count%10 == 0){
      printf("\n");
    }
  }
}
  • 接下来,我们要输出m ~ n中的数字,且这些数中不能有x的倍数,每r个输出一行。
  • 当我们像下面的代码写时,可以发现它会多空一行。
void Function(int begin, int end, int x, int row){
  int count  = 0;
  for(int i = begin; i <= end; ++i){
    if(i%x != 0){
      printf("%d ", i);
      ++count;// 符合要求的数字增1
    }
    if(count%row == 0){
      printf("\n");
    }
  }
}
/*
当调用Function(1,20,3,5);时会输出:
1 2 4 5 7 
8 10 11 13 14 

16 17 19 20 

当i = 14时,count=10,第2个if成立。输出换行,++i自增
当i = 15时,第一个if不成立,count=10,第2个if成立。输出换行,++i自增
  • 所以只有在count变化后再判断是否换行才是正确的,因此我们要将第2个if放在++count之后。
void Function(int begin, int end, int x, int row){
  int count  = 0;
  for(int i = begin; i <= end; ++i){
    if(i%x != 0){
      printf("%d ", i);
      ++count;// 符合要求的数字增1
      if((count)%row == 0){
        printf("\n",count);
      }
    }
  }
}
  1. 练习:输出n以内被7或17整除的数。

例:计算总和

  • 计算1+2+3+4+5+...+10的总和。
  • 定义一个变量sum,把所有的i相加,最后返回sum。
int Fun(){
  int sum = 0;
  for (int i = 1; i <= 10; ++i){
    sum = sum + i;
    //输出看看i和sum的变化,如果不需要可以注释
    printf("i=%d,sum=%d\n", i, sum);
  }
  return sum;
}
int main(){
  printf("\n\n 最终sum=%d", Fun());
}
  1. 练习:计算10 ~ 100之间的和,且这些数中不能有5的倍数。
  2. 练习:计算m ~ n之间的和,且这些数中不能有x的倍数。
int EvenSum(int start, int end, int x){
    int sum=0;
    for(int i=start; i<=end;i++){
        if(i%x != 0){
          sum=sum+i;
      }
    }
    return sum;
}
  1. 练习:编写一个程序 ,求出满足下列条件的4位数:该数是个完全平方数,且第一 、三位数字之和为10,第二、四位数字之积为12。
#include<stdio.h>
#include<math.h>
int main(){
    int i,k;
    for(i=1000;i<=9999;i++){
    k=sqrt(i);
    if(k*k==i && i/1000+i/10%10==10 && (i/100%10)*(i%10)==12)
        printf("%d\n",i);
    }
}
  1. 练习:编写一个程序,求e的值。

\[e≈1+\frac{1}{1!}+\frac{1}{2!}+...+\frac{1}{n!} \]

#include<stdio.h>
int main(){
    int i,k=1,n;
    float e=1;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        k=k*i;
        e+=1.0/k;
    }
    printf("%f\n",e);
}
  1. 练习:编写一个程序,求满足如下条件的最大的n:
  • 12+22+32 +...+n2≤1 000。
#include<stdio.h>
    int main(){
    int i,s=0;
    for(i=1;s<=1000;i++){
        s+=i*i;
    }
    printf("%d\n",i);
}
  1. 练习:某人摘下一些桃子,卖掉一半, 又吃了一个;第二天卖掉剩下的一半,又吃了一个。第三天、第四天、第五天都如此,第六天一看,发现只剩下一个桃子了。编写一个程序,采用迭代法求某人一共摘了多少个桃子。
#include<stdio.h>
  int main(){
  int i,s=1;
  for(i=1;i<6;i++){
    ++s;
    s*=2;
  }
  printf("%d\n",s);
}
  1. 练习:输出1~999中能被5整除,且百位数字是5的所有整数,并计算他们的和。
    • 百位上是5,从500~599都是百位为5。
    • 能被5整除的数有:500、505、510、515...末尾都是0或5,所以可以把步长设为5

循环中{}的问题

  • 当循环后面没有{}时,循环后面的一行代码归属于循环里面,其第2行不属于循环里面。
    如下2个内容的代码输出的效果都是一样的,分别都是3个“小知识酷”
for(int i=1; i<=3; i++){
	printf("小知识酷");
}
printf("\n");
for(int i=1; i<=3; i++)
	printf("小知识酷");

输出内容

小知识酷
小知识酷
小知识酷

小知识酷
小知识酷
小知识酷

当循环后面有多条语句时,只有{}里面的内容才属于循环。

for(int i=1; i<=3; i++){
	printf("小知识酷");
	printf("mrflysand");
}

输出内容

小知识酷
mrflysand
小知识酷
mrflysand
小知识酷
mrflysand

如下2个内容的代码输出的效果都是一样的

for(int i=1; i<=3; i++){
	printf("小知识酷");
}
printf("mrflysand");
	
	
for(int i=1; i<=3; i++)
	printf("小知识酷");
	printf("mrflysand");

代码输出内容

小知识酷
小知识酷
小知识酷
mrflysand

小知识酷
小知识酷
小知识酷
mrflysand

P8 while循环

  • 格式:while(条件){语句},当条件成立时,执行大括号里面的语句。执行完大括号里面的语句后,再跳到条件那里,然后判断是否成立,成立则执行大括号里面的内容;当条件不成立时,不执行大括号里面的语句。
#include  "stdio.h"
int main(){
  int i = 1;
  while(i <= 5){
    printf("MrFlySand-%d\n", i);
    i++;// 注意:要使i的值变大,否则i一直为1。且`1<=5`一直成立就一直会循环下去。
  }
  printf("飞沙");// 执行完while后输出 飞沙
}
  • while括号里面的数字:当括号里面是0时,表示不成立;其它的数字表示成立。
  • 下面是两个函数,函数的效果都是相同的。注意要使i的值变小。
void Fun1(){
  int i = 3;
  while(i){
    printf("%d ", i--); 
  }     
}

void Fun2(){
  int i = 3;
  while(i--){
    printf("%d ", i); 
  }
}
/*
运算结果:
3 2 1
*/

几个常用的封装函数

例:返回一个数有几位数

  • 先判断这个数是正数还是负数。如果这个数是负数,则让它变成正数。如果一个数是0,就代表它没有一位数 。
  • 任何一个数最少有一位。然后用这个数缩小,使它的结果除10。
  • 每次除10后,数字的长度加1。当number=0时跳出循环。
int GetNumLen(int number){
    if(number < 0) 
    	number *= -1; ​
    ​else if(number == 0) 
    	return 0;
    ​int len = 1;
    while(number /= 10) ++len;	
    ​return len;
}

例:获取数字各个数字的和

int GetNumSum(int number){
    if(number < 0)
        number *= -1;
    else if(number == 0)
        return 0;
    int numSum = number%10;
    while(number /= 10) numSum += number%10;
    return numSum;
}

例:获取数字各个数字的积

int GetNumProduct (int number){
    if(number < 0) number *= -1;
    int product = number % 10;
    while(number /= 10)
          product *= number % 10;    
    return product;
}

例:猜数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
	int min,max;
	srand(time(0));
	int randNum = rand()%1000;
	int count = 1;// 用于计算输入数字的次数
	int myNum;
	printf("我以经想好了一个数,请猜猜这个数字:\n");
	scanf("%d",&myNum);
	while (myNum != randNum){
		if (myNum > randNum){
			printf("你猜的数大了,请再输入一个数:\n");
		} else if(myNum < randNum){
			printf("你猜的数小了,请再输入一个数:\n");
		}		
		scanf("%d",&myNum);
		++count;//输入一个数,次数加1		
	}
	printf("太好了,你用了%d次猜对了答案\n",count);
	return 0;
}
/*
printf("请输入一个最小值:");
scanf("%d",&min);
printf("\b请输入一个最大值:");
scanf("%d",&max);
printf("请猜这个%d到%d之间的数:\n",min,max);
*/

break和countiue的区别

#include "stdio.h"
int main(){
    for(int a = 0; a < 7; a++){
        if(a%2==0){
            if(a==2){
                printf("continue1\n");
                continue;
                printf("continue2\n");
            }
            printf("能被2整除的数有:%d\n",a);
        }
        printf("(%d)",a);
    }
    printf("\n\n");
    for(int b = 0; b < 5; b++){
        if(b%2==0){
            if(b==2){
                printf("break1\n");
                break;
                printf("break2\n");
            }
            printf("能被2整除的数有:%d\n",b);
        }
        printf("(%d)",b);
    }
}
    
/*                          
运行结果:
能被2整除的数有:0
(0)(1)continue1
(3)能被2整除的数有:4
(4)(5)能被2整除的数有:6
(6)

能被2整除的数有:0
(0)(1)break1            

*/
  • 代码分为2部分,上面部分是continue,下面部分是break。
  • 由上面代码可以发现,无论是continue还是break,下面的输出语句都不会运行。
  • break跳出当前/终止循环,continue跳出当前语句
  1. 练习:求下面式子的值。$$1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+...-\frac{1}{99}+\frac{1}{100}$$
#include"stdio.h"
main(){
 int n;
 scanf("%d",&n);
 float i;
 double sum=0;
 int f=1;
 for(i=1;i<=n;i++){
      sum+=f/i;
      f*=-1;
 }
 printf("%.2f",sum);
}
  1. 练习:编写一个程序求sum=1+(1+2)+(1+2+3)+(1+2+3+4)的值。
#include"stdio.h"
main(){
  int i, j, max, sum = 0;
  scanf("%d", &max);
  for(i = 1; i <= max; i++){
    for(j = 1; j <= i; j++){
      sum = sum + j;
    }
  }
  printf("sum = %d", sum);
}
  1. 练习:编写一个程序,用户输入一个正整数,把它的名位数字前后颠倒一下,并输出。
#include"stdio.h"
int main (){
  int num,s=0;
  printf("please input a number:");
  scanf("%d",&num);
  while(num>0){
      s=s*10+num%10;
    num=num/10;
  }
  printf("%d", s);
}
  1. 练习:编写一个程序,求出200~ 300的数,且满足条件:它们3个数字之积为42,3个数字之和为12。
#include"stdio.h"
main(){
  int num = 200, endNum = 300, g, s, b;
  //scanf("%d%d", &num, &endNum);   
  while(num <= endNum ){
    // 取出各个位数
    g = num % 10;
    s = num / 10 % 10;
    b = num / 100;
    if(g*s*b == 42 && g+s+b==12){
      printf("%d ", num); 
    }
    num++;
  } 
}
  1. 练习:设N是一个4位数,它的9倍恰好是其反序数(例如:1089 * 9的反序数是9801) ,求N的值。
#include <stdio.h>
int main(void) { 
    int i, a, b, c, d ,s;
    for(i = 1000; i < 10000; i++){
        a = i % 10;
        b = i / 10 %10;
        c = i / 100 %10;
        d = i / 1000 %10;
        s = a*1000 + b*100 + c*10 + d;
        if(9*i == s) printf("%d", i);
    }
}
  1. 练习:有这样一个3位数,该3位数等于其每位数字的阶乘之和,即abc=a!+b!+c!。(例如:145=1! +4!+5!)
  2. 练习:编写程序求出满足下列条件的4位数:该数是个完全平方数;千位、十位数字之和为10,百位、个位数字之积为12。
  3. 练习:已知abc+cba=1333,其中a、b、c均为一位数,编写一个程序求出a、b、c分别代表什么数字。
#include"stdio.h"
int main(void) { 
    int num1, num2;
    int a, b, c;
  for(num1 = 100; num1 < 1000; num1++){
      a = num1/100;
      b = num1/10%10;
      c = num1%10;
      num2 = c*100 + b*10 + a;
      if(num1 + num2 == 1333){
          printf("%d ", num1);
      }
  }
  return 0;
}
  1. 练习:100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。
  2. 练习:求m~n的每位数的乘积大于每位数的和的数。
#include <stdio.h>
int main(void) { 
    int m, n;
    scanf("%d%d", &m, &n);
  while(m <= n){
      int m1 = m, product = 1, sum = 0;
      while(m1){
          product *= m1%10;
          sum += m1%10;
          m1 /= 10;
      }
      if(product > sum) printf("%d ", m);
      m++;
  }
}
  1. 练习:请用do--while循环计算m~n之间所有奇数与偶数之和。
  2. 练习:用do---while循环来实现统计从键盘输人任意一行字符的个数。
  3. 练习:下面程序的功能是:输出100 以内能被3整除且个位数为6的所有整数。
  4. 练习:编程序计算1!+2! +3! +...+20!
  5. 练习:有一分数序列:2/1, 3/2, 5/3, 8/5, 13/8,21/13, .求出这个数列的前10项
  6. 练习:任意输入10个整数,请求出正数的个数及正数的平均值。
  7. 练习:编写程序,输出100以内能被7整除的数。
  8. 练习:输入3 4(都是3组成的数字,且有4个数字),例如求s=3+33+333+3333。
  9. 练习:求和s=1! +3! +5!。运行结果:127
  10. 练习:打印500以内的“水仙花数”。“水仙花数”是一个三位数,其各位数立方和等于该数本身。运行结果:153 370 371407
  11. 练习:判断m是否为素数。
  • 算法:让m被2到sqrt(m)除,如果m能被2至sqrt(m)之中任何一个整数整除,那么说明m不是素数,否则是素数。
  • 例如:判断17是否为素数,只需使2 ~ 4(sqrt(17)≈4)之间的毎一个整数去除。因为如果m能被2 ~ m-1之间的任意整数整除,如果这个数大于根号m ,那么这个数必定对应的还有一个比根号m小的因子(以16为例,2、8是它的因子,8大于4,而2小于4)。
  1. 练习:有一数列:2/1, 3/2, 5/3 ,8/5..,编程求出这个数列的前10项之和。
  2. 练习:输入不多于10个实数,求这些数的和及其中的正数之和,如输人不足10个数,以0为结束标志。
#include"stdio.h"
int main (){
  int num,s=0,count=0;
    scanf("%d",&num);
  while(num!=0){
        if(num>0){
            if((++count)>10) break;
            s+=num;
        }
        scanf("%d",&num);
    }
  printf("%d",s);
}
  1. 练习:使用for语句实现统计输人的一行字符串中的字符个数。
  2. 练习:打印出乘法九九表。
  3. 练习:求s=1+3+5+7+9+...,其和大于等于500的最大项。
  4. 练习:计算100以内能被3整除且个位不为7的数的和。程序运行结果:s=1512。
  • [分析]变量s的初始值为0,i的初始值为1,先执行循环体中的if语句,此时条件(i%3==0&&i%10!=7)为假,则执行i=i+1,i的值为2,计算while后表达式的值2<=100为真,继续执行循环体,如果if语句条件为真,则s=s+i,再执行i=i+1,然后计算while后表达式i<= 100的值,若为真继续执行循环体,为假则退出循环体,从而继续执行输出s的值。在C语言中,表达式i%3==0&&i%10!=7表示能被3整除且个位不为7的数。
  1. 练习:求s=a+aa+aaa+aaaa+a.....a(n个a)的值,其中a为一个数字,要求a以及所加数字个数n由键盘输入。(例如:输入3 5,s=3+33+333+3333+33333)
  2. 练习:斐波那契数列的前几项是1,1,2,3,5,8,13,21,要求输出该数的100项,每行输出10个。
  3. 练习:求s=1+3+5+7+9+...,其和小于等于500的最大项。
  4. 练习:$$s=1+\frac{1}{3}+\frac{1}{5}+...+\frac{1}{2n-1}$$
  5. 练习:$$\frac{π}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-\frac{1}{11}+...-\frac{1}{2n-1}$$
  6. 练习:$$s=1+\frac{2}{1!}-\frac{4}{3!}+\frac{6}{5!}-\frac{8}{7!}+\frac{10}{9!}-...+\frac{2n}{(2n-1)!}$$
  7. 练习:计算前n项和。$$s=\frac{2}{1}+\frac{3}{2}+\frac{5}{3}+\frac{8}{5}+\frac{13}{8}$$
  • 一个整数的“反置数”指的是把该整数的每一位 数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾,那么在它的反置数当中,这些0就被省略掉了。比如说,1245的反置数是 5421,而1200的反置数是21。请编写一个程序,输入两个整数,然后计算这两个整数的反置数之和sum,然后再把sum的反置数打印出来。要求:由 于在本题中需要多次去计算一个整数的反置数,因此必须把这部分代码抽象为一个函数的形式。
输入
输入只有一行,包括两个整数,中间用空格隔开。 
输出
输出只有一行,即相应的结果。 
样例输入
435 754
样例输出
199
posted @ 2021-11-05 15:14  MrFlySand-飞沙  阅读(664)  评论(0编辑  收藏  举报