8.C语言-循环结构设计

8.C语言-循环结构设计1.循环的定义使用循环可以多次重复地执行多条语句,这里的“多条语句”称为循环体。在C语言中,可以使用三种循环,分别是:while、do…wh

欢迎大家来到IT世界,在知识的湖畔探索吧!

1.循环的定义

使用循环可以多次重复地执行多条语句,这里的“多条语句”称为循环体。在C语言中,可以使用三种循环,分别是:while、do…while和for。

循环结构有两大要素:循环条件和循环体,当满足某个条件时,重复执行某些动作,直到该条件不再满足,这个表述很好地体现了循环条件和循环体的关系。构造循环时,首先要明自要做什么,即“循环体是什么”,这是和程序的目的相关的,知道要干什么了还不够,还要明白什么时候开始做,什么时候停,如果没有合理设定循环条件,很容易造成程序死循环,甚至是资源耗尽导致电脑死机。

8.C语言-循环结构设计

2.while循环语

只要控制表达式为 true,while 循环就会反复地执行语句

while (表达式)语句

while 表达式是顶部驱动(top-driven)的循环:先计算循环条件(也就是控制表达式)。如果为 true,就执行循环体,然后再次计算控制表达式。如果控制表达式为 false,程序跳过循环体,而去执行循环体后面的语句。

8.C语言-循环结构设计

一个死循环

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
  while (1)//死循环
  {
    printf("go..");
  }
}

欢迎大家来到IT世界,在知识的湖畔探索吧!

输入一个数字,循环打印

欢迎大家来到IT世界,在知识的湖畔探索吧!#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
  int num;
  scanf("%d", &num);
  while (num)
  {
    printf("%d\n", num);
    num--;
  }
}

统计100以内的合计值

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
  int num=0;
  int t=0;
  while (t<=100)
  {
    num=num + t;
    t ++;
  }
  printf("%d", num);
}

从5050递减

欢迎大家来到IT世界,在知识的湖畔探索吧!#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
  int num=5050;
  int t=0;
  while (num>0)
  {
    printf("%d,%d\n", num, t);
    t = t + 1;
    num -= t;
    
  }
  printf("%d", num);
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
  int num=5050;
  int t=100;
  while (t>0)
  {
    printf("%d,%d\n", num, t);
    num -= t;
    t--;
  }
  printf("%d", num);
}

计算2的几次方

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
  int num = 1;
  int i;
  scanf("%d", &i);
  while (i)
  {
    num *= 2;
    i--;
    printf("%d,%d\n", num, i);
  }
}

3.do while循环语

do…while 循环是在循环的尾部检查它的条件。

do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。

8.C语言-循环结构设计

打印输出小于等于10个数字

#include<stdio.h>

void main() {
  int a = 1;
  do {
    printf("%d\n", a);
    a++;
  } while (a <= 10);
}

消耗内存

#include<stdio.h>
#include<Windows.h>

void main() {
   
  do {
    malloc(1024 * 1024 * 10);//分配10M内存
    Sleep(2000);//每两秒一次
  } while (1);
}

调用system

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {

  int num;
  scanf("%d", &num);
  do {
    system("notepad");//start
    printf("%d\n", num);
    num--;
  } while (num > 0);
}

100以内累加

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
  int num = 1;
  int sum = 0;
  do {
    sum += num;
    num++;
  } while (num <= 100);
  printf("%d",sum);
}

操作窗口

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>

void opennotepad() {
  ShellExecuteA(0, "Open", "notepad.exe", 0, 0, 1);
}

void closenotepad() {
  system("taskkill /f /im notepad.exe");
}

void move() {
  //通过spy+
  HWND win = FindWindowA("Notepad", "Notepad");
  if (win == NULL) {
    printf("没有找到句柄");
    return;
  }
  int x, y;
  x = 0;
  y = 0;
  
  do
  {
    SetWindowPos(win, NULL, x, y, 300, 300, 0);
    x+=2;
    y+=2*1080/1920;

  } while (x<1920);
  
}

void main() {
  opennotepad();
  Sleep(2000);
  move();
  closenotepad();
}

SetWindowPos 最后一个参数

Value

含义

SWP_ASYNCWINDOWPOS 0x4000

如果调用线程和拥有窗口的线程附加到不同的输入队列,系统会将请求发布到拥有该窗口的线程。 这可以防止调用线程阻止其执行,而其他线程处理请求。

SWP_DEFERERASE 0x2000

阻止生成 WM_SYNCPAINT 消息。

SWP_DRAWFRAME 0x0020

绘制在窗口的类说明中定义的框架 () 窗口周围。

SWP_FRAMECHANGED 0x0020

使用 SetWindowLong 函数应用设置的新框架样式。 将 WM_NCCALCSIZE 消息发送到窗口,即使窗口的大小未更改也是如此。 如果未指定此标志,则仅当窗口的大小发生更改时, 才会发送WM_NCCALCSIZE

SWP_HIDEWINDOW 0x0080

隐藏窗口。

SWP_NOACTIVATE 0x0010

不激活窗口。 如果未设置此标志,则会激活窗口,并根据 hWndInsertAfter 参数) 的设置 (将窗口移到最顶部或最顶层组的顶部。

SWP_NOCOPYBITS 0x0100

丢弃工作区的整个内容。 如果未指定此标志,则会在调整或重新定位窗口后保存并复制回工作区的有效内容。

SWP_NOMOVE 0x0002

保留当前位置 (忽略 XY 参数) 。

SWP_NOOWNERZORDER 0x0200

不更改 Z 顺序中的所有者窗口位置。

SWP_NOREDRAW 0x0008

不重绘更改。 如果设置了此标志,则不执行任何形式的重绘。 这适用于工作区、非工作区 (,包括标题栏和滚动条) ,以及由于移动窗口而发现的父窗口的任何部分。 设置此标志后,应用程序必须显式失效或重新绘制需要重绘的窗口和父窗口的任何部分。

SWP_NOREPOSITION 0x0200

SWP_NOOWNERZORDER 标志相同。

SWP_NOSENDCHANGING 0x0400

阻止窗口接收 WM_WINDOWPOSCHANGING 消息。

SWP_NOSIZE 0x0001

保留当前大小 (忽略 cxcy 参数) 。

SWP_NOZORDER 0x0004

保留当前 Z 顺序 (忽略 hWndInsertAfter 参数) 。

SWP_SHOWWINDOW 0x0040

显示“接收端口跟踪选项” 窗口。

ShellExecuteA 最后一个参数

Value

含义

SW_HIDE0

隐藏窗口并激活另一个窗口。

SW_SHOWNORMALSW_NORMAL1

激活并显示窗口。 如果窗口最小化或最大化,系统会将其还原到其原始大小和位置。 首次显示窗口时,应用程序应指定此标志。

SW_SHOWMINIMIZED2

激活窗口并将其显示为最小化窗口。

SW_SHOWMAXIMIZEDSW_MAXIMIZE3

激活窗口并显示最大化的窗口。

SW_SHOWNOACTIVATE4

在其最近的大小和位置显示一个窗口。 此值类似于 SW_SHOWNORMAL,但窗口未激活。

SW_SHOW5

激活窗口并以当前大小和位置显示窗口。

SW_MINIMIZE6

最小化指定的窗口,并按 Z 顺序激活下一个顶级窗口。

SW_SHOWMINNOACTIVE7

将窗口显示为最小化窗口。 此值类似于 SW_SHOWMINIMIZED,但窗口未激活。

SW_SHOWNA8

以当前大小和位置显示窗口。 此值类似于 SW_SHOW,但窗口未激活。

SW_RESTORE9

激活并显示窗口。 如果窗口最小化或最大化,系统会将其还原到其原始大小和位置。 还原最小化窗口时,应用程序应指定此标志。

SW_SHOWDEFAULT10

根据启动应用程序的程序传递给 CreateProcess 函数的 STARTUPINFO 结构中指定的**SW_**值设置显示状态。

SW_FORCEMINIMIZE11

即使拥有窗口的线程未响应,也会最小化窗口。 仅当将窗口从不同的线程最小化时,才应使用此标志。

4.for语句

for 循环允许您编写一个执行指定次数的循环控制结构。

for ( init; condition; increment )
{
   statement(s);
}
  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
8.C语言-循环结构设计

死循环

中间语句为空,就是无线循环

void main() {
  for (;;) {
    printf("GO...");
  }
}
void main() {
  for (;-1;) {
    printf("GO...");
  }
}

不写表达式1,与3,这不就是一个while吗?

void main() {
  int i = 1;
  for (; i <= 100;)
  {
    printf("%d\n", i);
    i++;
  }
}

100以内合计++

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>

void main() {
  int sum = 0;
  for (int i = 0; i <= 100; i++)
  {
    sum += i;
  }
  printf("%d", sum);
}

—操作

void main() {
  int sum = 0;
  for (int i = 100; i>0; i--)
  {
    sum += i;
  }
  printf("%d", sum);
}

计算100以内两个相邻数乘积的和

void main() {
  int sum = 0;
  for (int i = 1; i <= 100; i=i+2)
  {
    printf("%d,%d,%d\n", sum, i, i + 1);
    sum += i * (i + 1);
  }
  printf("%d", sum);
}
void main() {
  int sum = 0;
  for (int i = 0; i <= 50; i++)
  {
    sum = sum + (2 * i) * (2 * i - 1);
  }
  printf("%d", sum);
}

表达式1初使化多个变量,表达式1,3可以用逗号表达式。

void main() {
  for (int i = 0,j=0; i < 100; i++,j+=2)
  {
    printf("%d,%d\n", i, j);
  }
}

5.循环的嵌套

一个循环体中又包含一个完整的循环结构,称为循环的嵌套,while循环、do-while循环和for循环都可以进行嵌套,而且可以相互嵌套。

void main() {
  for (int i = 0; i < 10; i++)
  {
    for (int j = 0; j < 10; j++)
    {
      printf("%3d,%3d", i, j);
    }
    printf("\n");
  }
}

8.C语言-循环结构设计

8.C语言-循环结构设计

99乘法表

void main() {
  for (int i = 0; i < 10; i++)
  {
    for (int j = i; j < 10; j++)
    {
      printf("%3d*%-3d=%3d", i, j, i * j);
    }
    printf("\n");
  }
}
8.C语言-循环结构设计

修改打印方向

void main() {
  for (int i = 1; i < 10; i++)
  {
    for (int j = 1; j <= i; j++)
    {
      printf("%3d*%-3d=%3d", i, j, i * j);
    }
    printf("\n");
  }
}

6.break语句

用在switch语句中使流程跳出switch结构,继续执行switch语句后面的语句。用在循环体内,将所在循环立即终止,继续执行循环体后面的第一条语句。

break语句不能用于循环语句和switch语句之外的任何其他语句。

void main() {
  for (int i = 0; i < 10; i++)
  {
    if (i == 8) {
      break;
    }
    printf("%d\n", i);
  }
}

计算x+45=99

void main() {
  for (int i = 0; i < 100; i++)
  {
    if (i+45==99) {
      printf("%d+45=99", i);
      break;
    }
  }
}

解7x+3y=100

//7x+3y=100;
void main() {
  for (int i = 0; i < 100; i++)
  {
    for (int j = 0; j < 100; j++)
    {
      if (7 * i + 3 * j == 100) {
        printf("%d,%d\n", i, j);
        break;
      }
    }
  }
}
void main() {
  for (int i = 0; i < 100; i++)
  { 
    if ((100 - 3 * i) % 7 == 0) {
      printf("%d,%d\n", i, (100 - 3 * i) / 7);
    }
  }
}

再试一下switch

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>

void main() {
  char c;
  c = getchar();
  int d = 0;
  switch (c)
  {
  case 'a':
    MessageBoxA(0, "a", "Hello", 0);
    break;
  case 'b':
    d=MessageBoxA(0, "b", "Hello", MB_YESNO);
    printf("%d", d);
    break;
  case 'c':
    MessageBoxA(0, "c", "Hello", 2);
    break;
  default:
    MessageBoxA(0, "NULL", "Hello", 3);
    break;
  }
}

注:bread一般用于找到一个符合条件时

MessageBoxA

显示一个模式对话框,其中包含系统图标、一组按钮和一条简短的应用程序特定消息,例如状态或错误信息。 消息框返回一个整数值,该值指示用户单击的按钮。

[in, optional] hWnd

类型:HWND

要创建的消息框的所有者窗口的句柄。 如果此参数为 NULL,则消息框没有所有者窗口。

[in, optional] lpText

类型: LPCTSTR

要显示的消息。 如果字符串由多个行组成,则可以使用回车符和/或每行之间的换行符分隔这些行。

[in, optional] lpCaption

类型: LPCTSTR

对话框标题。 如果此参数为 NULL,则默认标题为 Error

[in] uType

类型: UINT

对话框的内容和行为。 此参数可以是以下标志组中的标志的组合。

Value

含义

MB_ABORTRETRYIGNORE 0x00000002L

消息框包含三个推送按钮: 中止重试忽略

MB_CANCELTRYCONTINUE 0x00000006L

消息框包含三个推送按钮: “取消”、“ 重试”、“ 继续”。 使用此消息框类型,而不是MB_ABORTRETRYIGNORE。

MB_HELP 0x00004000L

向消息框添加 “帮助 ”按钮。 当用户单击 “帮助 ”按钮或按 F1 时,系统会向所有者发送 WM_HELP 消息。

MB_OK 0x00000000L

消息框包含一个推送按钮: 确定。 这是默认值。

MB_OKCANCEL 0x00000001L

消息框包含两个推送按钮: “确定 ”和 “取消”。

MB_RETRYCANCEL 0x00000005L

消息框包含两个推送按钮: 重试取消

MB_YESNO 0x00000004L

消息框包含两个推送按钮:

MB_YESNOCANCEL 0x00000003L

消息框包含三个推送按钮: 取消

7.continue语句

结束本次循环,跳过循环体中尚未执行的语句,接着进行是否执行下一次循环的判定。

输出100以内的奇数

void main() {
  for (int i = 0; i <= 100; i++)
  {
    if (i %2==0) {
      continue;
    }
    printf("%d\n", i);
  }
}

注:一般用在查找所有符合答件时用。

void main() {
  char c=0;
  while (c!='X')
  {
    c = getchar();
    if (c == '4') {
      continue;
    }
    putchar(c);
  }
  system("pause");
}

8.goto语句

goto 语句允许把控制无条件转移到同一函数内的被标记的语句。

在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

goto label;
..
.
label: statement;
8.C语言-循环结构设计

标记符,可以是任何除 C 关键字以外的纯文本,它可以设置在 C 程序中 goto 语句的前面或者后面。

死循环

void main() {
PrintLable:printf("hello world");
  goto PrintLable;
}

一个累计到100的合计

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#include<string.h>


void main() {
  int i = 1;
  int sum = 0;
FORLabel:if (i <= 100) {
  sum += i;
  i++;
  goto FORLabel;
  }
printf("%d", sum);
}

当goto与if else 配合可以实现循环

用户登录

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#include<string.h>


void main() {
  char name[10] = "";
  char password[10] = "";
  gets(name);
  gets(password);
Login:  if (strcmp(name, "admin") == 0 && strcmp(password, "123456") == 0) {
  printf("登录成功!");
}
else {
  printf("输入信息不正确\n");
  gets(name);
  gets(password);
  printf("%s,%s\n", name, password);
  goto Login;
}
}

查找从1到200之间不能被5整除的数

void main() {
  int i = 0;
IFA:
  if (i < 200) {
    i++;
    if (i % 5 == 0) {
      goto IFA;
    }
    printf("%d\n", i);
    goto IFA;
  }
}

这里是不是像continue

这一段逻辑比较混乱了,不便于阅读

void main() {
  goto D;
A:printf("A\n");
  goto E;
B:printf("B\n");
  goto A;
C:printf("C\n");
  goto B;
D:printf("D\n");
  goto C;
E:printf("终于结束了!");
}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/30035.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信