c语言程序设计案例教程(第2版)笔记(一)—零散、输入输出、最小公倍数、选择排序、冒泡排序
零散知识点:
- 非格式化输入输出:getchar()、putchar()
- 格式化输入输出 :scanf()、printf()
- 字符串输入输出 :gets() 或 scanf()、puts() 或 printf()。
- gets()函数以换行符或文件结束符EOF作为输入的结束标志,因此,在输入的字符串中允许包含空格或制表符。
- scanf()函数则以空格、制表符、换行符和文件结束符EOF作为输入的结束标志,因此,在输入的字符串中不允许包含这些字符。
- puts()函数在字符串显示完毕后换行。
- printf()函数不会进行换行。
- %f 表示这个位置应该输入一个实型数值
- %s 表示这个位置应该输入一个字符串
- break语句的目的是:终止执行后面分支的语句序列。
- continue语句只能应用在循环语句中,它的作用是:强制终止本次循环的执行,转去执行下一次循环。
- 交换两个数值(不引入外部参数)
1 #include<stdio.h> 2 #pragma warning(disable:4996) 3 4 main() 5 { 6 int m, n; 7 printf("Enter two numbers:"); 8 scanf("%d%d", &m, &n); 9 printf("\nm:%d\n", m); 10 printf("n:%d\n", n); 11 m = m + n; 12 n = m - n; 13 m = m - n; 14 printf("\nm:%d\n", m); 15 printf("n:%d\n", n); 16 }
- 求最小公倍数:首先比较大小(大小排序),后使用辗转相除法,求出最大公约数(被除数/除数=商…余数,后使用除数除以余数,直至余数为0;),再使用两个数的乘积除以该最大公约数,即可。
代码如下:
1 #include<stdio.h> 2 #pragma warning(disable:4996) 3 4 main(){ 5 int i, j, temp, s; 6 7 printf("Enter two integers : "); 8 scanf("%d%d", &i, &j); 9 s = i*j; 10 /* if (i < j){ 11 i += j; 12 j = i - j; 13 i = i - j; 14 }*/ 15 16 do{ 17 temp = i%j; 18 i = j; 19 j = temp; 20 } while (j>0); 21 printf("the max gongyueshu: %d\n", i); 22 printf("the min gongbeishu: %d\n", s / i); 23 }
或
1 #include<stdio.h> 2 #pragma warning(disable:4996) 3 int gcd(int m, int n); 4 5 main(){ 6 int i, j, s; 7 int r; 8 9 printf("111Enter two integers : "); 10 scanf("%d%d", &i, &j); 11 s = i*j; 12 /* if (i < j){ 13 i += j; 14 j = i - j; 15 i = i - j; 16 }*/ 17 r = gcd(i, j); 18 printf("the max gongyueshu: %d\n", r); 19 printf("the min gongbeishu: %d\n", s / r); 20 } 21 22 int gcd(int m, int n) 23 { 24 if (m % n == 0) 25 return n; 26 else 27 return gcd(n, m%n); 28 }
- 一维数组:变量一经定义,系统将会为每个数组型变量分配一片连续的存储空间。
- 32位操作系统,int类型是4字节。
- int vote[10]={0} 表示为每一个元素赋予初值0。
- 采用键盘输入的方式为数组中的每个元素赋值:
1 int i; 2 int score[13]; 3 for (i = 0; i < 13; i++){ 4 scanf("%f", &score[i]); 5 }
- 判断是否为英文字母
- ('A'<=ch && ch <='Z') || ('a<=ch && ch <='z')
- isalpha(c) c是一个字符,头文件是<ctype.h>。当c为英文字母,函数返回非0;否则函数返回0。
- 选择排序法
- 基本思路:假设有n个数据将要参与排序操作,则具体的排序过程可以描述为:首先从n个数据中选择一个最小的数据,并将它交换到第1个位置;然后再从后面n-1个数据中选择一个最小的数据,并将它交换到第2个位置;以此类推,直至最后从两个数据中选择一个最小的数据,并将它交换到第n-1个位置为止,整个排序操作结束。
- 选择排序代码实现过程:
1 #include<stdio.h> 2 #pragma warning(disable:4996) 3 #define NUM 10 4 5 main() 6 { 7 int data[NUM]; 8 int i, j, min, temp; 9 10 printf("Please enter %d integers:", NUM); 11 for (i = 0; i < NUM; i++){ 12 scanf("%d", &data[i]); 13 } 14 15 printf("\n%d integers are:\n", NUM); 16 for (i = 0; i < NUM; i++){ 17 printf("%5d", data[i]); 18 } 19 20 for (i = 0; i < NUM - 1; i++){ 21 min = i; 22 for (j = i + 1; j < NUM; j++){ 23 if (data[j] < data[min]) 24 min = j; 25 } 26 if (min != i){ 27 temp = data[i]; 28 data[i] = data[min]; 29 data[min] = temp; 30 } 31 } 32 33 printf("\nOrdering list is:\n"); 34 for (i = 0; i < NUM; i++){ 35 printf("%5d", data[i]); 36 } 37 }
- 冒泡排序法
- 基本思路:不断地将所有的相邻数据进行比较,如果前面的数据大于后面的数据(a[j]>a[j+1]),就将两个位置的数据进行交换,最终实现所有的数据按照非递减的顺序重新排列。(如果有n个数据等待排序,则最多经过n-1次冒泡排序就可以将所有的数据排列好)
- 具体过程:
- 将整个待排序的数据序列划分成有序区域和无序区域。初始状态有序区域为空,无序区域包括所有待排序的数据;
- 对无序区域从前向后依次对相邻的两个数据进行比较,若逆序则将其交换,从而使得较小的数据像泡沫一样向前,较大的数据向后;
- 冒泡排序代码实现过程:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #pragma warning(disable:4996) 4 #define NUM 10 5 void input(int value[]); 6 void output(int value[]); 7 void sort(int value[]); 8 9 main() 10 { 11 int value[NUM]; 12 input(value); 13 output(value); 14 sort(value); 15 output(value); 16 } 17 18 //输入待排序列 19 void input(int value[]) 20 { 21 int i; 22 23 printf("Enter %d integers : ", NUM); 24 for (i = 0; i < NUM; i++){ 25 scanf("%d", &value[i]); 26 } 27 } 28 29 //输出显示数据数列 30 void output(int value[]) 31 { 32 int i; 33 34 printf("\n"); 35 for (i = 0; i < NUM; i++){ 36 printf("%5d", value[i]); 37 } 38 } 39 40 //冒泡排序函数 41 void sort(int value[]) 42 { 43 int i, j, temp; 44 45 for (i = NUM - 1; i >= 1; i--){ /*控制排序次数*/ 46 for (j = 0; j < i; j++){ /*相邻数据比较大小*/ 47 if (value[j] < value[j + 1]){ 48 temp = value[j]; 49 value[j] = value[j + 1]; 50 value[j + 1] = temp; 51 } 52 } 53 } 54 }
- 在C语言中,字符串用字符型数组存储,并且以“\0”作为结束标志。结束标志“\0”是由系统自动添加到字符序列尾部的。结束标志“\0”不被计算在字符串的长度中。
- 字符串标准函数,头文件<string.h>:
- strlwr(str)——将字符串str中出现的所有大写字母转换成小写字母;
- strupr(str)——将字符串str中出现的所有小写字母转换成大写字母;
- strlen(str)——计算字符串长度,字符串结束标志“\0”不计算在内;
- strcmp(str1,str2)——比较字符串。str1<str2,函数返回一个负整数。区分大小写。可用来检测用户密码。
- stricmp(str1,str2)——比较字符串。str1<str2,函数返回一个负整数。不区分大小写。
- strcpy(str1,str2)——str2是将要被拷贝的字符串,str1是用于存放拷贝结果的存储区域。
- strcat(str1,str2)——将str2连接到str1之后。
- strstr(str1,str2)——检测主串str1中是否存在给定子串str2,函数返回子串str2在主串中第一次出现的位置;否则返回空。
- strchr(str1,ch)——检测给定字符ch是否在字符串str1中存在,函数返回ch在str1中第一次出现的位置;否则返回空。
- 二维数组的赋值与输出
1 #define ROW 6 2 #define COL 4 3 int i, j; 4 int value[ROW][COL]; 5 6 //利用赋值语句 7 for (i = 0; i < ROW; i++){ 8 for (j = 0; j < COL; j++){ 9 value[i][j] = i + j; 10 } 11 } 12 //通过键盘输入 13 for (i = 0; i < ROW; i++){ 14 for (j = 0; j < COL; j++){ 15 scanf("%d", &value[i][j]); 16 } 17 } 18 //输出二维数组 19 for (i = 0; i < ROW; i++){ 20 for (j = 0; j < COL; j++){ 21 printf("%4d", value[i][j]); 22 } 23 putchar('\n'); 24 }
程序一:
功能描述:输入一个整数n,打印输出一个由n个字符星号“*”组成的等边三角形。
1 #include <stdio.h> 2 3 main() 4 { 5 int n, i, j; 6 printf("please enter the side of the triangle:"); 7 scanf_s("%d", &n); 8 for (i = 1; i <= n; i++){ 9 for (j = 1; j <= n - i; j++){ 10 putchar(' '); 11 } 12 for (j = 1; j <= i; j++){ 13 putchar('*'); 14 if (j != i){ 15 putchar('_'); 16 } 17 } 18 putchar('\n'); 19 } 20 }
结果:
程序二:
功能描述:输入文本行,统计其中包含的行数、单词书、字符数。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<string.h> 4 #pragma warning(disable:4996) 5 6 #define IN 1 /* inside a word */ 7 #define OUT 0 /* outside a word */ 8 /* count lines, words, and characters in input */ 9 main() 10 { 11 int c, nl, nw, nc, state; 12 state = OUT; 13 nl = nw = nc = 0; 14 while ((c = getchar()) != 'END') 15 { 16 ++nc; 17 if (c == '\n') 18 ++nl; 19 if (c == ' ' || c == '\n' || c == '\t') 20 state = OUT; 21 else if (state == OUT) { 22 state = IN; 23 ++nw; 24 } 25 } 26 printf("%d %d %d\n", nl, nw, nc); 27 }
程序三:
功能描述:输出当年当月的月历。
1 #include <stdio.h> 2 3 main() 4 { 5 int n, i, j; 6 7 scanf_s("%d", &n); 8 9 if (n == 7) 10 n = 0; 11 else 12 n = n; 13 14 printf(" Sun Mon Tue Wed Tur Fri Sat\n"); 15 16 for (i = 1; i <= n; i++){ 17 printf("%4c", ' '); 18 } 19 for (j = 1; j <= 30; j++){ 20 if ((j + n) % 7 == 0){ 21 printf("%4d", j); 22 printf("\n"); 23 } 24 else{ 25 printf("%4d", j); 26 } 27 } 28 return 0; 29 }
结果:
程序四:
功能描述:菲波那切数列。
1 #include<stdio.h> 2 #define NUM 20 3 4 main() 5 { 6 int fib[NUM]; 7 int i; 8 9 fib[0] = 0; 10 fib[1] = 1; 11 for (i = 2; i < NUM; i++){ 12 fib[i] = fib[i - 2] + fib[i - 1]; 13 } 14 for (i = 0; i < NUM; i++){ 15 if (i % 10 == 0) 16 printf("\n"); 17 printf("%6d", fib[i]); 18 } 19 }
结果:
程序五:
功能描述:输入一个文本行,其中包含多个单词,计算其中最长的单词长度。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #pragma warning(disable:4996) 5 6 main() 7 { 8 char str[1000]; 9 int i, m = 0, L = 0, x = 0; 10 printf("please enter text line:"); 11 gets(str); 12 for (i = 0; i < strlen(str); i++){ 13 if (str[i] >= 'a'&&str[i] <= 'z' || str[i] >= 'A'&&str[i] <= 'Z'){ 14 m++; 15 continue; 16 } 17 else{ 18 if (m>L){ 19 L = m; 20 } 21 m = 0; 22 } 23 } 24 if (m > L){ 25 L = m; 26 } 27 printf("the long of the largest word is %d", L); 28 }
本博客内容为原创,版权所有违者必究,转载请注明来源 http://www.cnblogs.com/sunshine-blog/