1.冒泡排序
#include<stdio.h>
#define MAXN 10
void swap(int* px, int* py) {
int t;
t = *px;
*px = *py;
*py = t;
}
void bubble(int a[], int n) /*n是数组a中待排序的元素的数量*/
{
int i, j;
for (i = 1; i < n; i++) {
for (j = 0; j < n - i; j++) {
if (a[j] > a[j + 1]) {
swap(&a[j], &a[j + 1]);/*要通过函数调用来改变主调函数中某个变量的值,可以把指 针作为函数的参数。在主调函数中,将该变量的地址或者指向该变量的指针作为实参。在被调函数中,用指针类型形参接收该变量的地址,并改变形参所指向的变量的值。*/
}
}
}
}
int main() {
int i, n,a[MAXN];
printf("enter n:");
scanf("%d", &n);
printf("enter %d numbers:",n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
bubble(a, n);/*声明的函数里的形参是数组,则在调用该函数是,传入的参数就填数组名*/
printf("after sorted:");
for (i = 0; i < n; i++) {
printf("%d", a[i]);
}
return 0;
}
2.选择排序
#include<stdio.h>
void swap(int* px, int* py) {
int t;
t = *px;
*px = *py;
*py = t;
}
void select(int a[],int n) {
int i, j, min;
for (i = 0; i < n-1; i++) {
min = i;
for (j = i+1; j < n; j++) {
if (a[j] < a[min]) {
min = j;
}
}
swap(&a[i], &a[min]);
}
}
int main() {
int n,i;
int a[10];
printf("enter n:");
scanf("%d", &n);
printf("enter numbers:");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
select(a, n);
printf("after sorted:");
for (i = 0; i < n; i++) {
printf("%d", a[i]);
}
return 0;
}
3.二分查找法 。设已有一个n(1<=n<=10)个元素的整型数组a,且按值从小到大有序排列。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则输出“not found”。
#include<stdio.h>
int half_found(int *s,int t,int n) {
int mid, low, high;
low = 0;
high = n - 1;
while (low <= high) { /*当low>high时,退出循环*/
mid = (low + high);
if (t == s[mid]) {
return mid;
}
else if (t < s[mid]) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
if (low > high) {
return 0;
}
}
int main() {
int s[10] = { 0,1,2,3,4,5,6,7,8,9 };
int t;
printf("enter t:");
scanf("%d", &t);
if (half_found(s, t, 10) == 0) {
printf("not found");
}
else {
printf("%d", half_found(s, t, 10));/*用printf()输出函数的实参实现函数调用*/
}
return 0;
}
运行结果:
找到
未找到
易错提示:
对于实现计算功能的函数,函数调用通常有两种情况(以radius(int r,int h)为例):
(1)赋值语句
volume=cylinder(radius,height);
(2)输出函数的实参
printf("%f",cylinder(radius,height));
r和h是形参,主调函数的参数radius,height是实参。
4.计算两个数的和与差
#include<stdio.h>
void sum_diff(double op1, double op2, double* psum, double* pdiff) {
*psum = op1 + op2;
*pdiff = op1 - op2;
}
int main() {
double n1, n2;
double sum, diff;
printf("enter 2 numbers:");
scanf("%lf%lf", &n1, &n2);
sum_diff(n1, n2, &sum, &diff);
printf("the summery is:%lf, the difference is:%lf", sum,diff);
return 0;
}
错误注意:
5.使用函数实现字符串复制:输入一个字符串t和一个正整数m,将字符串t中从第m个字符开始的全部字符复制到字符串s中,再输出字符串s。要求自定义并调用函数void strmcpy(char *s, char *t, int m)
#include<stdio.h>
void strmcpy(char* s, char* t, int m) {
int i;
for (i = 0; t[m + i] != '\0'; i++) {
s[i] = t[m + i];
}
s[i] = '\0';
}
int main() {
char t[100], s[100];
int m;
printf("enter t:\n");
scanf("%s", t);/*格式控制字符串中使用格式控制说明%s,输入参数必须是字符型数组名。该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符'\0'送入数组中*/
printf("enter m:\n");
scanf("%d", &m);
strmcpy(s, t, m - 1);
printf("%s", s);/*格式控制字符串中相应的格式控制说明用%s,输出参数可以是字符数组名或字符串常量。输出遇'\0'结束。*/
return 0;
}
易错提示:
(1)格式控制字符串中使用格式控制说明%s,输入参数必须是字符型数组名。该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符'\0'送入数组中;
(2)格式控制字符串中相】应的格式控制说明用%s,输出参数可以是字符数组名或字符串常量。输出遇'\0'结束。
6.删除字符:输入一个字符串,再输入一个字符ch,将字符串中所有的ch字符删除后输出该字符。要求定义和调用函数delchar(s,c),该函数将字符串s中出现的所有c字符删除,试编写相应程序。
#include<stdio.h>
void delchar(char* s, char c) {
int i, j = 0;
for (i = 0; s[i] != '\0'; i++) {
if (s[i] != c) {
s[j] = s[i];
j++;
}
}
s[j] = '\0';
}
int main() {
char s[10];
char c;
printf("enter s:");
scanf("%s", s);
printf("enter c:");
getchar();/*当需要连续使用scanf()函数进行输入操作时,特别是当输入的数据类型不同(如整数和字符)时,可能需要在两个scanf()之间插入getchar()函数,以确保正确地清空输入缓冲区,从而避免潜在的问题。*/
scanf("%c", &c);
delchar(s, c);
printf("after deleted:%s",s);
return 0;
}
运行结果:
易错提示:
当需要连续使用scanf()函数进行输入操作时,特别是当输入的数据类型不同(如整数和字符)时,可能需要在两个scanf()之间插入getchar()函数,以确保正确地清空输入缓冲区,从而避免潜在的问题。
7.判断回文:判断输入的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。
#include<stdio.h>
#include<string.h>
int is_palindrome(char* s) {
int i,len;
len = strlen(s);/*strlen(s)中的参数s可以是字符数组名或字符串常量。函数strlen()返回字符串s的'\0'之前的字符个数。即字符串有效字符的个数(不包括结束符'\0')*/
for (i = 0; i < len / 2; i++) {
if (s[i] != s[len - 1 - i]) {
return 0;
}
}
return 1;
}
int main() {
char s[100];
printf("enter a string:");
scanf("%s", s);
if (is_palindrome(s) == 1) {
printf("yes");
}
else {
printf("no");
}
return 0;
}
易错提示:
strlen(s)中的参数s可以是字符数组名或字符串常量。函数strlen()返回字符串s的'\0'之前的字符个数。即字符串有效字符串的个数(不包括结束符'\0')。
8.分类统计字符个数:输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符各有多少。
#include<stdio.h>
#include<ctype.h>
void count_char(char *s) {
int i,upper=0,lower=0,space=0,digit=0,others=0;
for (i = 0; s[i] != '\0'; i++) {
if (isupper(s[i])) {
upper++;
}
else if (islower(s[i])) {
lower++;
}
else if (isspace(s[i])) {
space++;
}
else if (isdigit(s[i])) {
digit++;
}
else {
others++;
}
}
printf("big letter:%d\n", upper);
printf("small letter:%d\n", lower);
printf("blank space:%d\n", space);
printf("digital number:%d\n", digit);
printf("other characters:%d\n", others);
}
int main() {
char s[30];
printf("enter a string:");
fgets(s,sizeof(s),stdin);
count_char(s);
return 0;
}
9.循环后移:有n个整数,使前面各数顺序向后移m个位置,移出的数再从开头移入。编写一个函数实现以上功能,在主函数中输入n个整数并输出调整后的n个数。
#include<stdio.h>
#define MAXN 10
void move_elements(int a[], int n, int m) {
int temp, i, j;
for (i = 0; i < m; i++) {
temp = a[n - 1];
for (j = n - 1; j > 0; j--){
a[j] = a[j - 1];
}
a[0] = temp;
}
}
int main() {
int a[MAXN];
int m, n, i;
printf("enter m,n:");
scanf("%d %d", &m, &n);
printf("enter numbers:");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
move_elements(a, n, m);
printf("after move:");
for (i = 0; i < n; i++) {
printf("%d", a[i]);
}
return 0;
}