c语言基础学习04

=============================================================================
涉及到的知识点有:程序的三种结构、条件分支语句、循环语句、求自然数的和、
求100到999之间所有的水仙花数、在屏幕输出一个等腰三角形、循环语句案例-窗口移动
=============================================================================
复习:
(注意常量也是有类型的哦!)
例如:

  #define MAX 100 说明定义的MAX是一个有符号的int
  const long a = 100u; 说明定义的a是一个无符号的long
  "a"字符串常量 相当于 ‘a‘ ‘\0‘
  ‘a‘字符常量,字符常量只能是一个ASCII字符

  int 4个BYTE、2个WORD 、1个DWORD
  c语言中不能直接书写二进制,用8进制和16进制来替代(和默认的十进制)。

  int a = 100;
  int b = sizeof(a);
  sizeof 关键字 作用是:得到某一数据类型在内存中占用的大小(内存大小没有负的),单位是:字节
  sizeof 不是函数,所以不需要包含任何头文件
  其实呢,sizeof返回值的类型是size_t,size_t类型在32位操作系统下是一个无符号的整数。
  在32位系统下,sizeof返回值是unsigned int,用 %u;在64位系统下,unsigned long,用%lu。
  例如:
  在32位系统下:
    int a = 100;
    printf("%u\n", sizeof(a));
  在64位系统下:
    int a = 100;
    printf("%lu\n", sizeof(a));
-----------------------------------------------------------------------------
  int a; 等同于 signed int a;
  unsigned int a;

  long   在32位系统下是4个BYTE,在64位系统下是多少?windows是4个字节,linux是8个字节。

  200f   等同于 200.0   
-----------------------------------------------------------------------------
  int a = ‘a‘; //a = 97,是可以存放的
  char a = 500; //是不可以存放的,溢出了,最大放127

  ‘2‘ 和 2 的区别在哪里?
  ‘2‘是字符2dASCII
  2是整数2

  "100" 和 100 区别在哪里?
  ‘1‘ ‘0‘ ‘0‘ ‘\0‘
  100是一个int型整数常量
-----------------------------------------------------------------------------
  int a = a; //错误的写法!

  char a = 97;
  printf("%d\n", a); //输出结果是97
  printf("%c\n", a); //输出结果是字符a

abc
bcd(这里其实是回车+换行)

abc
  bcd(只有换行,没有回车)

bcd(abc是被bcd重叠了,这叫回车)

回车键的由来:
键盘:
--------------------------------------------------打印头
    ------------------------
    -         -
    -     回车键 -
    -         -
    ------------------------
    在打字机上按回车键,打印头就会复位

=============================================================================
程序的三种结构:
  1,顺序结构
  2,分支结构
  3,循环结构
=============================================================================
条件分支语句:
1、关系运算符:在c语言中0代表false,非0代表真。
关系运算符有:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、!=(不等于)
       -----------------------------------------------------------------|-----------------------------
             前四种优先级相同            大于        后两种优先级相同

  0   假
  1   真
  34   真
  -34  真,非0就是真

  条件运算符:(条件) ? 值1:值2
  当条件成立时,表达式的值为1;当条件不成立时,表达式的值为2。
  很多时候用问号来替代简单的if语句。
  例如:求绝对值的例子
  int i = -8;
  int x = (i < 0) ? -i: i;
-----------------------------------------------------------------------------
2、逻辑运算符:&&(逻辑与/and)、||(逻辑或/or)、!(逻辑非/not)
       -----------------------------------------|---------------------
      双目运算符(两边必须要有表达式叫双目)   单目运算符
-----------------------------------------------------------------------------
3、1)单分支语句
  if是条件分支语句:如果条件为真,则执行代码块中的代码。
  if (条件)
  {
    代码块;
  }
-----------------------------------------------------------------------------
2)双分支语句
  if else是双分支语句:
  if (条件)
  {
    代码块1;
  }
  else
  {
    代码块2;
  }
-----------------------------------------------------------------------------
3)多重分支语句(多重if):else总是跟上面最近那个if配对(特别注意)
  if (条件1)
  {
    代码块1;
  }
  else if (条件2)
  {
    代码块2;
  }
  else if (条件3)
  {
    代码块3;
  }
  ......
  else
  {
    代码块3;
  }

例子如下:四则运算
#include <stdio.h>

int main()
{
  int a;
  int b;
  char c;
  printf("please input a:");
  scanf("%d", &a);
  printf("please input b:");
  scanf("%d", &b);
  printf("please input c:");
  getchar(); //把调用scanf时候用户输入的回车键吃掉
  c = getchar();
  //printf("a = %d, b = %d, c = %c\n", a, b, c); //打印结果测试下
  if (c == ‘+‘)
  {
    printf("%d\n", a + b);
  }
  else if (c == ‘-‘)
  {
    printf("%d\n", a - b);
  }
  else if (c == ‘*‘)
  {
    printf("%d\n", a * b);
  }
  else if (c == ‘/‘)
  {
  if (b != 0)
    printf("%f\n", (double)a / b);
  else
    printf("error\n");
  }
  else
  {
    printf("input error\n");
  }
    return 0;
  }
-----------------------------------------------------------------------------
4)多重分支语句(多重选择:switch与break,default)
  switch (量)
  {
  case 值1:
    语句1;
    break;
  case 值2:
    语句2;
    break;
  ......

    ......

    ......  
  case 值n:
    语句n;
    break;
  default:
    语句;   //当所有case都不满足时,执行default下面的语句。
}

例子如下:四则运算
#include <stdio.h>

int main()
{
  int a;
  int b;
  char c;
  printf("please input a:");
  scanf("%d", &a);
  printf("please input b:");
  scanf("%d", &b);
  printf("please input c:");
  getchar(); //把调用scanf时候用户输入的回车键吃掉
  c = getchar();
  //printf("a = %d, b = %d, c = %c\n", a, b, c); //打印结果测试下
  switch (c)
  {
  case ‘+‘:
    printf("%d\n", a + b);
    break;
  case ‘-‘:
    printf("%d\n", a - b);
    break;
  case ‘*‘:
    printf("%d\n", a * b);
    break;
  case ‘/‘:
    if (b != 0)
      printf("%f\n", (double)a / b);
    else
      printf("error\n");
    break;
  default:
    printf("input error\n");
  }
  return 0;
}

注意:当条件特别复杂时用if;当条件简单,但分支很多时用switch。
-----------------------------------------------------------------------------
if、switch与?(问号) 都是有条件分支语句;
无条件分支语句:goto

  goto end; //无条件跳转到标号end去执行代码
  ...
  ...
  end: //标号

但是不提倡大量使用goto,除非使用goto能大大简化代码量。

=============================================================================
循环语句:

while (条件)
{
  代码块;
}
-----------------------------------------------------------------------------
continue语句
当循环遇到continue语句时,不再执行continue下面代码,而是直接返回到循环起始语句处继续执行循环。
(即当循环遇到continue时,就直接返回到开始重新判断条件的地方去了)
-----------------------------------------------------------------------------
break语句
当循环遇到break语句时,立刻终止循环,循环结束。
-----------------------------------------------------------------------------
do while

do
{
  语句;
}while (条件);
-----------------------------------------------------------------------------
while 是先判断条件,再决定是否循环
do while 先循环,然后再判断条件

while可能一次都不循环,但是do while至少能循环一次。

注意:
while (a != 10);   //该句话相当于 while (a != 10)
{
;
}
相当于死循环,什么都没有干。
=============================================================================
小练习:求自然数的和。
用户可以任意输入一个正整数,求从1到这个整数之间所有自然数的和。
例如:输入5
1 + 2 + 3 + 4 + 5 = 15

VS2017下的代码如下:
#include <stdio.h>
#pragma warning(disable:4996)

int main()
{
  int sum = 0; //用来保存计算自然数之和的变量
  int a = 10;
  scanf("%d", &a);
  while (a > 0)
  {
    sum += a;
    a--;
  }
  printf("%d\n", sum);
  return 0;
}
-----------------------------------------------------------------------------
课堂作业:求整数的位数
任意输入一个整数,假设用户输入了123,程序运行输出 百
如果用户输入了2896,程序输出 千
如果用户输入了10000,输出 万

VS2017下的代码如下:
#include <stdio.h>
#pragma warning(disable:4996)

int main()
{
  int a = 0;
  scanf("%d", &a);
  int sum = 0; //sum是一个计数器

  while (a > 0) //c语言中 % 是取余运算, / 是取整运算
  {
  sum++;
  a /= 10;
  }

  switch (sum)
  {
  case 1:
    printf("个\n");
    break;
  case 2:
    printf("十\n");
    break;
  case 3:
    printf("百\n");
    break;
  }
  return 0;
}
-----------------------------------------------------------------------------
小练习:求100到999之间所有的水仙花数。
水仙花数是什么?
一个数的百位的立方 + 十位的立方 + 个位的立方 = 这个数本身
例如:371就是一个水仙花数
3 * 3 * 3 + 7 * 7 * 7 + 1 * 1 * 1 = 371

VS2017下的代码如下:
#include <stdio.h>

int main()
{
  int a;
  for (a = 100; a < 1000; a++)
  {
    int a1; //百位
    int a2; //十位
    int a3; //个位

    a1 = a / 100 % 10; //a/100=5;5%10=5 注意:/ 和 % 的优先级一样,则结合性从左到右
    a2 = a / 10 % 10; //a/10=53;53%10=3
    a3 = a / 1 % 10; //a/1=537;537%10=7

    if ((a1 * a1 * a1 + a2 * a2 * a2 + a3 * a3 * a3) == a)
      printf("%d\n", a);
  }
  return 0;
}
-----------------------------------------------------------------------------
九九乘法表

VS2017下的代码如下:
#include <stdio.h>
int main()
{
  int a;
  int b;
  for (a = 1; a < 10; a++) //外循环,控制行,即外循环决定有多少行
  {
  for (b = 1; b <= a; b++) //内循环,控制列,即内循环决定每一行有几个列,外循环每循环一次,内循环循环4次
  {
    printf("%d\t", a * b);
  }
  printf("\n");
  }
  return 0;
}
-----------------------------------------------------------------------------
作业:在屏幕输出一个等腰三角形
-------*-------
------***------
-----*****-----
----*******----
---*********---
--***********--
-*************-
***************
不能用printf一行一行打印输出等腰三角形
printf("     *\n");
printf("    ***\n");
printf("   *****\n");

分析:
每一行的*和行号的关系是:行号 * 2 - 1
每一行的*和减号的关系是:行号 - 1;行号 - 2;行号 - 3;......;行号 - 行号

VS2017下的代码如下:
#include <stdio.h>
#pragma warning(disable:4996)

int main()
{
  int a;
  int b;
  int num = 0;
  scanf("%d", &num);
  for (a = 1; a <= num; a++) //外循环,控制行,即外循环决定有多少行
  {
    for (b = 0; b < num - a; b++)
    {
    printf("-");
    }
    for (b = 0; b < a * 2 - 1; b++) //内循环,控制列,即内循环决定每一行有几个,外循环每循环一次,内循环循环num次
    {
      printf("*");
    }
    for (b = 0; b < num - a; b++)
    {
      printf("-");
    }
    printf("\n");
  }
  return 0;
}
=============================================================================
循环语句案例-窗口移动

VS2017下的代码如下:

#include <stdio.h>

#include <Windows.h> //使用窗口移动,需要利用API函数,则需要包含一个头文件

int main()
{
  int x = 100;
  int y = 100;
  int status = 0;     //0代表从左往右跑,1代表从右往左跑。
  int status1 = 0;   //0代表从上往下跑,1代表从下往上跑。
  int status2 = 1;   //0代表x轴不动,1代表y轴不动

  while (1)
  {
    SetWindowPos((HWND)0x00830968, NULL, x, y, 300, 200, 0); //这个函数可改变一个窗口的位置和大小

  if (status == 0 && status2 == 1)
    x += 10;

  if (x >= 1000)
  {
    status1 = 0;
    status2 = 0;
  }
  if (status1 == 0 && status2 == 0)
    y += 10;

  if (y >= 800)
  {
    status = 1;
    status2 = 1;
  }
  if (status == 1 && status2 == 1)
    x -= 10;

  if (x <= 100)
  {
    status1 = 1;
    status2 = 0;
  }
  if (status1 == 1 && status2 == 0)
    y -= 10;

  if (y <= 100)
  {
    status = 0;
    status2 = 1;
  }
  //if (status == 0 && status2 == 1)
  //x += 10;
  Sleep(20); //Sleep函数的功能是程序休眠,参数单位是毫秒,1000ms代表1秒
}
  /*
  该函数的参数解释如下:
  第一个参数:是窗口的句柄。句柄:是windows的一个概念,即所有的窗口都有一个唯一的编号,这个编号叫句柄。(注意句柄是16进制的)
  如何得到某一个窗口的句柄呢?在vs2017的/工具选项/Spy++(间谍的意思)/查找窗口/查找程序工具/拖动到对应的窗口
  第二个参数:默认写NULL。
  第三个参数:是窗口位置的x坐标。
  第四个参数:是窗口位置的y坐标。
  第五个参数:是窗口宽度。
  第六个参数:是窗口高度。
  第七个参数:默认写0。
  

  (0,0)左上角
  ------------------------------x轴
  |
  |
  |
  |y轴

  */
  return 0;
}

=============================================================================

时间: 2024-10-25 13:30:12

c语言基础学习04的相关文章

C语言基础学习5:字符串与指针

1.字符串的表示形式 (1)用字符数组存放一个字符串,然后输出该字符串. char string[] = "I am happy"; printf("%s",string); (2)用字符指针指向一个字符串. char *string = "I am happy"; printf("%s",string); 2.字符指针作函数参数 (1)用字符数组作参数 void CopyString(char from[], char to

C语言基础学习3:数组与指针

数组元素的指针就是数组元素的地址. 1.指向数组元素的指针 C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中的首元素(即序列为0的元素)的地址. int a[10]; int *p1,*p2; p1 = &a[0]; p2 = a; p1和p2指向同一个数组a[10]. 2.通过指针引用数组元素 按C语言的规定,如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,而不是将p的值(地址)简单的加1. 如果p的初值为&a[0],则 (1)

C语言基础学习3:指针

1.地址和指针的概念 一个变量的地址成为该变量的“指针”. 如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”,指针变量的值(即指针变量中存放的值)是地址(即指针). 指针是一个地址,而指针变量是存放地址的变量 2.变量的指针和指向变量的指针变量 2.1指针变量的定义 指针变量的定义:基类型 *指针变量名: int a; int *pointer; pointer = &a; 2.2指针变量的引用 指针变量中只能存放地址,不能将一个整数赋给一个指针变量. “&”和“*

C语言基础学习2:字符数组

在C语言的基本数据类型中没有没有字符串变量,一般以字符数组的形式给出. 1.字符串数组的初始化 char c[] = {'I', ' ', 'a', 'm', 'h', 'a', 'p', 'p', 'y'}; char c[] = "I am happy"; 区别:第一种方式字符串长度为10,内存中占10*sizeof(char)个字节,第二种方式是以字符串形式表示,有一个字符串结束字符'\0',内存中占11*sizeof(char)个字节. 2.字符数组的输入输出 %c,一个一个字

C语言基础学习7:返回指针值的函数

一个函数可以返回一个整型值.字符值.实型值等,也可以返回指针型的数据,即地址,返回的是指针类型. 返回指针值的函数的一般定义形式为; 数据类型 *函数名(参数列表) 例如: int *a(int x, int y); a作为函数名,调用它之后能得到一个指向整型数据的指针(地址). ()优先级高于*,因此a先与()结合,这是函数形式,返回值为指针形式. 1 #include <stdio.h> 2 float *search(float (*pointer)[4]); 3 float *sear

C语言基础学习8:指针数组

一个数组,若其元素均为指针类型数据,称为指针数组,指针数组中的每一个元素都相当于一个指针变量. 一维指针数组的定义形式为: 类型名 *数组名[数组长度]: 例如:int *p[4]; []的优先级比*高,因此p先与[4]结合,形成p[4]形式,这是数组形式,然后再与p前面的"*"结合,"*"表示此数组是指针类型的,每个数组元素都可指向一个整型变量. 为什么要用到指针数组呢? 因为它比较适合于用来指向若干个字符串,使得字符串处理更加灵活. 1 #include <

C语言基础学习9:指向指针的指针

一般形式: 基类型 **变量名: 例如:char **p; void main() { char *name[] = {"Follow me","Basic","Great Wall","FORTRAN","Computer design"}; char **p; int i; for(i=0;i<5;i++) { p = name + i; printf("%s\n",*p);

C语言基础学习1:格式输出

1.字符数据的输入输出 putchar函数:向终端输出一个字符. 使用形式:putchar(c); getchar函数:从终端输入一个字符. 使用形式:c = getchar(); 2.格式输入输出 2.1 printf函数:向终端输出若干个任意类型的数据. 一般格式:printf(格式控制,输出表列). 2.1.1 d格式符 %d     按十进制整型数据的实际长度输出. %md  m为指定的输出字段的宽度,如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出. %ld    输出

C语言基础学习笔记

--C语言框架-- 数据  字节byte          字符   char         8  半字half word     短整型        short int    16    字word            整型   int(integer)   32               长整型   long int     32                 单精度   float        32   双字(double word) 双精度  double       64