c语言代码

news2024/11/18 13:59:00

目录

1.利用goto的关机程序

2.交换两个整数(容易出现的错误)

2.1 错误示范

2.1.1 错误的原因

3.函数调用进行折半查找

3.1错误版本

3.1.1错误原因

4.写一个函数,每调用一次这个函数,就会将num的值增加1。

4.1使用传值进去

5.有关print的操作题

6.字符串比较

7.编写函数不允许创建临时变量,求字符串的长度。

7.1创建count变量来实现代码

7.2 利用递归来正确实现代码

8.求第n个斐波那契数。(不考虑溢出)

8.1 利用递归(效率很慢)

8.2 利用循环(不考虑栈溢出,因为这里输入小一点的数正确,大一点就会栈溢出,结果错误,但是效率很快)

9.冒泡排序

1.利用goto的关机程序

#define _CRT_SECURE_NO_WARNINGS
//#inculde<string.h>  部分版本需要引用这个头文件
#include<stdio.h>
int main() {
	system("shutdown - s - t 60");
	char arr[20] = { 0 };
flag:
	printf("电脑在1分钟内关机,请输入我是猪来取消关机!");
	scanf("%s", arr);
	if (strcmp(arr, "我是猪") == 0) {
		system("shutdown -a");
	}
	else {
		goto flag;
	}
	return 0;
}

上述代码简单修改,利用while循环来实现关机.

#define _CRT_SECURE_NO_WARNINGS
//#inculde<string.h>
#include<stdio.h>
int main() {
	system("shutdown - s - t 60");
	char arr[20] = { 0 };
	while (1) {
		printf("电脑在1分钟内关机,请输入我是猪来取消关机!");
		scanf("%s", arr);
		if (strcmp(arr, "我是猪") == 0) {
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

!!!! goto语句只能在一个函数范围内跳转,不能跨函数

2.交换两个整数(容易出现的错误)

2.1 错误示范
#define _CRT_SECURE_NO_WARNINGS
//#inculde<string.h>
#include<stdio.h>
int swap(int x, int y) {
	int z = 0;
	z = x;
	x = y;
	y = z;
}
int main() {
	int a = 10;
	int b = 20;
	printf("交换前:a=%d b=%d\n", a, b);
	swap(a, b);
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

2.1.1 错误的原因

之所以出现错误是因为函数传参的过程中,a b本身是有地址空间的,但是x y也开辟了地址空间,这就导致他们的地址空间并不一样!

这里相当于给x y开辟了空间,x中放的是10,y中放的是20.然后z也开辟了空间,在执行swap函数中,尽管x y实现了互换,但是根本没有影响a b的值,跟a b都不是一个空间的地址。所以导致了a b的值没有实现互换!

2.1.2 修改正确的版本(利用指针)

举例

#include<stdio.h>
int main() {
	int a = 10;//4个字节的空间
	int* pa = &a;//pa就是一个指针变量
	*pa = 20;
	printf("%d\n", *pa);
	printf("%d", a);
	return 0;
}

正确版本

#include<stdio.h>
void swap(int *pa, int *pb) {//void 不用写返回,也可以直接写人return;
	int z = *pa;
	*pa = *pb;
	*pb = z;
}
	int main() {
	int a = 10;
	int b = 20;
	printf("交换前:a=%d b=%d\n", a, b);
	swap(&a, &b);//传入地址
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

3.函数调用进行折半查找

#include<stdio.h>
	int	binary_search(int a[], int k, int s) {
		int left = 0;
		int right = s - 1;
		while (left <= right) {
			int mid = (left + right) / 2;
			if (a[mid] > k) {
				right = mid - 1;
			}
			else if (a[mid] < k) {
				left = mid + 1;
			}
			else {
				return mid;
			}
		}
		return -1;
	}

	int main(){
		int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
		int key = 7;
		int sz = sizeof(arr) / sizeof(arr[0]);
		int ret = binary_search(arr,key,sz);
		if (-1 == ret) {
			printf("找不到\n");
		}
		else {
			printf("找到了,下标是:%d\n",ret);
		}
	return 0;
}
3.1错误版本
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
	int	binary_search(int a[], int k) {
		int sz = sizeof(a) / sizeof(a[0]);//求数组个数,错误
		int left = 0;
		int right = sz - 1;
		while (left <= right) {
			int mid = (left + right) / 2;
			if (a[mid] > k) {
				right = mid - 1;
			}
			else if (a[mid] < k) {
				left = mid + 1;
			}
			else {
				return mid;
			}
		}
		return -1;
	}

	int main(){
		int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
		int key = 7;
		
		int ret = binary_search(arr,key);//不传sz,错误
		if (-1 == ret) {
			printf("找不到\n");
		}
		else {
			printf("找到了,下标是:%d\n",ret);
		}
	return 0;
}

3.1.1错误原因

数组arr传参,实际传递的不是数组的本身,仅仅传过去了数组首元素的地址

实际上 int   binary_search(int a[], int k)就等于 int  binary_search(int *a, int k);int a[ ]就是挂羊头卖狗肉,实际上就是个指针,因此int sz = sizeof(a) / sizeof(a[0]);求得的sz就是4/4=1;再往下进行代码计算就肯定不对了

而在int   binary_search(int a[], int k)中int a[ ]中没写大小,如int a[10]是因为数组都没传过来,这里创建一个数组也没意义!

!!!!!所以函数内部需要参数部分传过来数组的个数,一定是在外面求好这个数组个数在传过去,而不是在函数内部在去求!实际上数组传参就是一种传址的效果!

4.写一个函数,每调用一次这个函数,就会将num的值增加1。

#include<stdio.h>	
void Add(int* p) {
	(*p)++;
}
int main() {
	int num = 0;
	Add(&num);
	printf("%d\n", num);

	Add(&num);
	printf("%d\n", num);

	Add(&num);
	printf("%d\n", num);
	return 0;
}

函数内部想改变函数外部,一般都采用传址操作!

4.1使用传值进去
#include<stdio.h>	
int  Add(int p) {
	p++;
	return p;
}
int main() {
	int num = 0;
	int a=Add(num);
	printf("%d\n", a);

	int b = Add(num);
	printf("%d\n", b);

	int c = Add(num);
	printf("%d\n", c);
	return 0;
}

5.有关print的操作题

#include<stdio.h>	
int main()
{
	printf("%d", printf("%d",printf("%d", 43)));
	return 0;
}

结果是4321;原因是因为print返回值类型为

函数返回的是打印在屏幕上的字符的个数

所以

6.字符串比较

 字符串比较时,1.如

不能直接用 == ,这里需要引入头文件 #incolude<string.h>;然后使用strcmp进行对比;

而如果出现两个字符串比较,如str1=“abcd”,str2=“abce”,比较结果为<0,因为字符串比较,实际上比较的是ascii码值,比较的结果有3个为<0,>0,=0.

2.如果定义的是一个数组,那么在scanf中不用加&取地址符。因为对应的password就是数组名,数组名本身就是一个地址了。

3.

这里红色方框比较的是两个字符串的首字符的地址,并没有比较内容。地址比较是没有意义的!

7.编写函数不允许创建临时变量,求字符串的长度。

7.1创建count变量来实现代码
#include<stdio.h>	
int my_strlen(char* str)//*str解引用得到值
{
	int count = 0;
	while (*str != '\0') {
		count++;
		str++;//str代表的数组下标,也就是字母的地址
	}
	return count;
}
int main()
{
	char arr[] = "cxs";
	//['c']['x']['s']['\0']
	//模拟实现一个strlen函数
	printf("%d\n",my_strlen(arr));//数组传参,传的是数组的首地址
	return 0;
}
7.2 利用递归来正确实现代码

#include<stdio.h>	
int my_strlen(char* str)
{
	if(*str != '\0') {
		return 1 + my_strlen(str + 1);//也可以是str+1对应的是下一个字母的地址,然后在传给char *atr
	}
	else {
		return 0;
	}
}
int main()
{
	char arr[] = "cxs";
	//['c']['x']['s']['\0']
	//模拟实现一个strlen函数
	printf("%d\n",my_strlen(arr));//数组传参,传的是数组的首地址
	return 0;
}

8.求第n个斐波那契数。(不考虑溢出)

8.1 利用递归(效率很慢)
#include<stdio.h>	
int Fib(int n) {
	if (n <= 2) {
		return 1;
	}
	else {
		return Fib(n - 1) + Fib(n - 2);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	return 0;
}
8.2 利用循环(不考虑栈溢出,因为这里输入小一点的数正确,大一点就会栈溢出,结果错误,但是效率很快)
#include<stdio.h>	
int Fib(int n) {
	int a = 1;
	int b = 1;
	int c = 1;//c赋值为1;是因为n<2时,直接返回c的值刚好是1!
	while (n > 2) {
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	return 0;
}

9.数组部分

也会导致求长度不对

#include<stdio.h>
int main(){
	int arr[3][4] = { {1,2},{3,4},{5,6} };
	int i = 0;
	int j = 0;
	int a = arr[0][0];
	int* p = &arr[0][0];//这里可以看出p是指针,*p解引用是一个值,但是arr想要与指针比较,默认也是指针,需要&解引用
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 4; j++) {
			printf("%d", *p);
			p++;
		}
	}
	printf("\n%d", a);
	return 0;
}

9.冒泡排序

#include<stdio.h>
void mao_pao(int a[], int k) {
	int i = 0;
	int temp;
	for (i; i < k - 1; i++) {//会比较9轮
		int j = 0;
		for (j; j < k - 1 - i; j++) {//每轮会比较的次数
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}
	int main() {
		int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
		int len = sizeof(arr) / sizeof(arr[0]);
		mao_pao(arr, len);
		for (int i = 0; i < len; i++) {
			printf("%d", arr[i]);
		}
		return 0;
	}

10.数组名的不同

尽管我们看到三个的地址都一样,但是实际上2和3才是真正意义一样的,因为1虽然代表的是整个数组,但是他的地址也是从第一个元素开始,因此地址才和2 3一样!下面通过例子看看1和2 3 是不一样的!

可以看出,1中的&arr+1,因为是数组地址加1,50-28=28,但是是16进制,就是0x28换算十进制就是40,但是2中的arr+1,是数组首元地址加1,十进制是4。也就是说1中的&arr+1是整个数组地址加1,而2中的arr+1是首元地址+1.

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

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

相关文章

【初阶数据结构】二叉树全面知识总结

二叉树详解 树的概念及其结构树的概念树的相关概念树的表示方法孩纸兄弟表示法双亲表示法&#xff08;并查集&#xff09; 树的实际应用 二叉树二叉树的概念二叉树的种类二叉树的性质二叉树的存储结构 二叉树顺序结构的实现堆的概念及结构堆向上、向下调整法堆的插入堆的删除堆…

基于ENC28J60+uIP1.0+STM32的UDP Server实现,服务器主动发送数据的实现,几个关键的问题可算整明白了!

ENC28J60&#xff0c;是一款SPI接口的以太网PHYMAC芯片&#xff0c;实现以太网物理层和MAC层硬件通信。uIP是一个TCP/IP软件协议栈&#xff0c;实现TCP、UDP、ARP、ICMP等网络协议。STM32F103RCT6通过SPI接口与ENC28J60通讯&#xff0c;并移植uIP协议&#xff0c;实现一个小型的…

20230224_HDR-ISP_环境配置

https://github.com/JokerEyeAdas/HDR-ISP/tree/main 一、环境配置 *.VS2015编译不过&#xff1b;VS2017没问题 *.将红框部分复制到工程下面 *.添加头文件路径 *.添加原文件

【C#】Redis在net core下使用教程

系列文章 文章目录 系列文章前言一、Redis 简介1.1 Redis 优势1.2 Redis与其他key-value存储有什么不同&#xff1f; 二、Redis安装步骤2.1 下载链接2.2 安装测试 三、Redis修改帐户密码四、Redis写成Windows服务五、.net core - 使用CSRedisCore操作redis 前言 官方教程&…

【C语言】模拟实现内存函数

本篇文章目录 相关文章1. 模拟 memcpy 内存拷贝2. 模拟 memmove 内存移动 相关文章 【C语言】数据在内存中是以什么顺序存储的&#xff1f;【C语言】整数在内存中如何存储&#xff1f;又是如何进行计算使用的&#xff1f;【C语言】利用void*进行泛型编程【C语言】4.指针类型部…

相机有俯仰角时如何将像素坐标正确转换到其他坐标系

一般像素坐标系转相机坐标系都是默认相机是水平的&#xff0c;没有考虑相机有俯仰角的情况&#xff0c;大致的过程是&#xff1a;像素坐标系统-->图像坐标系-->相机坐标系 ->世界坐标系或雷达坐标系: 像素坐标系 像素坐标系&#xff08;u&#xff0c;v&#xff09;是…

【Java 基础篇】Java函数式接口详解

Java是一门强类型、面向对象的编程语言&#xff0c;但在Java 8引入了函数式编程的概念&#xff0c;这为我们提供了更多灵活的编程方式。函数式接口是函数式编程的核心概念之一&#xff0c;本文将详细介绍Java函数式接口的概念、用法以及一些实际应用。 什么是函数式接口&#…

JUC第八讲:Condition源码分析

JUC第八讲&#xff1a;Condition源码分析 本文是JUC第八讲&#xff0c;Condition详解。任意一个Java对象&#xff0c;都拥有一组监视器方法&#xff08;定义在java.lang.Object上&#xff09;&#xff0c;主要包括 wait()、wait(long timeout)、notify()以及notifyAll()方法&am…

【LeetCode-中等题】513. 找树左下角的值

文章目录 题目方法一&#xff1a;前序递归方法二&#xff1a;层序遍历 题目 方法一&#xff1a;前序递归 在递归遍历到叶子结点时&#xff0c;对比此时的节点深度&#xff0c;若当前节点深度大于当前最大深度&#xff0c;就更新value值&#xff0c;最后记录下的value即为最下最…

elementui 菜单选中优化

/** 父级菜单悬浮样式**/ .el-submenu__title:hover {color:#1890ff!important; } /** 父级菜单箭头悬浮样式**/ .el-submenu__title:hover>.el-submenu__icon-arrow{font-size: 13px!important;} /** 子菜单悬浮样式**/ .el-menu-item:hover{color:#1890ff!important; } /*…

Linux操作系统基础详解,计算机专业必看!

目录 Linux操作系统 Linux 简介 Linux 接口 Linux 组成部分 Shell Linux 应用程序 Linux 内核结构 Linux 进程和线程 基本概念 Linux 进程间通信 Linux 中进程管理系统调用 Linux 进程和线程的实现 Linux 调度 Linux 启动 Linux 内存管理 基本概念 Linux 内存…

【owt】 Intel® Media SDK for Windows: MSDK2021R1

https://www.intel.com/content/www/us/en/developer/articles/tool/media-sdk.html官方网不提供下载了: 2021地址 直接下载: MSDK2021R1.exe老版本 Intel Media SDK(Windows版本) 大神的介绍:owt-client-native 需要 https://github.com/open-webrtc-toolkit/owt-client…

spring security auth2.0实现

OAuth 2.0 的认证/授权流程 jwt只是认证中的一步 4中角色 资源拥有者&#xff08;resource owner&#xff09;、客户端&#xff08;client 第三方&#xff09;、授权服务器&#xff08;authorization server&#xff09;和资源服务器&#xff08;resource server&#xff09;。…

vue 使用cornerstone解析 .dcm 文件

// 首先下载依赖 npm install --save cornerstone-core cornerstone-math cornerstone-tools hammerjs cornerstone-web-image-loader 下载之后再package.json中可以看到最后图片的依赖// 下面是完成的组件代码 <template><div id"dicom_canvas" refdicom_c…

FL Studio21.1无限试用版体验新功能变化介绍

许多刚刚接触音乐创作的新朋友&#xff0c;通过各种渠道了解到FL Studio&#xff0c;但并不知道我们的历史以及在音乐创作方面所产生的影响&#xff0c;今天分享一篇来自coco玛奇朵博主Rio的深度科普文章&#xff0c;相信对新人会有很大启发。 FL Studio 21.1 通过钢琴卷中的音…

C++:类中的静态成员函数以及静态成员变量

一、静态成员变量 静态成员&#xff1a;在类定义中&#xff0c;它的成员&#xff08;包括成员变量和成员函数&#xff09;&#xff0c;这些成员可以用关键字static声明为静态的&#xff0c;称为静态成员。 静态成员变量需要在类外分配空间&#xff0c;static 成员变量是在初始…

速码!!BGP最全学习笔记:IBGP和EBGP基本配置

实验1&#xff1a;配置IBGP和EBGP 实验目的 熟悉IBGP和EBGP的应用场景掌握IBGP和EBGP的配置方法 实验拓扑 想要华为数通配套实验拓扑和配置笔记的朋友们点赞关注&#xff0c;评论区留下邮箱发给你! 实验步骤 1.IP地址的配置 R1的配置 <Huawei>system-view …

基于单片机火灾报警器仿真设计

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20采集温度值送到液晶1602显示。 3、MQ2采集烟雾值&#xff0c;送到液晶1602显示。 4、按键设置温度报警值&#xff0c;大于报警值&#xff0c;声光报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计…

微信小程序快速入门01(含案例)

文章目录 前言一、组件1.常用视图容器类组件viewscroll-viewswiper、swiper-item 2.text、rich-text3.其他常用组件buttonimagenavigator 二、小程序API三、数据绑定1.定义页面数据2.绑定数据 四、事件绑定1.什么是事件2.小程序中常用的事件3.事件对象 的属性列表target和curre…

Seata--分布式事务

1 分布式事务基础 1.1 事务 事务指的就是一个操作单元&#xff0c;在这个操作单元中的所有操作最终要保持一致的行为&#xff0c;要么所有操作都成功&#xff0c;要么所有的操作都被撤销。简单地说&#xff0c;事务提供一种“要么什么都不做&#xff0c;要么做全套”机制。 1…