首页
归档
Github
留言
工具箱
邻居
壁纸
更多
音乐
直播
视频
Search
1
欢迎访问我的日志空间
76,568 阅读
2
Typecho - Joe主题魔改版(持续更新)
8,713 阅读
3
Typecho-Joe主题实现图片评论功能
7,352 阅读
4
WEB音乐播放器源码
6,336 阅读
5
Git上传项目到Github仓库教程
5,342 阅读
学习笔记
源码库
BUG
第九艺术
登录
/
注册
Search
标签搜索
学习笔记
C语言
typecho
Java
扫雷
源码
PHP
插件
网站源码
音乐播放器
模板
git
github
bug
QQBot
AI
机器人
框架
Nekro Agent
XG.孤梦
累计撰写
53
篇文章
累计收到
201
条评论
首页
栏目
学习笔记
源码库
BUG
第九艺术
页面
归档
Github
留言
工具箱
邻居
壁纸
音乐
直播
视频
搜索到
32
篇与
学习笔记
的结果
2022-02-10
C语言函数的定义与调用-学习十六
为什么要用函数?问题如果程序的功能比较多,规模比较大把所有代码都写在main函数中, 就会使主函数变得复杂、头绪不清,阅读和维护变得困难。有时程序中要多次实现某一功能,就要多次重复编写实现此功能的程序代码,这使程序冗长,不精炼。解决的方法:用模块化程序设计的思路采里“组装”的办法简化程序设计的过程。事先编好一批实现各种不同功能的函数。把它们保存在函数库中;需要时直接调用。在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能。C程序可由一个主函数和若干个其他函数构成。函数还有很多叫法,比如方法、子例程或程序,等等。例子直接写在主函数#include <stdio.h> int main() { printf("************\n"); printf("Hello Word!\n"); printf("************\n"); return 0; }调用函数#include <stdio.h> int main() { void printf_star(); //声明函数 void printf_text(); //声明函数 printf_star(); //函数调用 printf_text(); printf_star(); return 0; } void printf_star() { printf("************\n"); } void printf_text() { printf("Hello Word!\n"); }说明1.一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大的程序,一般不希望把所有内容全放在一个文件中,而是将它们分别放在若干个源文件中,由若干个源程序文件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为多个C程序共用。2.一个源程序文件由一个或多个函数以及其他有关内容(如预处理指令、数据声明与定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。3.C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。4.所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。main函数是被操作系统调用的5.从用户使用的角度看,函数有两种。库函数。它是由系统提供的,用户不必自己定义而直接使用它们。 应该说明,不同的C语言编译系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。用户自己定义的函数。它是用以解决用户专门需要的函数。6.从函数的形式看,函数分两类。无参函数。无参函数- -般用来执行指定的一组操作。 无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。int max()有参函数。在调用函数时,主调函数在调用被调用函数时,通过叁数向被调用函数传递数据。 一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。int max(int a,int b)函数的定义无参函数的定义形式:类型标识符 函数名() { 声明部分 语句 } // 例如 void printf_star() // 函数头 { printf("************\n"); } // 函数体 有参函数定义的一般形式:类型标识符 函数名(形式参数) { 声明部分 语句 } // 例如 int max(int x, inty) // 函数头 { // 函数体 int z; // 局部变量声明 if (x > y) z = x; else z = y; return z; } 定义空函数定义空函数的一般形式为:类型标识符 函数名() { } // 例如 void star() // 函数头 { } // 函数体 先用空函数占一个位置,以后逐步扩充好处:程序结构清楚,可读性好,以后扩充新功能方便,对程序结构影响不大。例子编写一个求阶乘的函数,求5! +6! +7!#include <stdio.h> main() { int factorial(int num); printf("总和为:%d\n", factorial(5) + factorial(6) + factorial(6)); } int factorial(int num) { int sum = 1; for (int i = 1; i <= num; i++) { sum = sum * i; } return sum; }求两个整数的较大者#include <stdio.h> main() { int a,b; printf("请输入两个整数:\n"); scanf_s("%d %d", &a,&b); printf("结果:%d\n", max(a,b)); } int max(int x,int y) { int max; if (x > y) { max = x; } else { max = y; } return max; }
2022年02月10日
1,701 阅读
0 评论
0 点赞
2022-02-08
C语言数组的应用-学习十五
数组排序排序算法是程序设计中最基本的、最重要的算法之一。排序算法有很多,比较常用的有选择法、冒泡法、比较法和插入法等。选择排序法1.从n个数中选出最小数的下标,然后将最小数与第一个数交换位置;2.除第1个数外,其余n-1个数再按步骤1的方法选出次小的数,与第2个数交换位置;3.重复步骤n-1遍,最后构成递增序列。排序过程图例如:#include <stdio.h> #define N 10 void main() { int i,j,x,min,a[N]; printf("随机输入10整数:\n"); for (i = 0; i < N; i++) { scanf_s("%d", &a[i]); } for (i = 0; i < N - 1; i++) { min = i; for (j = i+1; j < N; j++){ if (a[j] < a[min]) { min = j; x = a[i]; a[i] = a[min]; a[min] = x; } } } for (i = 0; i < 10; i++) { printf("%d,", a[i]); } }冒泡排序法1.从第一个数开始,与相邻的数比较,若大于该数,则交换位置。2.一轮排序后,最大数换到了最下面(即小数往上冒,大数往下沉);3.除最后一个数外,其他n-1个数按步骤:的方法使次大的数下沉;4.重复步骤n-1遍,最后构成递增序列。排序过程图例子#include <stdio.h> #define N 10 main(){ int a[10]; int i,j,t; printf("输入十个整数:\n"); for (i = 0; i<N; i++) { scanf_s("%d", &a[i]); } for (j = 0;j < N-1; j++) { for (i = 0; i < N -1-j; i++) { if (a[i] > a[i + 1]) { t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } } } for (i = 0; i < N; i++) { printf("%d,", a[i]); } }数组中元素的插入和删除插入排序子过程的算法(基于有序数组):假设输入的数为 a ;找到 a 应在数组中的位置;从该位置开始将它及其后面的数依次往后移,将位置腾出;将 a 放入该位置。例如#include <stdio.h> main(){ int a[11] = {1,3,6,9,14,16,21,33,40,50}; int i,j,x=0; for (i = 0; i<10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要插入的整数:"); scanf_s("%d", &x); for (i = 0; i <= 10; i++) { if (a[i] > x) { for (j = 10; j > i; j--) { a[j] = a[j - 1]; } a[i] = x; break; } } for (i = 0; i <=10; i++) { printf("%d ", a[i]); } }删除排序过程的算法:假设删除的数为num找到num应在数组中的位置;从该位置开始将它后面的数依次往前移即可例如:#include <stdio.h> main(){ int a[11] = {1,3,6,9,14,16,21,33,40,50}; int i,j,num=0; for (i = 0; i<10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要删除的整数:"); scanf_s("%d", &num); for (i = 0; i < 10; i++) { if (a[i] == num) { break; } } for (j = i; j <10; j++) { a[j] = a[j + 1]; } for (i = 0; i <9; i++) { printf("%d ", a[i]); } }查找顺序查找思路:将查找关键值与数组中的元素一一比较, 若相同,则查找成功,否则查找失败。例如#include <stdio.h> main() { int a[11] = { 1,3,6,9,14,16,21,33,40,50 }; int i, j, x = 0,y = 0; for (i = 0; i < 10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要查找的整数:"); scanf_s("%d", &x); for (i = 0; i <11; i++) { if (a[i] == x) { y = 1; printf("找到数字%d,它的下标是%d", x, i); break; } } if (y == 0) printf("没有找到你输入的数字!"); }二分法查找(折半查找)可大大提高查找的速度,必须是有序数组。查找过程图例如#include <stdio.h> main() { int a[] = { 1,3,6,9,14,16,21,33,40,50,100}; int i,find=0, mid,x=0, top = 0,bot = 10; for (i = 0; i <=10; i++) { printf("%d ", a[i]); } printf("\n"); printf("输入一个要查找的整数:"); scanf_s("%d", &x); do { mid = (top + bot) / 2; if (x > a[mid]) top = mid + 1; if (x == a[mid]) find = 1; if (x < a[mid]) bot = mid - 1; printf("%d,%d,%d\n", top, mid, bot); } while (top <= bot && find == 0); if (find == 1) printf("找到数字%d\n", x); else printf("没有找到你输入的数字!\n"); }二维数组的鞍点一个元素在该行最大,在该列最小的话,称其为数组的鞍点思路:按行求出各行最大的元素位置某行最大的元素与该元素所在列的所有元素比较, 判断是否为最小元素,是则是鞍点,否则不是鞍点。例如:#include<stdio.h> #define N 3 #define M 3 main(){ int i, j, k, a[N][M], max, maxj, flag; printf("请输入数组:\n"); for (i = 0; i < N; i++){ for (j = 0; j < M; j++){ scanf_s("%d", &a[i][j]); } } printf("\n"); for (i = 0; i < N; i++){ max = a[i][0]; // 开始时假设a[i][0]最大 maxj = 0; //将列号0赋给maxj保存 for (j = 0; j < M; j++){ // 找出第i行中的最大数 if (a[i][j] > max){ max = a[i][j]; // 将本行最大的数放在max中 maxj = j; // 将最大数所在的列号存放在maxj中 } } flag = 1; // 先假设是鞍点,以flag为1代表 for (k = 0; k < N; k++){ if (max > a[k][maxj]){ // 将最大的数和其同列元素相比 flag = 0; // 如果max不是同列最小,表示不是鞍点 continue; } } if (flag){ printf("a[%d][%d]=%d\n", i, maxj, max); //输出鞍点的值和所在行列号 break; } } if (!flag){ printf("鞍点不存在!\n"); } }改良版(上面的算法无法判断一些特殊的数组矩阵)#include<stdio.h> #define N 3 #define M 3 main() { int i, j, k,p, a[N][M], max, maxj, flag=0; printf("请输入数组:\n"); for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { scanf_s("%d", &a[i][j]); } } printf("\n"); for (i = 0; i < N; i++) { max = a[i][0]; // 开始时假设a[i][0]最大 maxj = 0; //将列号0赋给maxj保存 for (j = 0; j < M; j++) { // 找出第i行中的最大数 if (a[i][j] > max) { max = a[i][j]; // 将本行最大的数放在max中 } } for (j = 0; j < M; j++) { // 检测最大值是否是鞍点 if (a[i][j] == max) { k = j; p = 0; while (p < N && max <= a[p][k]) { p++; } if (p == N) { printf("a[%d][%d]=%d\n", i, k, max); flag = 1; } } } if (flag == 0) { printf("鞍点不存在!\n"); } } }数组注意问题用scanf函数向字符型数组输入数据char a[20];scanf("%s",&a); 错误 scanf(%s",a); 正确用scanf函数向数值型数组输入数据int a[20];scanf("%d",a); 错误 scanf(%d",&a); 正确引用数组元素要用[]。int i, a(10);for (i=0;i<10;i++) scanf(%d",&a(i)); 错误int i, a(10); for (i=0;i<10;i++) scanf(%d",&a[i])); 正确数组元素可使用的最大下标int i,a[10]={1}; for(i=1;i<=10;i++) printf(%d",a[i]); 错误int i,a[10]={1}; for(i=1;i<=9;i++) printf(%d",a[i]); 或者 for(i=1;i<10;i++) printf(%d",a[i]); 正确二维数据或多维数组的定义和引用int a[4,5]; a[1+2,2+2]=5; 错误int[10]; 正确误以为数组名代表数组全部元素int a[4]={1,3,5,7},b[4]; b=a; char str[4]; str="computer"; 错误混淆字符字符串的表示形式char sex; sex="M"; 错误char sex; sex= ' M '; 正确
2022年02月08日
2,121 阅读
0 评论
0 点赞
2022-02-07
C语言字符数组-学习十四
字符数组定义用来存放字符数据的数组。字符数组中的一个元素存放一个字符。一般形式char c [10];字符数组也可以是二维或多维数组例如: char c[5][10]; 即为二维字符数组。字符数组初始化逐个字符赋给数组中各元素。例如:char c[10]={'A','b',' ','2',' ','h','a','b','c','d'}; 如果花括号中提供的初值个数大于数组长度,则语法错误;如果初值个数小于数组长度只将这符赋给数组中前面那些元素,其余为'\0';如果初值个数与预定的数组长度相同,在定义时可以省略各数组长度,系统会自动根据初值个数确定数组长度。例如:char c[]={'A','b',' ','2',' ','h','a','b','c','d'}; 例子输出一个字符串。#include <stdio.h> void main() { char c[15] = { 'M','y',' ','n','a','m','e',' ','i','s',' ','X','G','G','M'}; for (int i = 0; i < 15; i++) printf("%c", c[i]); printf(" \n"); }字符串和字符串结束标志在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。有时,人们关心的是有效字符串的长度而不是字符数组的长度。例如,定义一个字符数组长度为100,而实际有效字符只有40个。 为了测定字符串的实际长度,C语言规定了一个“字符串生束标志”,以字符'\0'代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。 也就是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串。可以把一个字符串直接赋给一个字符数组所表示的变量,以初始化字符数组。例如:char c[]={"l am happy"};也可以省略花括弧,直接写成 char c[]=“l am happy";用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。注意:这里不用单个字符作为初值。而是用一个字符串作为初值。数组c的长度不是10,而是11,因为字符串常量的最后由系统加上一个'\0'。因此,初始化 char c[]="I am happy"; 与 char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'}; 等价。char c[10]={"China"};字符数组的输入输出逐个字符输入输出。用格式符 “%c” 输入或输出一个字符。将整个字符串一次输入或输出。用符 “%s” 输入或输出一个字符串。注意:用%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名,或&c。如果数组长度大于字符串实际长度,也只输出到 '\0' 结束。输出字符不包括结束符 '\0' 。如果一个字符数组中包含一个以上 '\0',则遇到第一个 '\0' 时输出就结束。可以用scanf函数输入一个字符串。例如:char c[20]; scanf("%s",c);如果利用一个scanf函数输入多个字符串,则以空格分隔。例如:#include <stdio.h> #pragma warning(disable:4996) void main() { char str1[5], str2[5], str3[5]; scanf("%s%s%s", str1, str2, str3); printf("%s %s %s\n", str1, str2, str3); }数组首地址在前面介绍过,scanf的各输入项必须以地址方式出现,如&a, &b等。 但在前例中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了数组的首地址。 整个数组是以首地址开头的一个连续的内存单元。字符串处理函数C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担用于输入输出的字符串函数,在使用前应包含头文件“stdio.h”。使用其它字符串函数则应包含头文件“string. h”。puts(str)作用:将一个字符串(以‘0结束的字符序列)输出到终端,并且自动换行。例如:#include <stdio.h> #include <string.h> void main() { char str[] = { "China\nBeijin" }; puts(str); }gets(str)作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。例如:#include <stdio.h> #include <string.h> void main() { char str[10]; gets(str); puts(str); }注意:用gets和puts函数只能输入或输出一个字符串 不能写成: puts (str1, str2); 或 gets(str1, str2);当输入的字符串中含有空格时,输出仍为全部字符串。 说明函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。strcat()作用:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志"0",结果放在字符数组1中。本函数返回值是字符数组1的首地址。一般形式:strcat(字符数组名1,字符数组名2);要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。例如:#include <stdio.h> #include <string.h> #pragma warning(disable:4996) void main() { char str1[10],str2[5]; printf("输入数组1的值:\n"); gets(str1); printf("输入数组2的值:\n"); gets(str2); strcat(str1, str2); puts(str1); }strcpy()作用:把字符数组2中的字符串拷贝到字符数组1中。 字符串结束标志 "\0" 也一同拷贝。字符数组2也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。一般形式:strcpy(字符数组名1,字符数组名2);可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strncpy( str1,str2,2); 拷贝str2的前两个字符和'\O'。要注意的是字符数组1的值会被覆盖,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。str1="China" ; str1=str2; 是错误的,把字符串赋给某个字符数组,只能用strcpy函数。例如:#include <stdio.h> #include <string.h> #pragma warning(disable:4996) void main() { char str1[10], str2[]="China"; strcpy(str1, str2); puts(str1); }strcmp()作用:按照ASCII码从左向右逐个比较两个数组中的字符,直到出现不同字符或 '\0',并由函数返回值返回比较结果。字符串1 = 字符串2,返回值 = 0;字符串1 > 字符串2,返回值 > 0;字符串1 < 字付串2,返回值 < 0;一般形式:strcmp(字符数组名1,字符数组名2);注意:对两个字符串比较,不能以下形式:if(str1>str2) printf("yes");而只能用 if(strcmp(str1,str2)>O) printf("str1>str2");例如:#include <stdio.h> #include <string.h> void main() { int a; char str1[10], str2[]="China"; gets(str1); a = strcmp(str1, str2); if (a == 0) printf("str1 = str2\n"); if (a > 0) printf("str1 > str2\n"); if (a < 0) printf("str1 < str2\n"); }strlen()作用:测字符串的实际长度(不含字符串结束标志“10')并作为函数返回值。一般形式:strlen(字符数组名);例如:#include <stdio.h> #include <string.h> void main() { int a; char str[] = "China"; a = strlen(str); printf("字符串的长度是 %d\n", a); }strlwr()格式:strlwr(字符串);作用:将字符串中大写字母换成小写字母。strupr()格式:strupr 宁等串);作用:将字符串中小写字母换成大写字母。例子输入一串字符,统计数字的个数。#include <stdio.h> #include <string.h> void main() { char str[10],c; int i, num=0; gets(str); for (i = 0; (c = str[i]) != '\0'; i++) if (c >= '0'&&c <= '9') num++; printf("%d\n", num); }输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。#include <stdio.h> #include <string.h> void main() { int i,word=0,num=0; char c,str[80]; gets(str); printf("i\t,str[i]\t,word\t,num\n"); for (i = 0; (c = str[i]) != '\0'; i++) { if (c == ' ') word=0; else if (word == 0) { word = 1; num++; } printf("%d\t,%c\t,%d\t,%d\n", i, str[i], word, num); } printf("单词的个数是 %d\n", num); }
2022年02月07日
1,853 阅读
0 评论
0 点赞
2022-02-05
C语言二维数组-学习十三
二维数组一般形式:类型说明符 数组名 [常量表达式] [常量表达式];例如int a[3][4]; 说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。二维数组在内存中的存放二维数组在概念上是二维的,但是,实际的硬件存储器却是连续编址的也就是说存储器单元是按一维线性排列的。在C语言中,二维数组是按行排列,即放完一行之后顺次放入第二行。二维数组的引用一般形式:数组名 [下标] [下标]例如b[1][2]=a[2][3]/2;下标可以是整型表达式。例如:a[2][3], a[2-1][2*2-1]下标值应在已定义的数组大小的范围内。例如: int a[3][4]; a[3][4]=3;错误 定义a为3行4列的数组,下标从0开始,行的最大下标为2,列最大下标为3二维数组的初始化分行给二维数组赋初值。例如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。例如:int a[3][4]={{1,2,3,4,5,6,7,8,9,10,11,12};对部分元素赋初值。例如:int a[3][3]={{1},{2},{3}}; 对每一行的第一列元素赋值,未赋值的元素取0值。赋值后1 0 02 0 03 0 0对所有元素赋初值,则定义数组时,对第一维的长度可以不指定,但第二维长度不能省略。例如:int a[3][4]={{1,2,3,4,5,6,7,8,9,10,11,12};可以写成:int a[][4]={{1,2,3,4,5,6,7,8,9,10,11,12};例子有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。#include<stdio.h> main() { int max, a[3][4],i,j,x,y; max = a[0][0]; printf("请输入数据\n"); for (i = 0; i <= 2; i++){ for (j = 0; j <= 3; j++) { scanf_s("%d", &a[i][j]); } } for (i = 0; i <= 2; i++) { for (j = 0; j <= 3; j++) { if (max < a[i][j]) { max = a[i][j]; x = i+1; y = j+1; } } } printf("max=%d,在第%d行,第%d列", max, x, y); }将一个二维数组行和列的元素互换,存到另一个二维数组中。#include<stdio.h> main() { int a[2][4],b[4][2],i,j; printf("请输入数据\n"); for (i = 0; i <= 1; i++){ for (j = 0; j <= 3; j++) { scanf_s("%d", &a[i][j]); } } printf("\n"); for (i = 0; i <= 1; i++) { for (j = 0; j <= 3; j++) { b[j][i] = a[i][j]; printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); for (i = 0; i <= 3; i++) { for (j = 0; j <= 1; j++) { printf("%d ", b[i][j]); } printf("\n"); } }二维数组a10的对角线为1,其他为0。#include<stdio.h> void main() { int a[10][10],i,j; for (i = 0; i <= 9; i++){ for (j = 0; j <= 9; j++) { if (i == j||i+j==9) { a[i][j] = 1; } else { a[i][j] = 0; } } } printf("\n"); for (i = 0; i <= 9; i++) { for (j = 0; j <= 9; j++) { printf("%d ", a[i][j]); } printf("\n"); } }打印出以下的杨辉三角形10行1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1#include<stdio.h> void main() { int a[10][10],i,j; for (i = 0; i <= 9; i++){ for (j = 0; j <= i; j++) { if (j == 0 || j == i) { a[i][j] = 1; } else { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } } } printf("\n"); for (i = 0; i <= 9; i++) { for (j = 0; j <= i; j++) { printf("%d ", a[i][j]); } printf("\n"); } }
2022年02月05日
1,815 阅读
0 评论
0 点赞
2022-02-03
C语言一维数组-学习十二
数组数组是一组有有序数据的集合,数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。数组中的每一个元素都属于同一个数据类型。数组必须先定义后使用。定义类型符 数组名 [常量表达式]一维数组定义的一般形式类型符 数组名 [常量表达式];例如: int a[4+6]; int b[10];引用数组元素的表示形式数组名 [下标]-例如: a[1] = 10; a[0]=a[5]+a[7]-a[2*3];注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值数组的复制#include<stdio.h> void main() { int a[10] = { 1,2,3,4,5,6,7,8,9,10 }, b[10]; for (int i = 0; i < 10; i++){ b[i] = a[i]; printf("%d ", b[i]); } }一维数组的赋值给数组赋值的方法:用赋值语句对数组元素逐个赋值;采用初始化赋值;动态赋值(scanf())。数组初始化赋值:在数组定义时给数组元素赋初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。一般形式类型说明符 数组名[常量表达式] = {值,值,...,值};例如: int a [10] ={0,1,2,3,4,5,6,7,8,9}; int a [10] ={0,1,2,3,4};如果想使一个数组中全部元素值为0。可以写成: int a[10]={0,0,0,0,0,0,0,0,0,0}; 或 int a[10]={0};在对全部数组元素赋初值时,可以不指定数组。例如: int a[5]={1,2,3,4,5}; 可以写成: int a[]={1,2,3,4,5};动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。例如: for( i=0;i<10;i++) scanf_s( "%d", &a[il);例子对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输#include<stdio.h> void main() { int a[10], i; for (i = 0; i < 10; i++) a[i] = i; for (i=9; i >= 0 ; i--) printf("%d ",a[i]); }将数组中各元素交换,将数组的第一个元素与最后一个交换,第二个元素与倒数第二个交换,以此类推。#include<stdio.h> void main() { int a[10], i,j; for (i = 0; i <= 9; i++) a[i] = i; for (i = 0; i < 10 / 2; i++) { j = a[i]; a[i] = a[9 - i]; a[9 - i] = j; } for(i=0;i<=9;i++) printf("%d ",a[i]); }求一维数组中最大元素及其下标。#include<stdio.h> void main() { int a[10], i,j,max; for (i = 0; i < 10; i++) scanf_s("%d",&a[i]); max = a[0]; for (i = 0; i <10; i++) if (a[i]>max){ max = a[i]; j = i; } printf("max=%d,j=%d\n", max, j); }用数组处理求Fibonacci数列问题#include<stdio.h> void main() { int i; int f[10] = { 1,1 }; for (i = 2; i < 10; i++) f[i] = f[i - 2] + f[i - 1]; for (i = 0; i < 10; i++) { printf("%12d\n",f[i]); } }练习[card-default width="100%" label="练习"]1、以下对一维数组a的正确说明是___。(A)int a(10);(B)int n=10,a[n];(C)int n;scanf("%d",&n);(D) #define SIZE 10 int a[SIZE]; 2、以下能对一维数组a进行正确初始化的语句是___。(A) int a[10]= (0,0,0,0,0);(B)int a[10] = {};(C)int a[] = {0};(D)int a[10] = {10*1};3、当从键盘输入18并回车后,下面程序的运行结果是___。#include<stdio.h> main() { int x, y, i, a[8], j, u, v; scanf_s("%d", &x); y = x; i = 0; do { u = y / 2; a[i] = y % 2; i++; y = u; }while (y >= 1); for (j = i - 1; j >= 0; j--) printf("%d", a[j]); }(A)10010(B)10001(C)01001(D)00110[collapse][collapse-item label="答案"]1、D 2、C 3、A [/collapse-item][/collapse][/card-default]
2022年02月03日
1,866 阅读
0 评论
0 点赞
2022-02-02
选择与循环结构练习题-学习十一
练习[card-default width="100%" label="练习"]1、已知int x=10,y=20,z=30;以下语句执行后x,y,z的值是___。if(x>y) z=x; x=y; y=z;(A)10 20 30(B)20 30 10(C)20 30 30(D)30 20 102、以下不正确的语句是___。(A)if(x>y) x=1;(B)if(x=y)&&(x!=0) x+=y;(C)if(x!=y) scanf("%d",&x);(D)if(x<y){x++;y++};3、请读以程序写出程序的输出结果___。#include <stdio.h> main() { int x = 1, y = 0, a = 0, b = 0; switch (x) { case 1: switch (y) { case 0: a++; break; case 1: b++; break; } case 2: a++; b++; break; } printf("a=%d,b=%d", a, b); }(A)a=1,b=0(B)a=2,b=1(C)a=2,b=2(D)a=0,b=04、写出下面程序的运行结果是___。#include <stdio.h> main() { int i; for (i = 1; i <= 5; i++) switch (i % 5) { case 0: printf("*"); break; case 1: printf("#"); break; default:printf("\n"); case 2:printf("&"); } }(A)#& & &*(B)#& &*(C)#& &(D)#&&&*5、下面程序的运行结果是___。#include <stdio.h> main() { int i = 0, j = 0, k = 0, m; for (m = 0; m < 3; m++) switch (m) { case 0: i = m++; case 1: j = ++m; break; case 2: k = m++; case 3: ++m; } printf("%d, %d, %d,%d", i, j, k, m); }(A)0,2,0,4(B)1,2,1,4(C)0,2,0,3(D)0,3,2,46、下列程序的输出结果为___。#include <stdio.h> main() { int sum = 10; for (int i = 100; i <= 10; i++) sum = sum + i; printf("%d", sum); }(A)10(B)100(C)5050(D)50057、假设i的初始值为0,每循环一次后i的值增加1。如果想要让循环执行6次,那么for语句中循环继续的条件应该是:(A)i>6(B)i<=6(C)i<7(D)i<68、有以下程序,写出输出结果___。#include <stdio.h> main(){ int i; for (i = 0; i < 3; i++) switch (i) { case 0: printf("%d", i); case 1: printf("%d", i); default: printf("%d",i); } }9、设一个三位数可以表示为abc,若其能满足条件a3+b3+c3=abc,则称其为水仙花数,编程求出所有的水仙花数。例如: 153是一个“水仙花数”,因为153=13+53+33。10、输入一行字符,分别统计出其中的英文字母、空格、数字、和其他字符的个数。11、输入一个大于3的整数n,判定它是否素数(prime,又称质数)。12、求费波那西(Fibonacci)数列的前40个数。这个数列有如下特点:第1、2两个数为1、1。从第3个数开始该数是其前面两个数之和。F1=1 (n=1) F2=1 (n=2) .... Fn=F(n-2)+F(n-1) (n>2)[/card-default]答案选择题[collapse][collapse-item label="选择填空答案"]1、C 2、D 3、B 4、A 5、C 6、A 7、D 8、000112 [/collapse-item][/collapse]应用题答案9、#include <stdio.h> main(){ int a,b,c,i; for (i = 100; i <= 999; i++) { a = i / 100; b = i % 100 / 10; c = i % 10; if (i == a*a*a + b*b*b + c*c*c) printf("%d,", i); } }10、#include <stdio.h> void main(){ int z,k,s,q; char c; z = k = s = q = 0; for (c = getchar(); c != '\n';) { if (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z') z++; else if (c == ' ') k++; else if (c >= '0'&&c <= '9') s++; else q++; c = getchar(); } printf("字母:%d,空格:%d,数字:%d,其他:%d", z, k, s, q); }11、#include <stdio.h> void main() { int n, i; printf("请输入一个大于3整数:"); scanf_s("%d", &n); for (i = 2; i <= n - 1; i++) if (n%i == 0) break; if (i < n) printf("%d 不是素数\n", n); else printf("%d 是素数\n", n); }12、#include <stdio.h> void main() { int f1 = 1, f2 = 1, f3; int i; printf("%12d\n%12d\n", f1, f2); for (i = 1; i <= 38; i++) { f3 = f1 + f2; printf("%12d\n", f3); f1 = f2; f2 = f3; } }
2022年02月02日
1,979 阅读
0 评论
0 点赞
2022-02-01
C语言循环结构与循环嵌套-学习十
break语句和continue语句用break语句提前终止循环。break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。只能用于循环语句和switch语句之中,而不能单独使用用continue语句提前结束本次循环。有时并不希望终止整个循环的操作,只希望提前结束本次循环,而接着执行下次循环,这时可以用continue语句。break语可和continue语句的区别:continue语句只结束本次循环,而不是终止整个循环的执行。break语句结束整个循环过程,不再判断执行循环的条件是否成立。例子捐款活动,当人数达到1000人,或者捐款总额度达到100000,不再接受捐款,计算出平均每人捐款数额。(break)#include <stdio.h> #define SUM 100000 void main() { float amount, aver, total, i; for (i=1,total=0;i<= 1000;i++) { printf("请输入数额:"); scanf_s("%f", &amount); total = amount + total; if (total >= SUM) break; } aver = total / i; printf("平均:%f\n", aver); }要求输出100~200之间的整数不能被3整除的数。(continue)#include <stdio.h> void main() { int i; for (i=100;i<= 200;i++) { if (i % 3 != 0) printf("%d, ", i); else continue; } }循环嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环3种循环(while循环、do...while循环和for循环)可以互相嵌套时钟就是典型的循环嵌套:秒针走一圈,分针走一格;分针走一圈,时针走一格。例子,键盘输入打印行数,输出下列图案 * ** *** **** ***** ...#include <stdio.h> void main() { int i,j,n; printf("请输入打印的行数:"); scanf_s("%d", &n); for (i=1;i<= n;i++) { for (j = 1; j <= n - i; j++) printf(" "); for (j = 1; j <= i; j++) printf("*"); printf("\n"); } } 输出四行五列随机数#include <stdio.h> #include <stdlib.h> #include <time.h> void main() { srand(time(0)); //根据系统时间设置随机数种 int i,j,n =0; for (i=1;i<= 4;i++) { for (j = 1; j <= 5; j++) printf("%d\t",rand()% 100); //取得区间[O,100)的随机整数 printf("\n"); } }
2022年02月01日
1,693 阅读
0 评论
0 点赞
2022-01-30
C语言循环结构-学习九
循环结构特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。while语句一般形式: while(表达式){ 语句; }流程图注意:在循环体中应有使循环趋向于结束的语句,否则程序会陷入死循环,无限执行语句。程序陷入死循环,结束用atrl+break循环体中如果包含一个以上的语句,要用{}括起来!例子在控制台输出1-30#include <stdio.h> void main() { int i = 1; while (i <= 30) { printf("%d,", i); i++; } }求sum = 1+2+3+...+100解题思路令sum表示被加数(初始值为0)令i表示加数((初始值为1)进行100次加法后结束,或者加数大于100时结束sum中存放计算结果#include <stdio.h> void main() { int sum = 0; int i = 1; while (i <= 100) { sum = sum + i; i++; } printf("%d\n", sum); }do while语句先执行循环体,再判断, do...while 循环会确保至少执行一次循环一般形式: do{ 语句; } while (表达式);例子求sum = 1+2+3+...+100,用do...while实现#include <stdio.h> void main() { int sum = 0; int i = 1; do{ sum = sum + i; i++; } while (i <= 100); printf("%d\n", sum); }for循环一般形式for ( 表达式1; 表达式2; 表达式3) { 语句; }流程图首先会执行 表达式1 语句,且只会执行一次。这一步允许声明并初始化任何循环控制变量。也可以不在这里写任何语句,只要有一个分号出现即可。接下来会判断 表达式2 语句如果为真,则执行循环主体。如果为假,则不执行循环主体,会执行 for 循环后面的下一条语句。在执行完 for 循环主体后,控制流会跳回上面的 表达式3 语句。该语句允许更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。条件再次被判断。如果为真,则执行循环,这个过程会不断重复。在条件变为假时,for 循环终止。for和while可以完成同样的循环功能,但for更为简洁和高效。例子求sum = 1+2+3+...+100,用for实现#include <stdio.h> void main() { int sum = 0; for (int i = 1; i <= 100;i++) { sum = sum + i; } printf("%d\n", sum); } 一个或两个或三个表达式均可以省略,但 表达式后面的“;” 不能缺省。为了程序正常运行,省略表达式1(循环变量赋初值)和表达式3(循环变量增量)。表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。省略了表达式1。#include <stdio.h> void main() { int sum = 0; int i = 1; for (; i <= 100;i++) { sum = sum + i; } printf("%d\n", sum); }省略了表达式2(循环条件),则不做其它处理时便成为死循环。#include <stdio.h> void main() { int sum = 0; for (int i = 1;;i++) { sum = sum + i; } printf("%d\n", sum); }省略了表达式3。#include <stdio.h> void main() { int sum = 0; for (int i = 1;i <= 100;) { sum = sum + i; i++; } printf("%d\n", sum); }goto语句一般形式:goto 语句标号; //语句标号由字母、数字和下划线组成,不能使用整数 ... 语句标号: 语句;流程图例子求sum = 1+2+3+...+100,用goto和if实现#include <stdio.h> void main() { int sum = 0; int i = 1; loop: if (i <= 100) { sum = sum + i; i++; goto loop; } printf("%d\n", sum); } 四种循环结构的区别四种循环都可以用来处理同一个问题,一般可以互相代替。一般不提倡用goto型循环。while和do-while循环,循环体中应包含使循环趋于结束的语句。for语句功能更强,凡是用while循环能完成的,用for循环都能实现用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。while循环、do-while循环和for循环,都可以用break语句跳出循环,用continue语句结束本次循环。例子思路:设置变量高度h,折叠次数n循环终止条件 h > 8848000折叠的算法 h = pow(2,n); n=n+1; (pow是计算次方的函数)假设一张纸足够大并且可以无限折叠,这张纸的厚度是1mm,那么这张纸折叠多少次可以到达珠穆朗玛峰的高度(8848m)?// while循环 #include <stdio.h> #include <math.h> void main() { int h = 0, n = 0; while (h <= 8848000) { h = pow(2, n); n++; } printf("%d\n", n - 1); } // for循环 #include <stdio.h> #include <math.h> void main() { int n, h=0; for (n=0;h <= 8848000;n++) { h = pow(2, n); } printf("%d\n", n - 1); }
2022年01月30日
1,761 阅读
0 评论
0 点赞
1
2
3
4
简体中文
繁體中文
English
日本語
한국어