C语言经典代码练习题
1.输入一个4位数:输出这个输的个位 十位 百位 千位
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a;
printf("输入一个4位数:");
scanf("%d",&a);
printf("个位:%d\n",a%10);
printf("十位:%d\n",a%100/10);
printf("百位:%d\n",a/100%10);
printf("千位:%d\n",a/1000);
return 0;
}
2.从键盘读入两个整数,输出他们的和
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a,b;
printf("输入第一个整数:");
scanf("%d",&a);
printf("输入第二个整数:");
scanf("%d",&b);
printf("它们的和:%d\n",a+b);
return 0;
}
3.一个水分子的质量约为3.0*10^-23g,1夸脱水大约有950g,编写一个程序,要求输入水的夸脱数,然后显示这么多水中包含多少水分子。表示:3.0e-23 打印格式:%f或%e
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a;
printf("输入水的夸脱数:");
scanf("%d",&a);
printf("%d夸脱水包含%f水分子\n",a,a*950/3.0e-23);
return 0;
}
4.实现大小写转换(用getchar、putchar实现)即如果是大写字母转成小写输出如果是小写字母转为大写输出。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a=getchar();
if(65<=a&&a<=90){
putchar(a+32);
putchar(10);
}else if (a>=97&&a<=122)
{
putchar(a-32);
putchar(10);
}
return 0;
}
5.从终端输入3个整数;从大到小输出。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a, b, c;
printf("请输入三个整数:\n");
scanf("%d%d%d", &a, &b, &c);
if (a <= b)
{
int m;
m = a;
a = b;
b = m;
}
if (b >= c)
printf("%d %d %d\n", a, b, c);
else if (a >= c && c >= b)
printf("%d %d %d\n", a, c, b);
else
printf("%d %d %d\n", c, a, b);
return 0;
}
6.输入任意两个数,输出两数之间(包括这两个数)偶数之和
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a, b, c;
int sum = 0;
printf("输入任意两个数:\n");
scanf("%d%d", &a, &b);
if (a > b)
{
c = a;
a = b;
b = c;
}
for (int i = a; i <= b; i++)
{
if (i % 2 == 0)
sum += i;
}
printf("%d与%d偶数之和为%d\n", a, b, sum);
return 0;
}
7.写程序实现功能:读入两个整数(data1和data2)和一个运算符(op),计算表达式data1 op data2 的值.其中op可以为+、-、*、/四个符号中的任一种(用switch语句实现)
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a, b;
char c;
printf("输入两个整数:\n");
scanf("%d%d", &a, &b);
getchar();
printf("输入一个运算符(+、-、*、/):\n");
scanf("%c", &c);
switch (c)
{
case '+':
printf("%d%c%d=%d\n", a, c, b, a + b);
break;
case '-':
printf("%d%c%d=%d\n", a, c, b, a - b);
break;
case '*':
printf("%d%c%d=%d\n", a, c, b, a * b);
break;
case '/':
printf("%d%c%d=%d\n", a, c, b, a / b);
break;
}
return 0;
}
8.终端输入十个数,去掉其中最大值和最小值,求平均值。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[10];
int max, min;
int sum = 0;
printf("输入十个数:\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
sum += a[i];
}
for (int i = 0; i < 10; i++)
{
max = a[0];
min = a[0];
if (a[i] > max)
max = a[i];
if (a[i] < min)
min = a[i];
}
printf("sum=%d\n", sum);
printf("max=%d\n", max);
printf("min=%d\n", min);
printf("去掉最大值和最小值,平均值为:%f\n", (float)(sum - max - min) / 8);
return 0;
}
9.计算斐波那契数列前15项并逆序输出。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[15] = {1, 1};
for (int i = 2; i < 15; i++)
{
a[i] = a[i - 2] + a[i - 1];
}
for (int i = 14; i >= 0; i--)
printf("%d\n", a[i]);
return 0;
}
10.循环输入一个5位数,判断它是不是回文数。当输入0时循环结束。即12321是回文数,个位与万位相同,十位与千位相同。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a;
printf("输入一个5位数:");
while (1)
{
scanf("%d", &a);
if (a == 0)
break;
if ((a % 10 == a / 10000) && (a / 10 % 10 == a / 1000 % 10))
printf("是回文数\n");
else
printf("不是回文数\n");
printf("输入一个5位数:");
}
return 0;
}
11.输入一个字符串,大小写转换输出。
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char a[33] = {};
scanf("%s", a);
int n = strlen(a);
for (int i = 0; i < n; i++)
{
if (a[i] >= 'a' && a[i] <= 'z')
printf("%c", a[i] - 32);
else if (a[i] >= 'A' && a[i] <= 'Z')
printf("%c", a[i] + 32);
}
return 0;
}
12.冒泡排序。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[5] = {6, 5, 4, 2, 3};
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4 - i; j++)
{
if (a[j] > a[j + 1])
{
a[j] = a[j] ^ a[j + 1];
a[j + 1] = a[j] ^ a[j + 1];
a[j] = a[j] ^ a[j + 1];
}
}
}
for (int i = 0; i < 5; i++)
{
printf("%d", a[i]);
}
return 0;
}
13.选择排序。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[5] = {5, 4, 6, 9, 7};
int temp;
for (int i = 0; i < 4; i++)
{
int min = i;
for (int j = i + 1; j < 5; j++)
{
if (a[j] < a[min])
min = j;
}
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for (int i = 0; i < 5; i++)
printf("%d", a[i]);
return 0;
}
14.字符串逆序输出(两种方法实现)。
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
// 字符串逆序输出
// 法1
// char a[] = "hello world";
// char *p = a;
// int n = strlen(a);
// for (int i = n; i >= 0; i--)
// {
// printf("%c ", p[i]);
// }
char a[] = "hello world";
char *p = a + strlen(a) - 1;
for (int i = 0; i < strlen(a); i++)
{
printf("%c", *p);
p--;
}
// 法2
// char a[] = "hello world";
// char *p = a;
// int n = strlen(a);
// for (int i = 0; i < n / 2; i++)
// {
// p[i] = p[i] ^ p[n - i - 1];
// p[n - i - 1] = p[i] ^ p[n - i - 1];
// p[i] = p[i] ^ p[n - i - 1];
// }
// printf("%s", p);
// return 0;
char a[66];
gets(a);
char *p = a;
char *q = a + strlen(a) - 1;
while (p < q)
{
*p = *p ^ *q;
*q = *p ^ *q;
*p = *p ^ *q;
p++;
q--;
}
printf("%s", a);
return 0;
}
15.字符串转数字:"1234" -----> 1234(一千两百三十四)。
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
// 字符串转数字
//法1
// char a[33];
// gets(a);
// int n=strlen(a);
// int sum=0;
// int j;
// for (int i = 1; i < n; i++)
// {
// j*=10;
// }
// for (int i = 0; i < n; i++)
// {
// sum+=(a[i]-48)*j;
// j/=10;
// }
// printf("%d\n", sum);
// return 0;
//法2
char a[33];
gets(a);
char *p=a;
int n=0;
while (*p!='\0')
{
n=n*10+(*p-48);
p++;
}
printf("%d\n",n);
}
16.打印杨辉三角前十行(二维数组)。
#include <stdio.h>
int main(int argc, char const *argv[])
{
// 打印杨辉三角前十行
// 法1
// int a[10][10] = {0};
// for (int i = 0; i < 10; i++)
// {
// for (int j = 0; j <= i; j++)
// {
// if (j - 1 >= 0)
// a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
// else
// a[i][j] = 1;
// }
// }
// for (int i = 0; i < 10; i++)
// {
// for (int j = 0; j <= i; j++)
// printf("%-3d ", a[i][j]);
// printf("\n");
// }
// 法2
int a[10][10] = {};
for (int i = 0; i < 10; i++)
{
a[i][0] = 1;
a[i][i] = 1;
}
for (int i = 2; i < 10; i++)
{
for (int j = 1; j < 10; j++)
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j <= i; j++)
printf("%d ", a[i][j]);
putchar(10);
}
}
17.已知字符数组a[10]和b[10]中元素的值递增有序,用指针实现将两个数组中元素按照递增顺序输出。如:char a[10]=”acdgjmno” ; char b[10]=”befhil”;->”abcdefghijlmno”
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char a[10] = "acdgjmno";
char b[10] = "befhil";
char *p = a, *q = b;
int i = 0, j = 0;
while (i < strlen(a) && j < strlen(b))
{
if (p[i] < q[j])
{
printf("%c", p[i]);
i++;
}
else
{
printf("%c", q[j]);
j++;
}
}
if (i < strlen(a))
{
for (int k = i; k < strlen(a); k++)
printf("%c", a[k]);
}
if (j < strlen(b))
{
for (int k = j; k < strlen(b); k++)
printf("%c", b[k]);
}
return 0;
}
18.给定一串字符"I love china",实现以单词为单位的逆序,如:"china love i"
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char a[] = "i love china";
char *p = a;
int n = strlen(a);
for (int i = 0; i < n / 2; i++)
{
p[i] = p[i] ^ p[n - i - 1];
p[n - i - 1] = p[i] ^ p[n - i - 1];
p[i] = p[i] ^ p[n - i - 1];
}
char *q;
char *k=NULL, temp;
p = q = a;
while (*p != '\0')
{
while (*p == ' ' )
p++;
q = p;
while (*q != ' ' && *q != '\0')
q++;
k = q;
q = k - 1;
while (p < q)
{
temp = *p;
*p = *q;
*q = temp;
p++;
q--;
}
p = k;
}
printf("%s\n", a);
return 0;
}
19.定义求x的n次方值的函数( x是实数, n为正整数)。
#include <stdio.h>
int fun(int x, int n)
{
int r = 1;
for (int i = 0; i < n; i++)
r *= x;
printf("%d\n", r);
return r;
}
int main(int argc, char const *argv[])
{
// int r = 1;
// int x = 2;
// for (int i = 0; i < 4; i++)
// r *= x;
// printf("%d\n", r);
printf("%d\n", fun(2, 4));
}
20.编写一个函数,函数的2个参数,第一个是一个字符,第二个是一个char *,返回字符串中该字符的个数。
#include <stdio.h>
int fun(char ch, char *p) //ch=a='a', p=s
{
int n = 0;
while (*p != '\0') //*p
{
if (*p == ch)
n++;
p++; //p=p+1
}
return n;
}
int main(int argc, char const *argv[])
{
char a = 'a';
char s[32] = "abbba";
printf("%d\n", fun(a, s));
}
21.编程实现strlen函数的功能,strlen计算字符串实际长度,不包含'\0'
#include <stdio.h>
int fun(char *p)
{
int n = 0;
while (*p)
{
n++;
p++;
}
return n;
}
int main(int argc, char const *argv[])
{
char s[32] = "abbba";
int len = 0;
len = fun(s);
printf("%d\n", len);
//printf("%d\n", fun(s));
//printf("%d\n", fun("6666666"));
}
22.字符串"123"转换成整型123
#include <stdio.h>
int fun(char *p)
{
int sum = 0;
while (*p != '\0')
{
sum = sum * 10 + (*p - 48);
p++;
}
return sum;
}
int main(int argc, char const *argv[])
{
char str[32] = "123";
printf("%d\n", fun(str));
}
23.封装函数实现两数交换。
#include <stdio.h>
void fun(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main(int argc, char const *argv[])
{
int a = 10, b = 20;
fun(&a, &b);
printf("%d %d\n", a, b);
}
24.封装函数实现strcpy功能。
#include <stdio.h>
void fun(char *p, char *q)
{
while (*q != '\0')
*p++ = *q++; //*p=*q; p++; q++;
*p = '\0';
}
int main(int argc, char const *argv[])
{
char a[32] = "";
char b[32] = "hello";
fun(a, b);
printf("%s\n", a);
}
25.封装函数实现strcat功能。
#include <stdio.h>
#include <string.h>
void fun(char *p, char *q)
{
while (*p) //p=p+strlen(p);
p++;
while (*q)
*p++ = *q++;
*p = '\0';
}
int main(int argc, char const *argv[])
{
char a[32] = "hello";
char b[32] = "world";
fun(a, b);
printf("%s\n", a);
}
26.用递归函数求5的阶乘5!
#include <stdio.h>
#include <string.h>
int fac(int n) //n=5 n=4 n=3 n=2 n=1
{
if (n == 1)
return 1; //fac(1)=1
if (n > 1)
return n * fac(n - 1); //递推阶段:5*fac(4) fac(4)=4*fac(3) fac(3)=3*fac(2) fac(2)=2*fac(1)
//回归阶段:==> fac2(2)=2*1=2 ==>fac(3)=3*2=6 ==> fac(4)=4*6=24 ==>fac(5)=5*24=120
}
int main(int argc, char const *argv[])
{
int n = 5;
printf("%d\n", fac(n));
}
27.斐波那契数列:指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 求第五个数。
#include <stdio.h>
#include <string.h>
int fac(int n) //5 4
{
if (n == 1 || n == 2)
return 1;
if (n > 2)
return fac(n - 1) + fac(n - 2); //fac(5)=fac(4)+fac(3)= fac(3)+fac(2) +fac(3) = 5
}
int main(int argc, char const *argv[])
{
int n = 5;
printf("%d\n", fac(n));
}
28.创建一个名为student的结构体,包含姓名,学号,班级,从终端输入学生的信息并打印。
#include <stdio.h>
#include <string.h>
struct student
{
char name[32];
int id;
int class;
};
struct student s1;
int main(int argc, char const *argv[])
{
scanf("%s %d %d", s1.name, &s1.id, &s1.class);
printf("%s %d %d\n", s1.name, s1.id, s1.class);
}
29.typedef用法
#include <stdio.h>
#include <string.h>
//1.给普通变量重命名
typedef int size4;
//2. 给指针类型重命名
typedef int *int_p;
//3. 给数组类型重名
typedef int intArr5[5];
int main()
{
size4 a = 10; //等同于int a=10;
int_p p = &a; //等同于int *p=&a;
intArr5 arr = {1, 2, 3, 4, 5}; //等同于int arr[5]={1,2,3,4,5};
printf("%d\n", *p); //10
printf("%d\n", arr[3]); //4
}
30.创建一个描述手机的结构体叫phone, 包含品牌,型号,颜色,价格。从终端输入你自己手机的信息并打印。(用typedef)。
#include <stdio.h>
#include <string.h>
typedef struct phone
{
char brand[32];
char type[32];
char color[32];
int price;
} ph;
ph my;
int main()
{
scanf("%s %s %s %d", my.brand, my.color, my.type, &my.price);
printf("%s %s %s %d\n", my.brand, my.color, my.type, my.price);
}
31.创建一个名为student的结构体数组,包含学号,姓名,成绩,(数据类型自己定义),从终端输入学生的信息并打印分数及格的学生信息(输入3人即可)。
#include <stdio.h>
typedef struct student
{
char name[32];
int number;
int score;
} st;
int main(int argc, char const *argv[])
{
st s[3];
for (int i = 0; i < 3; i++)
scanf("%s %d %d", s[i].name, &s[i].number, &s[i].score);
for (int i = 0; i < 3; i++)
{
if (s[i].score >= 60)
printf("%s %d %d\n", s[i].name, s[i].number, s[i].score);
}
return 0;
}
32.创建一个结构体数组,数组名为book,结构体成员包含编号,书名,售价(数据类型自己设定)。写一个函数,包含两个形参,分别接收结构体数组的首地址和一个指定的售价,函数的功能为打印结构体数组中售价大于指定售价的书的信息。
#include <stdio.h>
#define N 3
typedef struct book
{
char name[32];
int id;
int price;
} BOOK; //BOOK等同于struct book
BOOK b[N] = {
{"shuihu", 1, 40},
{"zyj zhuan", 2, 200},
{"tuling zhuan", 3, 0}};
void bookPri(BOOK *p, int n)
{
for (int i = 0; i < N; i++)
{
if (p->price > n)
printf("%s %d %d\n", p->name, p->id, p->price);
p++;
}
}
int main(int argc, char const *argv[])
{
bookPri(b, 6);
return 0;
}
33.创建一个游戏英雄的结构体数组(5个元素), 结构体成员包含名称, 血量和价格。给出每个英雄信息,封装函数实现按价格从低到高打印英雄信息,(用冒泡排序)。封装函数实现修改英雄信息功能。
#include <stdio.h>
typedef struct hero
{
char name[32];
int hp;
int price;
} HERO;
void sort(HERO *p, int n)
{
HERO tmp;
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (p[j].price > p[j + 1].price)
{
tmp = p[j];
p[j] = p[j + 1];
p[j + 1] = tmp;
}
}
}
}
void change(HERO *p, int n)
{
if (n <= 3)
scanf("%s %d %d", p[n - 1].name, &p[n - 1].hp, &p[n - 1].price);
else
printf("err\n");
}
int main(int argc, char const *argv[])
{
HERO a[3] = {
{"zdl", 1, 50},
{"zyj", 999, 100},
{"xyb", 10000, 2}};
change(a, 1);
sort(a, 3);
for (int i = 0; i < 3; i++)
printf("%s %d %d\n", a[i].name, a[i].hp, a[i].price);
return 0;
}
34.封装函数实现冒泡排序。
#include <stdio.h>
void fun(int *a, int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (a[j + 1] > a[j])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
}
int main(int argc, char const *argv[])
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
fun(a, 10);
return 0;
}
35.封装函数实现如下功能:输入任意两个数,返回两数之间(包括这两个数)偶数之和。
#include <stdio.h>
int fun(int a, int b)
{
int sum = 0;
if (a >= b)
{
int t = a;
a = b;
b = t;
}
for (int i = a; i <= b; i++)
{
if (i % 2 == 0)
sum += i;
}
return sum;
}
int main(int argc, char const *argv[])
{
int a, b, sum;
scanf("%d %d", &a, &b);
sum = fun(a, b);
printf("%d\n", sum);
return 0;
}