C 语言-循环嵌套-函数

C 语言 - 循环嵌套、函数

1. 循环嵌套

1.1 作用

循环 套 循环。

1.2 使用

需求1:

打印以下图形:

* * * *
* * * *
* * * *
* * * *

代码:

1、使用循环打印

#include <stdio.h>
int main(int argc, char const *argv[])
{for (int i = 0; i < 4; i++){printf("* * * *\n");}return 0;
}

2、循环嵌套打印

#include <stdio.h>
int main(int argc, char const *argv[])
{for (int i = 0; i < 4; i++)	//外层控制行数{for (int j = 0; j < 4; j++) //内层控制每一行的样式{printf("* ");}printf("\n");}return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (j <= i){printf("* ");}}printf("\n");}return 0;
}

小结:

i
0	*
1	* *
2	* * * 
3	* * * *0 1	2 3 j
  • 外层 控制 行数

  • 内层 控制 每一行的样式

需求2:

打印以下图形

* 
* * 
* * * 
* * * * 
* * * * * 
* * * * * * 
* * * * * * * 
* * * * * * * * 
* * * * * * * * * 

代码:

#include <stdio.h>
int main(int argc, char const *argv[])
{for (int i = 0; i < 9; i++){for (int j = 0; j < 9; j++){if (j <= i){printf("* ");}}printf("\n");}return 0;
}

优化:

#include <stdio.h>
int main(int argc, char const *argv[])
{for (int i = 0; i < 9; i++){for (int j = 0; j <= i; j++){printf("* ");}printf("\n");}return 0;
}

需求3:

打印9*9乘法表

#include <stdio.h>
int main(int argc, char const *argv[])
{for (int i = 1; i < 10; i++){for (int j = 1; j <= i; j++){// 1 * 1 = 1printf("%d * %d = %d\t", i, j, i*j);}printf("\n");}return 0;
}

结果如下:

在这里插入图片描述

1.3 案例

例1:

百文百鸡

  • 中国古代,有一个人去市场买鸡
    • 公鸡3文钱一只
    • 母鸡2文钱一只
    • 小鸡1文钱三只
  • 这个人有100文钱,要求买100只鸡
  • 请问他可以有多少中买法,每种每种买法可以可以公鸡多少只,母鸡多少只,小鸡多少只
数学思路假设:公鸡x只母鸡y只小鸡100-x-y只3 * x + 2 * y + (100 -x -y) / 3 = 100;x + y + (100 - x - y) = 100;
代码思路:公鸡取值范围:0~33母鸡取值范围:0~50小鸡取值范围:0~100遍历

代码:

#include <stdio.h>
int main(int argc, char const *argv[])
{int num = 0;for (int g = 0; g < 34; g++){for (int m = 0; m < 51; m++){int x = 100 - g - m;if (3 * g + 2 * m + x / 3 == 100 && x % 3 == 0){printf("公鸡:%d只,母鸡:%d只,小鸡:%d只\n", g, m, x);num++;}}}printf("共有%d种买法\n", num);return 0;
}

输出结果:

公鸡:0只,母鸡:40只,小鸡:60只
公鸡:5只,母鸡:32只,小鸡:63只
公鸡:10只,母鸡:24只,小鸡:66只
公鸡:15只,母鸡:16只,小鸡:69只
公鸡:20只,母鸡:8只,小鸡:72只
公鸡:25只,母鸡:0只,小鸡:75只
共有6种买法

例2:

鸡兔同笼

  • 养殖户将鸡与兔子放在同一个笼中

  • 该养殖户无法数清鸡的数量与兔的数量

  • 但是该养殖户数出了腿的数量与头的数量

    ​ 腿60
    ​ 头20

  • 请您帮助养殖户计算鸡兔个几何

数学思想:设:兔子有t只,鸡有j只4 * t + 2 * j = 60;t + j = 20;t = 20 - j;4 * (20 -j ) + 2j = 60;80 -4j + 2j = 60;80 - 2j = 60;80 - 60 = 2j;20 = 2j;j = 10;t = 10;
代码思想:鸡的取值范围:0~20兔的取值范围:0~15

代码:

#include <stdio.h>
int main(int argc, char const *argv[])
{int tag = 0;for(int j = 0; j <= 20; j++){for(int t = 0; t <= 15; t++){if(j + t == 20 && 4 * t + 2 * j == 60){tag = 1;printf("鸡有:%d只,兔有:%d只\n",j,t);}}}if(tag){printf("输入的头与腿数量正确\n");}else{printf("此题无解,头腿数量有误\n");}return 0;
}// 输出:鸡有:10只,兔有:10只

2. 函数

2.1 作用

封装一段代码,使其便于使用。

注意:

  • 一个功能可以封装一个函数
  • 定义函数的时候一切 以功能为目的,根据功能去定义函数的参数返回值

2.2 分类

1、库函数 (c 库实现的)

  • 不能直接操作内核

2、系统调用 (操作系统实现的函数)

  • 可以直接操作内核

3、自定义函数 (程序员自己实现的函数)

  • 定义
  • 调用

2.3 使用步骤

① 声明(可有可无)

语法:
extern 返回值类型 函数名(形参列表);
注意:

  • 在函数外声明
  • 声明函数时可以忽略形参的变量名不写
② 定义

语法:

返回值类型 函数名(形参列表)
{函数体
}

解释:

  • 返回值类型:返回值的数据类型,当函数没有返回值,返回值类型为void(空类型)

  • 函数名:标识符,自定义的

  • 形参列表:根据实际情况,可有可无,多个参数之间使用逗号隔开,每个参数有数据类型变量名编写

  • 函数体:封装的代码

  • return:结束当前函数

  • return xxx:结束当前函数并返回xxx,xxx就是返回值

注意:

  • 一个函数最多只能有一个返回值
  • 同一个源文件函数名不能重复(c语言不支持重载)
  • 函数不能定义在函数中

例1:定义函数计算10+1的结果

voild add01()
{int x = 10 + 1;printf("x=%d\n",x);
}

例2:定义一个函数计算两数之和

void add02(int x,int y)
{int sum = x + y;printf("sum=%d\n",sum);
}

例3:定义一个函数计算 1 + 2的结果,并将结果返回给调用处

int add03()
{int x = 1 + 2;return x;
}

例4:定义一个函数判断是否成年,成年返回1,未成年返回0

int iscN(int age)
{if(age >= 18){return 1;} else{return 0;}
}
③ 调用

语法:

  • 调用 无返回值 的函数
    • 函数名(实参列表);
  • 调用有返回值的函数
    • 函数名(实参列表);
    • 变量名 = 函数名(实参列表);

注意:

  • 实参列表 要与 形参列表 一致 (长度一致,顺序一致,数据类型一致)
  • 一个函数可以被调用无数次
  • 只能在函数中调用

例:

add01();add02(1,2);
add02(5,10);int a = 1;
int b = 9;
add02(a,b);add03();
int x = add03();iscN(19);
int y = iscN(20);
int age = 17;
int z = iscN(age);

2.4 特殊情况

① 多重调用
在函数A中调用函数B,在B中调用c,c中调用....

例:

#include <stdio.h>
extern void funA();
extern void funB();
extern void func();
void funA()
{printf("A开始\n");funB();printf("A结束\n");
}void funB()
{printf("B开始\n");func();printf("B结束\n");
}
void func()
{printf("c开始\n");printf("c结束\n");
}
int main(int argc, char const *argv[])
{funA();return 0;
}
② 递归
在函数中调用该函数,会形成循环

例:

#include <stdio.h>
void test(int num)
{printf("num=%d\n",num);if (num >= 0){num--;test(num);}
}
int main(int argc, char const *argv[])
{test(2);return 0;
}
③ 多文件编译,跨文件调用函数
  • 文件1:05_codeA.c

    #include <stdio.h>
    extern void test05();
    extern int num;
    int main(int argc, char const *argv[])
    {test05();printf("05_codeB\tnum=%d\n",num);return 0;
    }
    
  • 文件2:05_codeB.c

    #include <stdio.h>
    int num = 20;
    void test05()
    {printf("测试\n");
    }
    
  • 编译:

    gcc 05_codeA.c 05_codeB.c

  • 结果:

在这里插入图片描述

3. 变量的存储类别

  • 程序是一个文件,

  • 一个正在进行的程序称为一个进程

  • 一个进程系统会为其分配一片运行内存

  • 在32位系统下,每个进程的寻址范围是4G

3.1 数据存储分类

在这里插入图片描述

1)、堆

​ 在动态申请内存的时候,在堆里开辟内存。

2)、栈

​ 主要存放局部变量。

3)、静态全局区

  • 未初始化的静态全局区

    • 静态变量(定义变量的时候,前面加 static 修饰),或全局变量 ,没有初始化的,存在此区
  • 初始化的静态全局区

    • 全局变量、静态变量,赋过初值的,存放在此区

4)、代码区

​ 存放咱们的程序代码

5)、文字常量区

​ 存放常量的

3.2 函数相关

① 普通成员函数(全局函数)
语法:返回值类型 函数名(形参列表){函数体}

特点:

可以在当前 .c 文件(源文件)中使用,也可以在其他.c文件中使用

② 静态成员函数(静态全局函数)
语法:static 返回值类型 函数名(形参列表){函数体}

特点:

只能在当前.c文件(源文件)中使用

3.3 变量相关

① 局部变量

定义位置:当前函数中

作用域:所声明的代码块中

生命周期:调用所在函数时生成,随着所在代码块的执行完毕而销毁

默认值:随机数

② 成员变量(全局变量)

定义位置:在函数外

作用域:当前程序中

生命周期:随着所在进程的执行而生成,随着所在进程的结束而结束

默认值:0

③ 静态局部变量

定义位置:当前函数中

作用域:所声明的代码块中

生命周期:第一次调用所在函数时生成,随着所在进程的执行完毕而销毁,只会定义一次

默认值:0

例:

#include <stdio.h>
void test()
{static int x = 10;x++;printf("x=%d\n",x);
}int main(int argc, char const *argv[])
{test();test();test();return 0;
}

输出结果:

x=11
x=12
x=13

④ 静态成员变量(静态全局变量)

定义位置:在函数外

作用域:当前源文件中

生命周期:随着所在进程的执行而生成,随着所在进程的结束而结束

默认值:0

4. const

const 修饰的变量值不能被修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/176122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生CI/CD流水线发布

文章目录 前言k8s组件与操作流程k8s组件创建pod k8s代码&&打包k8s yamldeploymentservicek8s volumesdemo CIgitlabCI runner CD配置git repository安装argo创建argo cd的配置yamlargocd和helm结合argocd hookargocd 发布 RBACoperatorhelmprometheus && grafn…

曝光!WPS用户信息或被盗用,紧急行动,迅软DSE数据加密应时而动!

WPS摊上大事了&#xff01;有用户发现&#xff0c;在WPS更新的一版用户隐私政策中&#xff0c;明确提到&#xff1a;“我们将对您主动上传的文档材料&#xff0c;在处理后作为AI训练的基础材料使用。”换句话说&#xff0c;WPS有可能“白嫖”用户的文档信息&#xff0c;用于投喂…

CVE-2020-11651(SaltStack认证绕过)漏洞复现

简介 SaltStack是使用Python开发的一个服务器基础架构集中化管理平台,底层采用动态的连接总线,使其可以用于编配,远程执行, 配置管理等等。 Salt非常容易设置和维护,而不用考虑项目的大小。从数量可观的本地网络系统,到跨数据中心的互联网部署,Salt设计为在任意数量的…

npm run build打包jquery项目

build.js 文件代码如下 const fs require(fs); const path require(path);// 指定要打包的HTML文件路径和输出目录路径 var pathName "./"; const outputDir dist;// 匹配html文件 var ipReg /\.(htm|html|js|version)$/i;// 创建输出目录&#xff08;如果不存…

顺序表总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️arraylist的简…

JAVA多线程总结

一、概念&#xff1a; 1、什么是多任务 多任务就是在同一时间做多件事情&#xff0c;如边吃饭边玩手机等。看起来是多个任务都在做&#xff0c;本质上我们的大脑在同一时间依旧只做了一件件事情 2、什么是程序 程序是指令和数据的有序集合&#xff0c;其本身没有任…

洗地机应该怎么选?希亦、必胜、米博、添可、小米洗地机实测推荐

作为一个常年测评智能家居的博主&#xff0c;关于洗地机的测评使用这些年也积累了不少的体验感受。以至于常被周边的朋友问到&#xff0c;洗地机到底是不是真的好用&#xff1f;洗地机有什么优点吗&#xff1f;选购的时候应该怎么选呢&#xff1f;洗地机什么牌子比较好呢&#…

chatglm3 vllm部署推理;api访问使用

用fastchat部署暂时有各种问题,参考:https://github.com/lm-sys/FastChat/pull/2622 本篇用vllm运行测试可以使用 1、vllm运行 python -m vllm.entrypoints.api_server --model /***/chatglm/chatglm3-6b/

【C语言】深入理解数据类型转换与运算

文章目录 1.数据类型转换在分析源程序之前&#xff0c;我们需要了解几个基本概念&#xff1a;现在来分析源程序中的变量及其对应的十进制真值以及扩展操作方式&#xff1a; 1.1. short si -32768;1.2. unsigned short usi si;1.3. int i si;1.4. unsigned ui usi; 2&#x…

【开源】基于JAVA的农村物流配送系统

项目编号&#xff1a; S 024 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S024&#xff0c;文末获取源码。} 项目编号&#xff1a;S024&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2…

深度学习18

卷积层 查看每个数据 使用tensorboard查看 池化层 使用数据集进行训练 创建实例&#xff0c;使用tensorboard进行显示 最大池化保留了图片信息&#xff0c;神经网络训练的数据量大大减小&#xff0c;可以加快训练 非线性激活 非线性激活为神经网络加入了一些非线性的特质…

Java学习:网络编程

一、TCP编程 1.服务器端建立通讯&#xff08;ServerSocket的使用&#xff09; 服务器建立通讯ServerSocket。服务器建立Socket等待客户端连接并接收。建立IO输入流读取客户端发送的数据和向客户端发送数据。 具体代码&#xff1a; import java.io.BufferedReader; import ja…

CTFSHOW sqll注入

号过滤绕过 号和不加通配符的 like 是一样的。 还可以使用 < >号来绕过&#xff0c;<> 在mysql中等于! 如果在加一个! 双重否定代表肯定 就是了 空格过滤绕过 /**/ &#xff0c;()&#xff0c;&#xff0c;tab&#xff0c;两个空格 or and xor not 过滤绕过 a…

java JDBCUtils 使用静态代码块连接数据库 全程值保持一次连接

\src\com\data\entity\JDBCUtils.java 使用静态代码块连接数据库 全程值保持一次连接 package com.data.entity;import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource;import javax.sql.DataSource;pub…

正点原子linux应用编程——入门篇2

系统信息与系统资源 本章重点学习如何通过Linux系统调用或C库函数获取系统信息&#xff0c;譬如获取系统时间、日期 以及设置系统时间、日期等&#xff1b;除此之外&#xff0c;还会学习Linux系统下的/proc虚拟文件系统&#xff0c;包括/proc 文件系统是什么以及如何从/proc文…

【APUE】进程间通信

目录 一、管道 1.1 匿名管道 1.2 命名管道 二、XSI IPC 2.1 概述 2.2 消息队列 2.2.1 msgget 2.2.2 msgsnd 2.2.3 msgrcv 2.2.4 msgctl 2.2.5 代码示例 2.3 信号量数组 2.3.1 semget 2.3.2 semop 2.3.3 semctl 2.3.4 代码示例 2.3 共享内存 2.3.1 shmget…

selenium已知一个元素定位同级别的另一个元素

1.需求与实际情况 看下图来举例 &#xff08;1&#xff09;需求 想点击test22&#xff08;即序号-第9行&#xff09;这一行中右边的“复制”这一按钮 &#xff08;2&#xff09;实际情况 只能通过id或者class定位到文件名这一列的元素&#xff0c;而操作这一列的元素是不…

Kubernetes之kubeadm日志展示篇—fiendweb日志展示平台部署

fiendweb 部署 1.1 下载镜像 docker pull adockero/finderweb1.2 启动容器 编写容器启动脚本 # cat finderweb.sh #!/bin/bash docker run -itd -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -v /opt/logs/gfs:/data --networkhost --name finderweb…

零基础可以学编程吗,不懂英语怎么学编程,中文编程工具实例

零基础可以学编程吗&#xff0c;不懂英语怎么学编程&#xff0c;中文编程工具实例 上图是中文编程工具界面、标尺实例。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#x…

剑指 Offer(第2版)面试题 6:从尾到头打印链表

剑指 Offer&#xff08;第2版&#xff09;面试题 6&#xff1a;从尾到头打印链表 剑指 Offer&#xff08;第2版&#xff09;面试题 6&#xff1a;从尾到头打印链表解法1&#xff1a;遍历解法2&#xff1a;递归解法3&#xff1a;栈 剑指 Offer&#xff08;第2版&#xff09;面试…