C exercises

This article records my process of learning C.

不使用第三个变量达到交换两个变量值的目的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
int main(void)
{
int a,b;
//Enter a and b:
scanf("%d %d",&a,&b);
printf("a=%d b=%d\n",a,b);
/*********Begin*********/
a = a+b;
b = a - b;
a = a - b;

/*********End**********/
printf("a=%d b=%d\n",a,b);
return 0;
}

result:
input: 1 2
a=1 b=2
a=2 b=1

数字分离

输入一个三位数,分别求出x的各位数字,十位数字,百位数字的值。

思路:可以用数组!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int i;
char str[3];
scanf("%s", &str);
for (i = 0; i < 3; i++)
{
printf("%c ", str[i]);
}
/*********End**********/
return 0;
}

实数除法保留小数部分

1
2
double ave
ave = (float)23/2

求最大公约数

1
2
3
4
5
6
while (m % min != 0 || n % min != 0)
{
min--;
}

printf("最大公约数是:%d\n", min);

字符串中各类字符数的统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(void)
{
/*********Begin*********/
char test[100], c;
int ea = 0, num = 0, sp = 0, oth = 0, len, i;
scanf("%[^\n]", &test); //注意:scanf里面用%s不能接收字符窜中的空格,空格以后会被截断,用正则即可解决。
len = strlen(test);

for (i = 0; i < len; i++)
{
if (isdigit(test[i]))
{
num++;
}
else if (isalpha(test[i]))
{
ea++;
}
else if (test[i] == 32)
{
sp++;
}
else
{
oth++;
}
}

printf("%d %d %d %d", ea, num, sp, oth);

/*********End**********/
return 0;
}

求各位数字之积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int num, sum = 1;
scanf("%d", &num);

while (num)
{
sum *= num % 10;
num /= 10;
}

printf("%d", sum);
/*********End**********/
return 0;
}

将十个数进行从大到小的顺序进行排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int i, j, a[10];
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}

for (i = 9; i > 0 ; i--)
{
for (j = 0; j < 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 (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
/*********End**********/
return 0;
}

打印杨辉三角(以空格分隔整数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a[10][10], i, j;
for (i = 0; i < 10; i++)
{
a[i][i] = 1;
a[i][0] = 1;
}
for (i = 2; i < 10; i++)
{
for (j = 1; j < i; j++)
{
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}

for (i = 0; i < 10; i++)
{
for (j = 0; j <= i; j++)
{
printf("%d", a[i][j]);
if (i != j)
{
printf(" "); //保证每行最后一个数字后面没有空格
}
}
printf("\n");
}



/*********End**********/
return 0;
}

字符逆序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
int main(void)
{
/*********Begin*********/
char a[200];
int i=0,j=0,t=0,k;
scanf("%s",a);
while(a[i]!='\0'){ //important
i++;
j++;
}
for(i=0,k=j-1;i<k;i++,k--){
t=a[i];
a[i]=a[k];
a[k]=t;
}
for(i=0;i<=j;i++)
printf("%c",a[i]);


/*********End**********/
return 0;
}

字符串统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#include <string.h>
int main(void)
{
/*********Begin*********/
char a[100];
int i, j, pos = 0;
int str_len, word_len, max_word_len;

while(1) {
str_len = word_len = max_word_len = 0;

fgets(a, 100, stdin);//fgets函数的用法

if (strlen(a) <= 1)//输入的字符只有一个的情况
continue;
if (strlen(a) < 99) //remove '\n'
a[strlen(a)-1] = 0;

if(strncmp(a,"stop", strlen("stop"))==0)
break;
for(i = 0; a[i] !='\0'; i++) {
if(a[i] != ' ') {
word_len++;
str_len++;
continue;
}
if (word_len > max_word_len) {
max_word_len = word_len;
pos = i - word_len;
}
word_len = 0;
}
if (word_len > max_word_len) {
max_word_len = word_len;
pos = i - word_len;
}

printf("%d ", str_len);
for (i = pos; i < pos + max_word_len; i++)
printf("%c", a[i]);
putchar(10);
}

/*********End**********/
return 0;
}

输出若干个学生成绩中的最高分.要求用指针函数实现

输入

第一行为整数n,代表学生的数量。

第二行为n个学生的成绩,n个整数之间用一个空格隔开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>
/*********Begin*********/
int *maxn(int, int array[]);

int *maxn(int n, int array[])
{
int max, i;
int *p;
max = array[0];
for (i = 1; i < n; i++)
{
if (array[i] > max)
{
max = array[i];
}

}
p = &max;

return p;

}

/*********End**********/
int main(void)
{
int n,s[110];
int *p;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
int ans;
/*********Begin*********/
p = maxn(n, s);
ans = *p;
/*********End**********/
printf("%d",ans );
return 0;
}

最小公倍数求法

1
a / 最大公约数 * b

使用 long long int 注意点

1
2
long long int a;
printf("%lld", a);

用递归求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
long long solve(long long n){
/*********Begin*********/
if(n ==1)
{
return 1;
}
else
{
return n * solve(n-1);
}

/*********End**********/
}
int main(void)
{
long long n;
scanf("%lld",&n);
long long ans=0;
for(long long i=1;i<=n;i++)
ans+=solve(i);
printf("%lld", ans);
return 0;
}

读取a.txt中文本,统计文本中字母数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
int n, k;
char a[100];
k = 0;
FILE *fp;
fp = fopen("a.txt","r");
for (n = 0; n < 100; n++)
{
if (feof(fp))
{
break;
}

fscanf(fp, "%c", &a[n]);
if (a[n] == '\0')
{
break;
}

if (a[n]>='A' && a[n] <= 'Z' || a[n]>='a' && a[n] <= 'z')
{
k++;
}
}

printf("%d", k);

fclose(fp);

return 0;
}

读取文件中指定学生信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
#include<string.h>
extern void solve();
int main(void)
{
FILE *f=fopen("a.txt","w");
fprintf(f, "%s\n", "11405200101 zhangsan 70 80 90 2140 80");
fprintf(f, "%s\n", "11405200102 lisi 80 60 70 210 70");
fprintf(f, "%s\n", "11405200103 lisasdsi 80 10 70 220 70");
fprintf(f, "%s\n", "11405200104 liassi 80 60 70 240 70");
fprintf(f, "%s\n", "11405200105 lzissssi 80 30 76 210 70");
fprintf(f, "%s\n", "11405200106 lisgsi 80 50 70 210 70");
fprintf(f, "%s\n", "11405200107 lizssi 80 67 70 280 76");
fprintf(f, "%s\n", "11405200108 lisqsi 80 60 70 210 70");
fprintf(f, "%s", "11405200109 lisdssi 80 67 70 210 70");
fclose(f);
char s[100];
scanf("%s",&s);
solve(s);
return 0;
}

void solve(char s[]) {
FILE *fq = fopen("a.txt", "r");
int n;
char line[20], a[100];
for (n = 0; n < 9; n++) {
fgets(line, 12, fq);
fgets(a, 100, fq);
if (strcmp(s, line) == 0) {
printf("%s %s", line, a);
fclose(fq);
break;
}
if (n == 8) {
printf("Not Found!");
}
}
}

Author

OnlyourMiracle

Posted on

2022-05-30

Updated on

2023-12-30

Licensed under

Comments