常用程序
ASCII编码程序:
#include <stdio.h>
Int main(void)
{ char x=?(num); printf(“%c”,x); return 0; }
解码:char x=’?(字符即字母或标点)’; print(“%d”,x);~
typesize.c -- 打印类型大小 *
#include <stdio.h> int main(void)
{/* C99为类型大小提供%zd转换说明 */
printf("Type int has a size of %zd bytes.\n",
sizeof(int));
printf("Type char has a size of %zd bytes.\n",
sizeof(char));
printf("Type long has a size of %zd bytes.\n",
sizeof(long));
printf("Type long long has a size of %zd bytes.\n",
sizeof(long long));
printf("Type double has a size of %zd bytes.\n",
sizeof(double));
printf("Type long double has a size of %zd bytes.\n",
sizeof(long double));
return 0;
}
自定义输入/输出函数示例:
- 打印字符串,不添加换行符:
#include <stdio.h>
void put1(const char * string)/* 不会改变字符串 */
{while (*string != '\0')
putchar(*string++); }
重复输入,直到文件结尾程序
#include <stdio.h>
int main(void)
{ int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0; }
变量ch的类型从char变为int,因为char类型的变量只能表示0~255的无符号整数,但是EOF的值是-1。getchar()函数实际返回值的类型是int,所以它可以读取EOF字符。如果实现使用有符号的char类型,也可以把ch声明为char类型。使用该程序进行键盘输入,要设法输入EOF字符。不能只输入字符EOF,也不能只输入-1(输入-1会传送两个字符:一个连字符和一个数字1)。正确的方法是,必须找出当前系统的要求。例如,在大多数UNIX和Linux系统中,在一行开始处按下Ctrl+D会传输文件结尾信号。一些系统把任意位置的Ctrl+Z解释成文件结尾信号。
排除缓冲区换行符影响示例:
while (getchar() != 'y') /* 获取响应,与 y 做对比*/
{
printf("Well, then, is it %d?\n", ++guess);
while (getchar() != '\n')
continue; /* 跳过剩余的输入行 */ }
文件作用域示例
#include <stdio.h>
int units = 0; /* 该变量具有文件作用域 */
void critic(void);
int main(void)
{
...
}
void critic(void)
{
...
}
外部链接与内部链接示例
int giants = 5; // 文件作用域,外部链接
static int dodgers = 3; // 文件作用域,内部链接
int main()
{
...
}
...
- 该文件和同一程序的其他文件都可以使用变量giants。而变量dodgers属文件私有,该文件中的任意函数都可使用它。
do while 循环辅助理解程序:
#include <stdio.h>
int main(void)
{ const int secret_code = 13;
int code_entered;
do{ printf("To enter the triskaidekaphobia therapy club,\n");
printf("please enter the secret code number: ");
scanf("%d",&code_entered); }
while (code_entered != secret_code);
printf("Congratulations! You are cured!\n");
return 0; }
swich语句辅助理解程序
该表达式是刚输入给 ch的值。然后程序扫描标签(这里指,case 'a' :、case 'b' :等)列表,直到发现一个匹配的值为止。然后程序跳转至那一行。如果没有匹配的标签怎么办?如果有default :标签行,就跳转至该行;否则,程序继续执行在switch后面的语句。break语句在其中让程序离开switch语句,跳至switch语句后面的下一条语句。如果没有break语句,就会从匹配标签开始执行到switch末尾。例如,如果删除该程序中的所有break语句,运行程序后输入d,其交互的输出结果会执行从case 'd':到switch语句末尾的所有语句。
switch (ch)
{
case 'a':
printf("argali, a wild sheep of Asia\n");
break;
case 'b':
printf("babirusa, a wild pig of Malay\n");
break;
case 'c':
printf("coati, racoonlike mammal\n");
break;
case 'd':
printf("desman, aquatic, molelike critter\n");
break;
case 'e':
printf("echidna, the spiny anteater\n");
break;
case 'f':
printf("fisher, brownish marten\n");
break;
default:
printf("That's a stumper!\n"); } /* switch结束 */
指针辅助理解程序示例:
#include <stdio.h>
void interchange(int * u, int * v);
int main(void)
{int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); // 把地址发送给函数,该函数传递的不是x和y的值,而是它们的地址。这意味着出现在interchange()原型和定义中的形式参数u和v将把地址作为它们的值。因
此,应把它们声明为指针。
printf("Now x = %d and y = %d.\n", x, y);
return 0; }
void interchange(int * u, int * v)
{int temp;
temp = *u; // temp获得 u 所指向对象的值,u的值是&x,所以u指向x。这意味着用*u即可表示x的值,
*u = *v;
*v = temp; }
指针加一辅助理解程序示例:
#include <stdio.h>
#define SIZE 4
int main(void)
{short dates[SIZE];
short * pti;
short index;
double bills[SIZE];
double * ptf;
pti = dates; // 把数组地址赋给指
ptf = bills;
printf("%23s %15s\n", "short", "double");
for (index = 0; index < SIZE; index++)
printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
return 0; }
在C中,指针加1指的是增加一个存储单元。对数组而言,这意味着把加1后的地址是下一个元素的地址,而不是下一个字节的地址。在指针前面使用运算符可以得到该指针所指向对象的值。指针加1,指针的值递增它所指向类型的大小(以字节为单位)。
dates + 2 == &date[2] // 相同的地址(dates + 2) == dates[2]` // 相同的值
编写一个处理数组的函数示例:
阐明包含数组元素个数的信息。第一种方法:在函数代码中写上固定的数组大小
int sum(int * ar) // 相应的函数定义,对应的函数原型
{
int i;
int total = 0;
for (i = 0; i < 10; i++) // 假设数组有10个元素
total += ar[i]; // ar[i] 与 *(ar + i) 相同
return total; }
sum()从该参数获得了什么信息?它获得了该数组首元素的地址,知道要在该位置上找出一个整数。
第二种:
int sum(int * ar, int n) // 更通用的方法
{int i;
int total = 0;
for (i = 0; i < n; i++) // 使用 n 个元素
total += ar[i]; // ar[i] 和 *(ar + i) 相同
return total; }
只有在函数原型或函数定义头中,才可以用int ar[]代替int * ar。int *ar形式和int ar[]形式都表示ar是一个指向int的指针。
声明数组形参
- 因为数组名是该数组首元素的地址,作为实际参数的数组名要求形式参数是一个与之匹配的指针。只有在这种情况下,C才会把int ar[]和int * ar解释成一样。也就是说,ar是指向int的指针。由于函数原型可以省略参数名,所以下面4种原型都是等价的:
int sum(int *ar, int n); int sum(int *, int); int sum(int ar[], int n); int sum(int [], int);
但是,在函数定义中不能省略参数名。下面两种形式的函数定义等价:
int sum(int *ar, int n); int sum(int ar[], int n);
函数s_geats:去掉fgets()末尾的换行符
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}
结构辅助理解程序
//* book.c -- 一本书的图书目录 */
#include <stdio.h>
#include <string.h>
char * s_gets(char * st, int n);
#define MAXTITL 41 /* 书名的最大长度 + 1 */
#define MAXAUTL 31 /* 作者姓名的最大长度 + 1*/
struct book { /* 结构模版:标记是 book */
char title[MAXTITL];
char author[MAXAUTL];
float value;
}; /* 结构模版结束 */
int main(void)
{
struct book library; /* 把 library 声明为一个 book 类型的变量 */
printf("Please enter the book title.\n");
s_gets(library.title, MAXTITL); /* 访问title部分*/
printf("Now enter the author.\n");
s_gets(library.author, MAXAUTL);
printf("Now enter the value.\n");
scanf("%f", &library.value);
printf("%s by %s: $%.2f\n", library.title,library.author, library.value);
printf("%s: \"%s\" ($%.2f)\n", library.author,library.title, library.value);
printf("Done.\n");
return 0;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}
素数判断:
int isPrime(int )
int isPrime(int n)
{
int div,i;
for (div = 2; (div * div) <= n; div++)
{
if (n % div == 0)
{
i++;
break;
}
}
if(i)
return 0;
else
return 1;
}
冒泡排序示例:
int ch,i1,i;
for(i=0;i<(n-1);i++)
{
for(i1=0;i1<(n-1-i);i1++)
{
if(a[i1]>a[i1+1])
{
ch=a[i1];
a[i1]=a[i1+1];
a[i1+1]=ch;
}
}
}
插入排序示例
void InsertSort(int a[],int n)
{
int i,i1,i2,i3,i4,ch;
for(i1=1;i1<n;i1++)//
{
for(i2=0;i2<i1;i2++)//bidaxaio
{
if(a[i1]<a[i2])
{
ch=a[i1];
for(i3=(i1-1);i3>=i2;i3--)
a[i3+1]=a[i3];
a[i2]=ch;
}
}
for(i4=0;i4<(n-1);i4++)
printf("%d ",a[i4]);
printf("%d\n",a[n-1]);
}
}
选择排序示例:
void selectSort(int data[],int elementCount)
{
int i,i1,ch;
for(i=0;i<(elementCount)-1;i++)
{
i1=findMin(data,i,elementCount-1);
ch=data[i];
data[i]=data[i1];
data[i1]=ch;
}
outputData(data,elementCount);
}
int findMin(int data[], int startLoc, int endLoc)
{
int i,i1;
int minn=data[startLoc];
for(i=startLoc;i<=endLoc;i++)
{
int i2=0;
for(i1=startLoc;i1<=endLoc;i1++)
{
if(data[i]>data[i1])
i2++;
}
if(i2==0)
{
return i;
}
}
}
void outputData(int data[],int elementCount)//
{
int i;
for( i = 0 ; i < elementCount - 1 ; i++ )
printf( "%d " , data[i] ) ;
printf( "%d\n" , data[i] ) ;
}
两个正整数的最大公约数:
- 基于欧几里得算法。两个数的乘积等于它们的最大公约数与最小公倍数的乘积。
#include<stdio.h>
int GCD(int a , int b );
int main()
{
int a , b ;
scanf("%d%d", &a , &b );
printf( "%d\n" , GCD( a, b ) ) ;
return 0 ;
}
int GCD(int a , int b )
{
if(a>=b)
{
if(a%b==0)
return b;
else
return GCD(b,a%b);
}
else
{
if(b%a==0)
return a;
else
return GCD(a,b%a);
}
}
```### ASCII编码程序:
```c
#include <stdio.h>
Int main(void)
{ char x=?(num); printf(“%c”,x); return 0; }
解码:char x=’?(字符即字母或标点)’; print(“%d”,x);~
typesize.c -- 打印类型大小 *
#include <stdio.h> int main(void)
{/* C99为类型大小提供%zd转换说明 */
printf("Type int has a size of %zd bytes.\n",
sizeof(int));
printf("Type char has a size of %zd bytes.\n",
sizeof(char));
printf("Type long has a size of %zd bytes.\n",
sizeof(long));
printf("Type long long has a size of %zd bytes.\n",
sizeof(long long));
printf("Type double has a size of %zd bytes.\n",
sizeof(double));
printf("Type long double has a size of %zd bytes.\n",
sizeof(long double));
return 0;
}
自定义输入/输出函数示例:
- 打印字符串,不添加换行符:
#include <stdio.h>
void put1(const char * string)/* 不会改变字符串 */
{while (*string != '\0')
putchar(*string++); }
重复输入,直到文件结尾程序
#include <stdio.h>
int main(void)
{ int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0; }
变量ch的类型从char变为int,因为char类型的变量只能表示0~255的无符号整数,但是EOF的值是-1。getchar()函数实际返回值的类型是int,所以它可以读取EOF字符。如果实现使用有符号的char类型,也可以把ch声明为char类型。使用该程序进行键盘输入,要设法输入EOF字符。不能只输入字符EOF,也不能只输入-1(输入-1会传送两个字符:一个连字符和一个数字1)。正确的方法是,必须找出当前系统的要求。例如,在大多数UNIX和Linux系统中,在一行开始处按下Ctrl+D会传输文件结尾信号。一些系统把任意位置的Ctrl+Z解释成文件结尾信号。
排除缓冲区换行符影响示例:
while (getchar() != 'y') /* 获取响应,与 y 做对比*/
{
printf("Well, then, is it %d?\n", ++guess);
while (getchar() != '\n')
continue; /* 跳过剩余的输入行 */ }
文件作用域示例
#include <stdio.h>
int units = 0; /* 该变量具有文件作用域 */
void critic(void);
int main(void)
{
...
}
void critic(void)
{
...
}
外部链接与内部链接示例
int giants = 5; // 文件作用域,外部链接
static int dodgers = 3; // 文件作用域,内部链接
int main()
{
...
}
...
- 该文件和同一程序的其他文件都可以使用变量giants。而变量dodgers属文件私有,该文件中的任意函数都可使用它。
do while 循环辅助理解程序:
#include <stdio.h>
int main(void)
{ const int secret_code = 13;
int code_entered;
do{ printf("To enter the triskaidekaphobia therapy club,\n");
printf("please enter the secret code number: ");
scanf("%d",&code_entered); }
while (code_entered != secret_code);
printf("Congratulations! You are cured!\n");
return 0; }
swich语句辅助理解程序
该表达式是刚输入给 ch的值。然后程序扫描标签(这里指,case 'a' :、case 'b' :等)列表,直到发现一个匹配的值为止。然后程序跳转至那一行。如果没有匹配的标签怎么办?如果有default :标签行,就跳转至该行;否则,程序继续执行在switch后面的语句。break语句在其中让程序离开switch语句,跳至switch语句后面的下一条语句。如果没有break语句,就会从匹配标签开始执行到switch末尾。例如,如果删除该程序中的所有break语句,运行程序后输入d,其交互的输出结果会执行从case 'd':到switch语句末尾的所有语句。
switch (ch)
{
case 'a':
printf("argali, a wild sheep of Asia\n");
break;
case 'b':
printf("babirusa, a wild pig of Malay\n");
break;
case 'c':
printf("coati, racoonlike mammal\n");
break;
case 'd':
printf("desman, aquatic, molelike critter\n");
break;
case 'e':
printf("echidna, the spiny anteater\n");
break;
case 'f':
printf("fisher, brownish marten\n");
break;
default:
printf("That's a stumper!\n"); } /* switch结束 */
指针辅助理解程序示例:
#include <stdio.h>
void interchange(int * u, int * v);
int main(void)
{int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); // 把地址发送给函数,该函数传递的不是x和y的值,而是它们的地址。这意味着出现在interchange()原型和定义中的形式参数u和v将把地址作为它们的值。因
此,应把它们声明为指针。
printf("Now x = %d and y = %d.\n", x, y);
return 0; }
void interchange(int * u, int * v)
{int temp;
temp = *u; // temp获得 u 所指向对象的值,u的值是&x,所以u指向x。这意味着用*u即可表示x的值,
*u = *v;
*v = temp; }
指针加一辅助理解程序示例:
#include <stdio.h>
#define SIZE 4
int main(void)
{short dates[SIZE];
short * pti;
short index;
double bills[SIZE];
double * ptf;
pti = dates; // 把数组地址赋给指
ptf = bills;
printf("%23s %15s\n", "short", "double");
for (index = 0; index < SIZE; index++)
printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
return 0; }
在C中,指针加1指的是增加一个存储单元。对数组而言,这意味着把加1后的地址是下一个元素的地址,而不是下一个字节的地址。在指针前面使用运算符可以得到该指针所指向对象的值。指针加1,指针的值递增它所指向类型的大小(以字节为单位)。
dates + 2 == &date[2] // 相同的地址(dates + 2) == dates[2]` // 相同的值
编写一个处理数组的函数示例:
阐明包含数组元素个数的信息。第一种方法:在函数代码中写上固定的数组大小
int sum(int * ar) // 相应的函数定义,对应的函数原型
{
int i;
int total = 0;
for (i = 0; i < 10; i++) // 假设数组有10个元素
total += ar[i]; // ar[i] 与 *(ar + i) 相同
return total; }
sum()从该参数获得了什么信息?它获得了该数组首元素的地址,知道要在该位置上找出一个整数。
第二种:
int sum(int * ar, int n) // 更通用的方法
{int i;
int total = 0;
for (i = 0; i < n; i++) // 使用 n 个元素
total += ar[i]; // ar[i] 和 *(ar + i) 相同
return total; }
只有在函数原型或函数定义头中,才可以用int ar[]代替int * ar。int *ar形式和int ar[]形式都表示ar是一个指向int的指针。
声明数组形参
- 因为数组名是该数组首元素的地址,作为实际参数的数组名要求形式参数是一个与之匹配的指针。只有在这种情况下,C才会把int ar[]和int * ar解释成一样。也就是说,ar是指向int的指针。由于函数原型可以省略参数名,所以下面4种原型都是等价的:
int sum(int *ar, int n); int sum(int *, int); int sum(int ar[], int n); int sum(int [], int);
但是,在函数定义中不能省略参数名。下面两种形式的函数定义等价:
int sum(int *ar, int n); int sum(int ar[], int n);
函数s_geats:去掉fgets()末尾的换行符
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}
结构辅助理解程序
//* book.c -- 一本书的图书目录 */
#include <stdio.h>
#include <string.h>
char * s_gets(char * st, int n);
#define MAXTITL 41 /* 书名的最大长度 + 1 */
#define MAXAUTL 31 /* 作者姓名的最大长度 + 1*/
struct book { /* 结构模版:标记是 book */
char title[MAXTITL];
char author[MAXAUTL];
float value;
}; /* 结构模版结束 */
int main(void)
{
struct book library; /* 把 library 声明为一个 book 类型的变量 */
printf("Please enter the book title.\n");
s_gets(library.title, MAXTITL); /* 访问title部分*/
printf("Now enter the author.\n");
s_gets(library.author, MAXAUTL);
printf("Now enter the value.\n");
scanf("%f", &library.value);
printf("%s by %s: $%.2f\n", library.title,library.author, library.value);
printf("%s: \"%s\" ($%.2f)\n", library.author,library.title, library.value);
printf("Done.\n");
return 0;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)// 如果地址不是 NULL
{
find = strchr(st, '\n'); // 查找换行符
if (find) // 如果地址不是 NULL,
*find = '\0'; // 在此处放置一个空字符
else
while (getchar() != '\n')
continue; //处理输入行中剩余的字符
}
return ret_val;
}
素数判断:
int isPrime(int )
int isPrime(int n)
{
int div,i;
for (div = 2; (div * div) <= n; div++)
{
if (n % div == 0)
{
i++;
break;
}
}
if(i)
return 0;
else
return 1;
}
冒泡排序示例:
int ch,i1,i;
for(i=0;i<(n-1);i++)
{
for(i1=0;i1<(n-1-i);i1++)
{
if(a[i1]>a[i1+1])
{
ch=a[i1];
a[i1]=a[i1+1];
a[i1+1]=ch;
}
}
}
插入排序示例
void InsertSort(int a[],int n)
{
int i,i1,i2,i3,i4,ch;
for(i1=1;i1<n;i1++)//
{
for(i2=0;i2<i1;i2++)//bidaxaio
{
if(a[i1]<a[i2])
{
ch=a[i1];
for(i3=(i1-1);i3>=i2;i3--)
a[i3+1]=a[i3];
a[i2]=ch;
}
}
for(i4=0;i4<(n-1);i4++)
printf("%d ",a[i4]);
printf("%d\n",a[n-1]);
}
}
选择排序示例:
void selectSort(int data[],int elementCount)
{
int i,i1,ch;
for(i=0;i<(elementCount)-1;i++)
{
i1=findMin(data,i,elementCount-1);
ch=data[i];
data[i]=data[i1];
data[i1]=ch;
}
outputData(data,elementCount);
}
int findMin(int data[], int startLoc, int endLoc)
{
int i,i1;
int minn=data[startLoc];
for(i=startLoc;i<=endLoc;i++)
{
int i2=0;
for(i1=startLoc;i1<=endLoc;i1++)
{
if(data[i]>data[i1])
i2++;
}
if(i2==0)
{
return i;
}
}
}
void outputData(int data[],int elementCount)//
{
int i;
for( i = 0 ; i < elementCount - 1 ; i++ )
printf( "%d " , data[i] ) ;
printf( "%d\n" , data[i] ) ;
}
两个正整数的最大公约数:
- 基于欧几里得算法。两个数的乘积等于它们的最大公约数与最小公倍数的乘积。
#include<stdio.h>
int GCD(int a , int b );
int main()
{
int a , b ;
scanf("%d%d", &a , &b );
printf( "%d\n" , GCD( a, b ) ) ;
return 0 ;
}
int GCD(int a , int b )
{
if(a>=b)
{
if(a%b==0)
return b;
else
return GCD(b,a%b);
}
else
{
if(b%a==0)
return a;
else
return GCD(a,b%a);
}
}

浙公网安备 33010602011771号