【示例1】求一个整型数组中的最大值和最小值。
#include<stdio.h>
int main()
{int i,max,min,a[10]={0};
for(i=1;i<=9;i++)
scanf(“%d”,&a[i]); /从控制台获取用户输入并赋值给数组元素/
max=a[0];min=a[0]; /假设a[0]是最大值也是最小值/
for(i=1;i<=9;i++)
{if(a[i]>max)max=a[i];
if(a[i]<min)min=a[i];}
printf(“max=%d\n”,max); /* printf(“The max is %d, The min is %d\n”, max, min);/
printf(“min=%d\n”,min);
system(“pause”); / getch();或者return 0;*/
}
运行结果:
2 123 45 100 575 240 799 710 10 90↙
The max is 799, The min is 2
这段代码有两点需要说明:
-
从控制台获取数组元素时,我们一次性输入10个整数才按下回车键,而不是每输入一个整数就按一次回车键,这正是利用了标准输入缓冲区。
-
要想求得数组中的最大值和最小值,就得循环比较数组中的所有元素,并设置两个变量 max 和 min 来接收。以最大值为例,开始循环之前,先假设第0个元素是最大值(当然你也可以假设第1、2、3 个元素),然后用 max 和数组中剩余的元素进行比较,如果某个元素的值比 max 大,就用这个元素的值替换 max 的值,等把所有元素遍历完了,max 中就是最大值了。
关于排序和查找
学完了数组,有两个重要的知识点要求大家掌握,那就是排序(Sort)和查找(Search),比如:
给你 10 个打乱顺序的整数,要能够按照从小到大或者从大到小的顺序输出;
给定一个字符串 str1,以及一个子串 str2,要能够判断 str2 是否在 str1 中。
排序和查找的方法有很多种,我们把它们设置成了单独的一章进行讲解,请查看:C语言排序和查找
如果你希望更加深入和透彻地学习编程,请了解VIP会员(赠送1TB资料)或C语言一对一辅导。
用C语言来统计文件中单词的个数
C语言判断回文字符串
I/O(输入/输出)控制方式
C语言获取开机时间
gets()
输入/输出(I/O)设备分配与回收
系统调用
经典进程同步问题3:哲学家进餐问题
C语言输出2的N次幂
fputs()
#include<stdio.h>
int main()
{
int a[10] ;
int max, min;
int i,x;
int len=sizeof(a)/sizeof(int);
for (i=0;i<=9;i++)
{
scanf(“%d”,&x);
a[i]=x;
}
max=a[0];min=a[0];
for(i=1; i<len; i++)
{
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
}
printf(“The max is %d, The min is %d\n”, max, min);
printf(“%d %d\n”,sizeof(a),sizeof(int));
system(“pause”);
}
简单的修改了一下 输入十个整数 输出最大数和最小数
2015年12月24日
C语言选择排序算法及代码
选择排序是排序算法的一种,这里以从小到大排序为例进行讲解。
基本思想及举例说明
选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置;然后,选出第二小的数,放在第二个位置;以此类推,直到所有的数从小到大排序。
在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换。
下面,以对 3 2 4 1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置。
第1轮 排序过程 (寻找第1小的数所在的位置)
3 2 4 1(最初, min_index=1即数3)
3 2 4 1(3 > 2, 所以min_index=2)
3 2 4 1(2 < 4, 所以 min_index=2)
3 2 4 1(2 > 1, 所以 min_index=4, 这时候确定了第1小的数在位置4)
1 2 4 3 (第1轮结果,将3和1交换,也就是位置1和位置4交换)
第2轮 排序过程 (寻找第2小的数所在的位置)
1 2 4 3(第1轮结果, min_index=2,只需要从位置2开始寻找)
1 2 4 3(4 > 2, 所以min_index=2)
1 2 4 3(3 > 2, 所以 min_index=2)
1 2 4 3(第2轮结果,因为min_index位置刚好在第2个位置,无需交换)
第3轮 排序过程 (寻找第3小的数所在的位置)
1 2 4 3(第2轮结果, min_index=3,只需要从位置2开始寻找)
1 2 4 3(4 > 3, 所以min_index=4)
1 2 3 4(第3轮结果,将3和4交换,也就是位置4和位置3交换)
至此,排序完毕。
总结及实现
选择排序对大小为N的无序数组R[N]进行排序,进行N-1轮选择过程。第i轮选取第i小的数,并将其放在第i个位置上。当第N-1次完成时,第N小(也就是最大)的数自然在最后的位置上。
下面给出选择排序的C语言实现。
#include<stdio.h>
#include<stdlib.h>
#define N 9
void select_sort(int a[],int n) /* 选择排序实现,n为数组a的元素个数*/
{ int i,j; /进行N-1轮选择/
for(i=0; i<n-1; i++)
{
int min_index = i; /找出第i小的数所在的位置/
for(j=i+1; j<n; j++)
{
if(a[j] < a[min_index])
{
min_index = j;
}
}
/将第i小的数,放在第i个位置;如果刚好,就不用交换/
if( i != min_index)
{
int temp = a[i];
a[i] = a[min_index];
a[min_index] = temp;
}
}
}
int main()
{
int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};int i;
select_sort(num, N);
for(i=0; i<N; i++)
printf(“%d “, num[i]);
printf(”\n”);
system(“pause”);
getch();
}
注意:选择排序是一种不稳定的排序算法,可能会打乱两个相同数字的原有顺序。
例如,序列 5 8 5 2 9, 按照从小到大排序,第一轮会将第1个数字5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序是一种不稳定的排序算法。
C语言输出2的N次幂
输出 2 的 N 次幂:1, 2, 4, 8, … 一直到 2^N。
设N=16,代码如下:
#include <stdio.h>
#define N 16
int main(void)
{
int n; /记录当前指数/
long int val = 1; /保存 2^n 的结果/
printf("\t n \t 2^n\n");
printf("\t================\n");
for (n=0; n<=N; n++)
{
printf(“\t%3d \t %6ld\n”, n, val);
val = 2*val;
}
system(“pause”);
getch();
}
输出结果:
n 2^n
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
11 2048
12 4096
13 8192
14 16384
15 32768
16 65536
C语言判断回文字符串
输入一个字符串,判断其是否为回文。
所谓回文字符串,是指从左到右读和从右到左读完全相同的字符串。
主要涉及知识点:字符数组的输入输出,及相应的处理。
这个问题,可以从字符串的两头开始比较,即第1个字符和倒数第1个字符比较,第2个字符和倒数第2个字符比较,以此类推…如果出现字符不相等的情况,说明不是回文,如果全部相等,说明是回文。
代码如下:
#include <stdio.h>
#include <string.h>
#include <string.h>
void main(){
char s[100]; /存放输入的字符串/
int i, j, n;
printf(“enter character string:\n”);
gets(s);
n=strlen(s);
for(i=0,j=n-1;i<j;i++,j--)if(s[i]!=s[j]) break;if(i>=j)printf("It is palindrome list\n");/*是回文串*/ elseprintf("It is not palindrome list\n");/*不是回文串*/printf("%s\n",s);system("pause");
getch();
}
运行结果:
输入字符串:abcdedcba
是回文串
或者:
输入字符串:www.coderbbs.com
不是回文串
用C语言来统计文件中单词的个数 ?
文本检索是软件最常用的一个功能,用C语言写一段程序,统计某个文件中单词的个数。
提示:单词是以空格为分隔的。
文本检索是软件最常用的一个功能,下面的代码将教你如果使用C语言统计单词的个数。
代码实现:
纯文本新窗口
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
/argc: 统计运行程序时命令行参数的个数/
/* argv[]: 储存每个参数的字符串指针,每一个元素对应一个参数/
int main (int argc,char argv[])
{
int ch,bian=0,count=0;
char find[50],temp[1000];
FILE pt; /文件指针/
/判断是否输入文件/
if (argc != 2){
printf(“请使用格式: %s 文件名”,argv[0]);
exit(1); /非正常退出/
}
/ 判断能否成功打开文件/
if ((pt = fopen(argv[1],“r”))== NULL){ /将argv[1]赋值给指针pt/
printf(“打开文件 %s 失败”,argv[1]);
exit(1);
}
printf(“请输入要查找的单词:”);
gets(find);
while((ch=getc(pt))!=EOF){ /EOF 表示文件结束/
if ((ch!=’ ‘)&&(ch!=’\n’)){
temp[bian]=ch;
bian++;
} else {
temp[bian]=‘\0’;
if ((strcmp(find,temp))==0) count++;
bian=0;
}
}
printf(“共在文件%s中查找到字符串”%s" %d 个\n",argv[1],find,count);
getch();
}
代码分析上面的程序,需要在 dos 命令行下运行。 首先 cd 到程序的编译目录,然后输入程序名和文件名,例如,笔者编译后的程序位于 E:\cDemo\Debug\cDemo.exe,那么运行方式如下:
这里需要简单介绍一下 main() 函数。main() 函数是程序的入口函数,代码内部无法向其传参,只能在程序运行时由系统在向其传参。一般情况下不需要向main()函数传参,但是如果希望程序启动时可以读取有用数据,进行初始化处理,那么可以这样来传参:
int main (int argc, char *argv[])
argc 表示参数的个数,argv[] 以数组形式保存传递的所有参数。
注意,当前程序会作为第一个参数传递,例如上面输入 cdemo.exe demo.txt,那么 argc =2,argc[0]=cdemo.exe,argc[1]=demo.txt
还有一种简单的传参方式,就是将文件(图标)拖到程序上,程序就会立即运行,并将该文件作为一个参数,效果与 cdemo.exe demo.txt 相同。
关于main()函数的更多介绍请查看:C语言mian()函数详解
最后说一下实现单词搜索的思路,这是本程序的关键,这部分代码位于while循环内。
用gets读取用户输入的单词并保存到变量find,while((ch=getc(pt))!=EOF) 对文件进行读取,直到文件结束。
用if对读取的进程进行判断:将每次读取到的单个字符ch依次放入字符串数组temp[]中,直到遇到空格符或者换行符,则这个单词结束,添加’\0’结束标记。用strcmp()函数与用户搜索的单词find进行比较,如果匹配,则返回0,计数器count加1。最后令bian置0。
注意:英语书写时以空格来分隔每个单词,故我们以空格作为单词结束的标志。而之所以要加上换行符,是因为如果没有检测换行符,当单词在行首(或行末)时,就会和上一行(或下一行)的最后一个单词连在一起,视为1个单词与find比较,导致统计结果缺失。