C++之C语言的数组与函数

这篇具有很好参考价值的文章主要介绍了C++之C语言的数组与函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一 数组

二 函数


一 数组

数组:相同类型数据的线性集合。数组的下表以0开始计算,最大长度为数组个数-1 。

一维数组:数组里面的每一个元素类型均相同,然后内存地址连续,数组的每一个元素从0开始编号。


int main()

{

//定义一个数组为qq,指定长度为12个

int qq[12],  index;

for (index = 0; index < 11; index++) {

scanf("%d", &qq[index]); //逐个输入手机号

}



//输出手机号

printf("手机号是 \n");

for ( index = 0; index < 11; index++)

{

printf("%d", qq[index]);

}



    return 0;

}



一维数组的3种初始化方式:

int a[3] = { 1,3,2 };//指定数组长度并把每个位置都赋值

int b[] = { 3,4,4,5 };//不指定数组长度,自动依据当前元素大小计算数组长度

int c[10] = { 12,44 };//指定数组长度,但是只把部分位置赋值,其余位置默认以0填充



二维数组:特殊的一维数组,每一个数组元素都是一个数组。

二维数组的四种初始化方式:

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#define PI 3.1415



int main()

{

int a[2][2] = { 1,3,2 ,3};//指定数组长度并把每个位置都赋值;

int b[][2] = { 3,4,4,5 };//为每个数组赋值,省略行下标,指明列下标;

int c[2][2] = { {12,44 },{33,22} };//分行给数组元素赋值

int d[2][2];

a[0][0] = 12;  //直接对数组元素赋值

a[0][1] = 19;





//遍历数组

for (int i = 0; i < 2; i++)

{

for (int j = 0; j < 2; j++)

{

printf("%d ,", a[i][j]);

}

}



    return 0;

}





字符数组

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#define PI 3.1415



int main()

{

char a[5];  //定义字符数组



//字符数组的几种初始化方式

a[0] = 'a';

a[1] = 'b';  //引用数组元素并给其赋值

char b[2] = { 's','s' };//逐个字符赋值给每个数组元素

char c[] = { 'q','q' };//定义数组的同时给其初始化

char d[] = { "hello" };//利用字符串赋值



//字符数组的输入和输出可以使用两种格式字符: "%c" ,"%s"

printf("%s", d); //若使用字符串给字符数组赋初值的话,可以直接使用



//若是使用数组的形式给字符数组赋值的话,那么则需要用循环的形式来遍历字符。

for (int i = 0; i < 2; i++)

{

printf("%c", b[i]);

}



//注意: 字符数组在内存中,编译系统会自动给字符数组的末尾加一个标志符号 "\0" ,所以其字符的实际长度是包含结尾标志的。







//计算字符数组的长度

int length = 0; //记录数组长度

int index;  //跟踪数组下标

for (index = 0; index < a[index] != '\0'; index++)

{

length++;

}

printf("字符数组的长度是: %d ", length);





    return 0;

}

数组的排序算法

数组是一组有序数据的组合,这里的有序是指在内存中的连续有序,不是数组元素本身的有序。

1,选择法排序

原理:每次在待排序数组中查找最大或最小的数组元素,将其值与最前面没有进行过排序的数组元素的值互换。由大到小排序应查找最大值,由小到大排序则应查找最小值。

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#define PI 3.1415



int main()

{

int i, j;

int a[5]; //存储用户输入的数据

int temp;//表示最小的数组元素

int pos;//表示元素的位置



printf("请输入5个数字,为数组的元素赋值:/n");

for (int i = 0; i < 5; i++)

{

printf("a[%d]=", i);

scanf("%d", &a[i]);

}



//使用选择排序法对数组元素从小到大排序

for (int i = 0; i < 4; i++) //表示前4个数组元素

{

temp = a[i];//假设当前元素为最小值

pos = i;//记录最小元素的位置

for ( j = i+1; j < 5; j++) //设置内层循环为5,表示剩下的未排序数组元素部分

{

if (a[j] < temp) { //如果后续的元素中有比前面设定的最小值还小

temp = a[j]; //重新设定最小值

pos = j;//修正最小元素的位置

}



}



//将最小的数组元素和当前排序次数对应的数组元素互换

a[pos] = a[i];

a[i] = temp;

}





//输出数组排序结果

printf("排序结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}



    return 0;

}
  1. 冒泡排序法

原理:每次比较数组中相邻的两个数组元素的值,将较小的数排在较大的数前面,可实现数组元素从小到大排序; 每次将较大的数排在较小的数前面,可实现数组从大到小排序。

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  





int main()

{

int i, j;

int a[5]; //存储用户输入的数据

int temp=0;//表示最小的数组元素





printf("请输入5个数字,为数组的元素赋值:\n");

for (int i = 0; i < 5; i++)

{

printf("a[%d]=", i);

scanf("%d", &a[i]);

}





//输出数组未排序前的结果

printf("排序结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}





//使用冒泡排序法对数组元素从小到大排序

for (int i = 0; i < 5; i++) //表示后4个数组元素

{

for ( j = 4; j >=i; j--) //表示从最后一个元素开始向前循环

{

if (a[j] < a[j-1]) { //如果后一个数大于前一个数

//交换两个数组元素的值,如同冒泡

temp = a[j - 1];

a[j - 1] = a[j];

a[j] = temp;

}



}

}





//输出数组排序结果

printf("排序结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}



    return 0;

}

3,交换法排序

原理:将每一位数与其后的所有数一一比较,如果发现符合条件的数据,则交换数据。

首先,用第一个数依次与其后的所有数进行比较,如果存在比其值大(小)的数,则交换这两个数,

继续向后比较其他数直至最后一个数。然后再使用第二个数与其后面的数进行比较,如果存在比其值大(小)的数,则交换这两个数。继续向后比较其他数,直至最后一个数比较完成。

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  



int main()

{

int i, j;

int a[5]; //存储用户输入的数据

int temp=0;//表示最小的数组元素



printf("请输入5个数字,为数组的元素赋值:\n");

for (int i = 0; i < 5; i++)

{

printf("a[%d]=", i);

scanf("%d", &a[i]);

}





//输出数组未排序前的结果

printf("未排序的结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}



printf("\n");



//使用交换法对数组元素从小到大排序

for (int i = 0; i < 4; i++) //表示前4个数组元素

{

for ( j = i+1; j <5; j++) //表示后面的待比较数组元素

{

if (a[j] < a[i]) { //如果后一个数比前一个数小



temp = a[i]; //交换两个数组元素的值,使小数前移

a[i] = a[j];

a[j] = temp;

}}}



//输出数组排序结果

printf("排序后的结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}

    return 0;

}

4,插入法排序

原理:抽出一个数据,在前面的数据中寻找相应的位置插入,然后继续下一个数据,直到完成排序。

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  





int main()

{

int i, j;

int a[5]; //存储用户输入的数据

int temp=0;//表示最小的数组元素

int pos;





printf("请输入5个数字,为数组的元素赋值:\n");

for (int i = 0; i < 5; i++)

{

printf("a[%d]=", i);

scanf("%d", &a[i]);

}





//输出数组未排序前的结果

printf("未排序的结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}



printf("\n");



//使用插入法对数组元素从小到大排序

for (int i = 0; i < 5; i++) //表示后4个数组元素

{

temp = a[i];//设置插入值

pos = i - 1;



while ((pos>=0) && (temp<a[pos])) //内层循环,寻找插入值的位置

{

a[pos + 1] = a[pos]; //插入数值

pos--;

}

a[pos + 1] = temp;

}





//输出数组排序结果

printf("排序后的结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}



    return 0;

}

5,折半法排序(快速排序)

原理:选择一个中间值(在程序中使用数组中间元素的值),然后把比中间值小的元素放在左边,比中间值大的元素放在右边(具体的实现是从两边查找,找到一对后进行交换),然后再对左右两边分别递归使用折半法排序过程。

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  



void CelerityRun(int left, int right, int Array[]);//申明折半查找法函数



int main()

{

int a[5]; //存储用户输入的数据



printf("请输入5个数字,为数组的元素赋值:\n");

for (int i = 0; i < 5; i++)

{

printf("a[%d]=", i);

scanf("%d", &a[i]);

}





//输出数组未排序前的结果

printf("未排序的结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}



printf("\n");



//使用折半法对数组元素从小到大排序

CelerityRun(0, 4, a);





//输出数组排序结果

printf("排序后的结果如下: \n");

for (int i = 0; i < 5; i++)

{

printf("%d \t", a[i]); //用制表符分割打印后的数组

}



    return 0;

}









//定义函数实现

void CelerityRun(int left, int right, int Array[]) {

int i, j, middle, temp;  //变量的含义是:i, j记录下标、middle中间值、temp记录临时变量,left, right记录左右元素



i = left;

j = right;



middle = Array[(left + right) / 2];//求中间值

do

{

while ((Array[i] < middle) && (i < right))//从左查找小于中间值的数

i++;

while ((Array[j] > middle) && (j > left))//从右查找大于中间值的数

j--;



if (i<=j)//如果找到一对值

{

temp = Array[i];//交换两个值

Array[i] = Array[j];

Array[j] = temp;

i++;

j--;

}



} while (i<=j);  



//如果两边的下标交错,就停止(完成一次)

if (left<j)

{

CelerityRun(left, j, Array);//递归左半边

}

if (right >i)

{

CelerityRun(i, right, Array);//递归右半边

}

}

排序算法的比较:

  1. 选择法排序:简单,容易实现,适用于数量较小的排序;
  2. 冒泡法排序:相对稳定的排序方法,当待排序列有序时,效果比较好。
  3. 交换法排序:正序时最快,逆序时最慢,排序有序数据时效果最好。
  4. 插入法排序:原始数据基本有序,具有较快的运算速度。
  5. 折半法排序:n越大,速度越快。

数组的应用

1,反转字符串

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  



int main()

{

int i;

char a[7] = { "hello!" }; //定义源字符串

char b[7] = { 0 };//定义存储反转后的字符串

int size = sizeof(a);//计算源字符串长度



//循环读取字符

for (int i = 0; i < 6; i++)

{

b[size - i - 2] = a[i];  //源字符串倒序存入反转字符串中

}



printf("输出源字符串: %s \n", a);

printf("反转后的字符串: %s \n", b);





    return 0;

}





2, 输出系统日期和时间

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#include<time.h>





int main()

{

struct tm *sysTime;

time_t nowTime;

time(&nowTime);//获取系统时间

sysTime = localtime(&nowTime);//转换为系统时间



printf("系统日期: %d-%d-%d \n", 1900+sysTime->tm_year,sysTime->tm_mon+1,sysTime->tm_mday);

printf("系统时间: %d:%d:%d \n", sysTime->tm_hour,sysTime->tm_min,sysTime->tm_sec);



    return 0;

}







字符串的加密和解密
#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#include<string.h>





int main()

{

int result = 1;

int i;

int count = 0;

char Text[128] = {'\0'}; //定义一个明文字符串

char PassWord[128] = {'\0'}; //定义一个秘文字符串



while (1)//始终保持输入状态

{

if (result==1)  //如果用户输入1,则加密密文

{

printf("请输入要加密的明文:\n");//输出提示信息

scanf("%s", &Text);

count = strlen(Text); //获取字符串的长度

for ( i = 0; i < count; i++)

{

PassWord[i] = Text[i] + i + 5;  //设置加密字符

}

PassWord[i] = '\0';//设置字符串结束标记

printf("加密后的密文是:%s \n", PassWord);

}



else if (result==2) //如果用户输入2,解密字符串

{

count = strlen(Text); //获取字符串的长度

for (i = 0; i < count; i++)

{

Text[i] = PassWord[i] -i - 5;  //设置解密字符

}

Text[i] = '\0';//设置字符串结束标记

printf("解密后的明文是:%s \n", Text);

}



else if (result==3) //如果用户输入3,则退出系统

{

break;

}



else

{

printf("请输入命令符:\n");



}



printf("输入1加密明文,输入2解密密文,输入3退出系统 \n");

printf("请输入命令符:\n");

scanf("%d", &result);



}



    return 0;

}

二 函数

函数是程序的基本单元,函数中包含着程序的可执行代码。通常一个程序由函数来实现子程序,再由子程序实现模块功能,各个模块功能构成程序。文章来源地址https://www.toymoban.com/news/detail-469626.html

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  





int sum(int a,int b); //申明函数,并且有两个形参a和b

int sum(int a,int b) { //定义函数,其基本构成为: 返回值类型 函数名称 (函数参数或者为空){  函数体 }

return a + b;  //return的作用有: 退出函数并返回程序的调用处;  返回一个值供主调函数使用。

}



//定义一个内部函数:该函数只能被所在的源文件使用,内部函数又称为静态函数

//内部函数定义

static int add(int a, int b) { return a + b; }



int main()

{

//调用函数时,填入实参传递给函数

int result = sum(12, 334);

printf("%d \n", result);



/*

* 可作为函数参数的类型有:

基本类型:int,double,float, char,

数组元素:数组名称[下标],这中方式和普通的参数传递差不多

数组名称:这种方式传递的是数组中第一个元素的地址,

*

*

* 函数的嵌套调用: 在一个函数中调用另外一个函数

* 函数的递归调用: 函数自身调用自身的写法

*/

    return 0;

}





外部函数的使用步骤:

1,先在demo.c源文件中定义函数 Add

#include<stdio.h>

//定义一个外部函数:可以被其他源文件调用的函数

extern int Add(int a, int b) { return a + b + 100; }



在Demo2.c中使用
#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

extern int Add(int a, int b);//使用外部文件定义的函数,首先需要声明

int main()

{

printf("%d", Add(12,222));

    return 0;

}





局部变量和全局变量

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  



//全局变量: 定义在所有函数外部的变量,全局变量不属于某个函数,而是属于整个源文件

int a = 1000;

//使用extern关键字修饰全局变量,使其他源文件也能够使用该变量

extern int b = 122;



int main()

{

//当发生局部变量重名时,内层作用域中的变量将屏蔽外层作用域中的同名变量,直到结束内层作用域为止。

int a = 10;//a为局部变量,自己距离自己最近的大括号内有效(在main函数的大括号内有效)

    return 0;

}









函数应用


数学函数

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#include<math.h> //数学计算函数头文件



int main()

{

    int intABS = abs(-12);   //求一个负数的绝对值

    int intLabs= labs(-1223434L); //求一个长整型数的绝对值

    int intFlabs = fabs(-234.22);//求实型数的绝对值

    int intSin = sin(0.5);//求解正弦

    int intCos = cos(0.4);//求解余弦

    int intTan = tan(0.8);//求解正切



    printf("%d, %d, %d , %d, %d,  %d", intABS, intLabs, intFlabs, intSin, intCos, intTan);

   

    return 0;

}





字符函数

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#include<ctype.h> //字符函数头文件



int main()

{

    char c = 'h';

    int alpha = isalpha(c);//判断该字符是否是字母,如果是则返回非0值

    int Digit = isdigit(c);//判断该字符是否是数字,如果是则返回非0值

    int num = isalnum(c);//判断是否是字母或者数字,如果是则返回非0值

    printf("%d, %d, %d ", alpha, Digit, num);

   

    return 0;

}









字符串处理函数



#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>  

#include<string.h> //字符串处理头文件



int main()

{

    char a[10] = { "hello" };

    char b[10] = {};



    strcpy(a, b);//将符串a复制到字符串b中

    strcat(a, b);//将字符串a连接到字符串b的末尾

    strcmp(a, b);//比较两个字符串,若相同返回0,若a>b返回值为正数,若a<b返回值则为负数

    strupr(a);//小写转换为大写

    strlwr(b);//将大写转换为小写

    strlen(a);//获取字符串的长度

   

    return 0;

}



到了这里,关于C++之C语言的数组与函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++ 11 新特性 不同数据类型之间转换函数之reinterpret_cast

    一.不同数据类型之间转换函数 reinterpret_cast 介绍 reinterpret_cast 是C++中的一种类型转换操作符,用于执行低级别的位模式转换。具体来说, reinterpret_cast 可以实现以下功能: 指针和整数之间的转换 :这种转换通常用于在指针中存储额外信息,或者在特定平台上进行底层操作。

    2024年03月09日
    浏览(42)
  • C++ 语言类 (class) 和抽象数据类型 (abstract data type)

    在 C++ 语言中,我们使用类定义自己的数据类型。通过定义新的类型来反映待解决问题中的各种概念,从而使得程序更加简洁旦易于修改。数据抽象能帮助我们将对象的具体实现与对象所能执行的操作分离开来。 类的两项基本能力:一是数据抽象,即定义数据成员和函数成员

    2023年04月10日
    浏览(33)
  • C语言通过ODBC函数操作Access数据库(mdb和accdb格式)(char字符数组)

    编译环境:Windows XP + Visual Studio 2010 数据库:Access 2010,accdb格式 本例程只使用char[]字符数组,不使用wchar_t[]字符数组,更适合C语言初学者。 如果读取字符串时,db_bind_str提供的字符数组空间小了,db_fetch会执行失败返回-2。 由于Windows系统设计原因,char[]字符数组只能存储G

    2024年02月02日
    浏览(50)
  • C++完成目录下文件夹和各种类型文件的超时删除

    最近的一个项目遇到了要删除过时的一些自己这边生成的文件 思路就是先找到文件(包括文件夹),然后判断他们的时间来确定是否删除文件(文件夹)。 1.CFileFind 类 执行本地文件搜索,并且是执行 Internet 文件搜索的 CGopherFileFind 和 CFtpFileFind 的基类。 语法: 能使用到的公

    2024年02月07日
    浏览(45)
  • C语言读取文件夹一级子目录的指定类型文件

    参考链接: C语言读取指定文件夹下的所有文件(各种信息)_c语言读取文件夹下的所有文件-CSDN博客  参考以上文案,做成了几个函数,用于读取任意文件夹下的指定后缀的文件。

    2024年02月21日
    浏览(78)
  • 5个常见的前端手写功能:浅拷贝与深拷贝、函数柯里化、数组扁平化、数组去重、手写类型判断函数

    浅拷贝 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。 测试结果: 深拷贝 深拷贝是将

    2024年04月26日
    浏览(40)
  • 【SystemVerilog 之数据类型】~ 数据类型、Logic 类型、数组(定宽数组、动态数组、队列、关联数组、链表)

    四值变量 :(0、1、x、z)四种状态 四值逻辑类型 :integer、logic、reg、net-type(如 wire、tri)、time(64bit的无符号整数); SV 并不太常用变量类型是 wire(assign 语句中)还是 reg(initial 和 always 语句中)。logic 用的比较多。可以被连续赋值语句驱动,可用在 assign、initial、always 语句

    2024年01月22日
    浏览(41)
  • C语言的函数指针、指针函数, 函数数组

    是指向函数的指针,它允许您在程序运行时动态选择要调用的函数。函数指针可以像普通变量一样传递、存储和使用,这使得它们在许多编程场景中非常有用,如回调函数、函数表、插件架构等。 以下是一个简单的例子来说明函数指针的概念: 函数数组是一个数组,其中的

    2024年02月09日
    浏览(46)
  • C语言--指针详解(下)--字符指针、数组指针、指针数组、函数指针、函数指针数组(转移表)

    在C语言中有一种指针类型为字符指针 char*,常用其来表示字符,使用如下: 除了上述用法之外,还可以有以下的用法: 在上面的代码中,字符 \\\" hello word \\\"是常量字符串,将\\\"hello word\\\"放入 pstr 指针的实质是将第一个字符 “ h \\\" 的地址传递给了 pstr ,通过首字符 ” h \\\" 就可以访问

    2024年02月03日
    浏览(51)
  • C语言——结构体类型(二)【结构体内存对齐,结构体数组】

    📝前言: 上一讲结构体类型(一)中,我们讲述了有关 结构体定义,创建,初始化和引用 的内容,这一讲,我们进一步学习结构体的相关知识: 1,结构体内存对齐 2,结构体数组 🎬个人简介:努力学习ing 📋个人专栏:C语言入门基础 🎀CSDN主页 愚润求学 🌄每日鸡汤:

    2024年01月24日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包