Skip to content

Commit 488f80a

Browse files
committed
[code] refactoring 21~30
1 parent abdafbf commit 488f80a

File tree

12 files changed

+584
-368
lines changed
  • 000-inc
  • 021-求解钢材切割的最佳订单
  • 022-通过指针比较整数大小
  • 023-指向数组的指针
  • 024-寻找指定元素的指针
  • 025-寻找相同元素的指针
  • 026-阿拉伯数字转换为罗马数字
  • 027-字符替换
  • 028-从键盘读入实数
  • 029-字符行排版
  • 030-字符排列

12 files changed

+584
-368
lines changed

000-inc/inc.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// 放一些辅助函数
2+
/* 头文件引入 */
3+
#pragma once
4+
#ifndef _INC_INC_H
5+
#define _INC_INC_H
6+
7+
#ifndef _INC_STDLIB
8+
#include <stdlib.h> // system, exit
9+
#endif // end #ifndef _INC_STDLIB
10+
11+
#ifdef CLS_AND_GETCH
12+
#ifndef _INC_CONIO
13+
#include <conio.h> // _getch
14+
#endif
15+
#endif // end #ifdef CLS_AND_GETCH
16+
17+
18+
/* 辅助函数定义 */
19+
20+
// 清屏
21+
void clrscr() {
22+
#ifdef CLS_AND_GETCH
23+
system("cls");
24+
#endif // end #ifdef CLS_AND_GETCH
25+
} // void clrscr()
26+
27+
// 提示按键并正常退出
28+
void quit() {
29+
#ifdef CLS_AND_GETCH
30+
printf("\n\nPress any key to quit...\n");
31+
_getch();
32+
#endif // end #ifdef CLS_AND_GETCH
33+
exit(0);
34+
} // void quit()
35+
36+
#endif // end #ifndef _INC_INC_H
Lines changed: 77 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,89 @@
1+
// 021 钢材切割
2+
/*
3+
1. 描述:编写程序,从订单中选择一组订单对钢材作切割加工,使钢材得到最佳利用。
4+
约定每一次切割会损耗固定长度的钢材(约定该值为 `DELTA=2`)。
5+
2. 输入
6+
+ 钢材总长度 `total`
7+
+ 订单数 `n`
8+
+ 各定单需要的钢材长度 `orderlen[i]`
9+
3. 输出
10+
+ 可以使钢材得到最佳利用的订单号
11+
+ 该订单需要的钢材长度
12+
4. 测试样例
13+
+ 12, 3, {5, 6, 9} => order 3 length = 9
14+
+ 28, 8, {5,6,7,8,9, 10, 12, 15}
15+
=> (1,5)+(3,7)+(7,12)
16+
=> (2,6)+(4,8)+(6,10)
17+
18+
NOTE: 程序未通过第二个测试样例,有 bug
19+
*/
120
#include <stdio.h>
21+
// #define CLS_AND_GETCH // 需要清屏+按键退出就取消此行的注释
22+
#include "../000-inc/inc.h"
23+
224
#define N 20
325
#define DELTA 2
4-
int bestlen;
26+
27+
void try(int n, int total, int bestlen);
28+
529
int bestsele[N];
630
int sele[N];
7-
int n;
831
int orderlen[N];
9-
int total;
10-
main()
11-
{
12-
int i;
32+
33+
int main() {
34+
// 最佳解用料的初值
35+
int i, n, total, bestlen = 0;
36+
1337
clrscr();
14-
printf("\n Please enter total length of the steel:\n");/* 输入钢材总长 */
15-
scanf("%d",&total);
16-
printf("\n Please enter number of order:\n"); /* 输入定单数 */
17-
scanf("%d",&n);
18-
printf("\n Please enter the orders:\n"); /* 输入各定单 */
19-
for(i=0;i<n;i++)
20-
scanf("%d",&orderlen[i]);
21-
bestlen=0; /*最佳解用料的初值 */
22-
for(i=0;i<n;i++)
23-
sele[i]=bestsele[i]=0; /*置当前选择和最佳选择初值 */
24-
try(); /* 调用函数求解 */
25-
for(i=0;i<n;i++) /* 输出结果 */
26-
if(bestsele[i])
27-
printf("order %d length = %d\n",i+1,orderlen[i]);
28-
printf("\n Press any key to quit...");
29-
getch();
38+
printf("\n Please enter total length of the steel:\n"); // 输入钢材总长
39+
scanf("%d", &total);
40+
printf("\n Please enter number of order:\n"); // 输入定单数
41+
scanf("%d", &n);
42+
printf("\n Please enter the orders:\n"); // 输入各定单
43+
for (i = 0; i < n; i++) {
44+
scanf("%d", &orderlen[i]); // 读入订单
45+
sele[i] = bestsele[i] = 0; // 置当前选择和最佳选择初值
46+
}
47+
48+
// 调用函数求解
49+
try(n, total, bestlen);
50+
51+
// 输出结果
52+
for (i = 0; i < n; i++) {
53+
if (bestsele[i]) {
54+
printf("order %d length = %d\n", i + 1, orderlen[i]);
55+
}
56+
}
57+
58+
quit();
3059
}
31-
try()
32-
{
33-
int i,len;
34-
for(len=i=0;i<n;i++) /* 求当前选中的用料量 */
35-
if(sele[i])
36-
len+=orderlen[i]+DELTA;
37-
if(len-DELTA<=total) /* 注意最后一段可能不需要切割 */
38-
{
39-
if(bestlen < len)
40-
{
60+
61+
void try(int n, int total, int bestlen) {
62+
int i, len;
63+
for (len = i = 0; i < n; i++) {
64+
/* 求当前选中的用料量 */
65+
if (sele[i]) {
66+
len += orderlen[i] + DELTA;
67+
}
68+
}
69+
70+
if (len - DELTA <= total) {
71+
/* 注意最后一段可能不需要切割 */
72+
if (bestlen < len) {
4173
/* 找到一个更好的解 */
4274
bestlen = len;
43-
for(i=0;i<n;i++)
44-
bestsele[i]=sele[i];
45-
}
46-
for(i=0;i<n;i++) /* 对所有未选定单逐一作选中尝试循环 */
47-
if(!sele[i])
48-
{
49-
sele[i]=1; /* 做选中尝试*/
50-
try();
51-
sele[i]=0;
75+
for (i = 0; i < n; i++) {
76+
bestsele[i] = sele[i];
5277
}
53-
}
54-
}
78+
}
5579

80+
for (i = 0; i < n; i++) {
81+
/* 对所有未选定单逐一作选中尝试循环 */
82+
if (!sele[i]) {
83+
sele[i] = 1; /* 做选中尝试*/
84+
try(n, total, bestlen);
85+
sele[i] = 0;
86+
}
87+
}
88+
} // enf if (len - DELTA <= total)
89+
} // end void try(int n, int total, int bestlen)
Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,39 @@
1-
main()
2-
{
3-
int x,y,z; /* 定义三个int型变量 */
4-
int *xp = &x, /* 定义指针变量xp,并赋值为x的地址,使xp指向x */
5-
*yp = &y, /* 定义指针变量yp,并赋值为y的地址,使yp指向y */
6-
*zp = &z; /* 定义指针变量zp,并赋值为z的地址,使zp指向z */
7-
int t;
8-
clrscr();
9-
printf("\nPlease input x,y,z:\n");
10-
scanf("%d%d%d",xp,yp,zp); /* 通过变量的指针,为变量输入值 */
11-
if(*xp>*yp) /* 通过指向变量的指针引用变量的值 */
12-
{
13-
t=*xp; /* 通过指向变量的指针引用变量的值 */
14-
*xp=*yp;/* 通过指向变量x的指针xp,引用变量x的值 */
15-
*yp=t; /* 通过指向变量y的指针yp,引用变量y的值 */
16-
}
17-
if(*xp>*zp) /* 通过指向变量的指针,引用变量的值 */
18-
{
19-
t=*xp; /* 通过指向变量x的指针xp,引用变量x的值 */
20-
*xp=*zp;/* 通过指向变量x的指针xp,引用变量x的值 */
21-
*zp=t; /* 通过指向变量z的指针zp,引用变量z的值 */
1+
// 022 指针比较大小
2+
/*
3+
1. 描述:使用指针比较大小并交换
4+
2. 输入:三个整数 `x,y,z`
5+
3. 输出:从小到大赋值给 x,y,z 后输出
6+
4. 测试样例
7+
+ 1 2 3 => 1 2 3
8+
+ 3 2 1 => 1 2 3
9+
*/
10+
#include <stdio.h>
11+
// #define CLS_AND_GETCH // 需要清屏+按键退出就取消此行的注释
12+
#include "../000-inc/inc.h"
13+
14+
void swap(int* px, int* py) {
15+
int tmp;
16+
if (*px > *py) { // 通过指向变量的指针引用变量的值
17+
tmp = *px;
18+
*px = *py; // 通过指向变量 x 的指针 px,引用变量 x 的值
19+
*py = tmp;
2220
}
23-
if(*yp>*zp) /* 通过指向变量的指针,引用变量的值 */
24-
{
25-
t=*yp; /* 通过指向变量的指针,引用变量的值 */
26-
*yp=*zp;/* 通过指向变量y的指针yp,引用变量y的值 */
27-
*zp=t;/* 通过指向变量z的指针zp,引用变量z的值 */
28-
}
29-
printf("x = %d\ty = %d\tz = %d\n",x,y,z);
30-
printf("\nPress any key to quit...\n");
31-
getch();
21+
}
22+
23+
int main() {
24+
int x, y, z; // 定义三个int型变量
25+
int *xp = &x, // 定义指针变量 xp,并赋值为 x 的地址,使 xp 指向 x
26+
*yp = &y,
27+
*zp = &z;
28+
29+
clrscr();
30+
printf("Please input x,y,z: ");
31+
scanf("%d%d%d", xp, yp, zp); // 通过变量的指针,为变量赋值
32+
33+
swap(xp, yp);
34+
swap(xp, zp);
35+
swap(yp, zp);
36+
printf("x = %d\ty = %d\tz = %d\n", x, y, z);
37+
38+
quit();
3239
}

023-指向数组的指针/23.c

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,45 @@
1-
int a[ ]={1,2,3,4,5};
2-
#define N sizeof a/sizeof a[0]
3-
main()
4-
{
5-
int j, /*游标变量*/
6-
*p; /*指针变量*/
1+
// 023 各种数组寻址方法
2+
/*
3+
1. 描述
4+
2. 输入
5+
3. 输出:四种数组寻址方法
6+
4. 测试样例
7+
*/
8+
#include <stdio.h>
9+
// #define CLS_AND_GETCH // 需要清屏+按键退出就取消此行的注释
10+
#include "../000-inc/inc.h"
11+
12+
#define N ( sizeof(a) / sizeof(a[0]) )
13+
14+
int main() {
15+
int j, // 游标变量
16+
*p; // 指针变量
17+
int a[] = {1, 2, 3, 4, 5};
18+
719
clrscr();
8-
for(j=0;j<N;j++)/*数组名和下标顺序访问数组的元素*/
9-
printf("a[%d]\t= %d\t",j,a[j]);
20+
for (j = 0; j < N; j++) {
21+
// 数组名和下标顺序访问数组的元素
22+
printf("a[%d]\t= %d\t", j, a[j]);
23+
}
1024
printf("\n");
11-
for(p=a;p<a+N;p++)/*让指针顺序指向数组的各元素,遍历数组*/
12-
printf("*p\t= %d\t",*p);
13-
printf("\n");/*指针与游标变量结合,改变游标变量遍历数组*/
14-
for(p=a,j=0;p+j<a+N;j++)
15-
printf("*(p+%d)\t= %d\t",j,*(p+j));
16-
printf("\n");/*指针与游标变量结合,用指针和下标遍历数组*/
17-
for(p=a+N-1,j=N-1;j>=0;j--)
18-
printf("p[-%d]\t= %d\t",j,p[-j]);
19-
printf("\nPress any key to quit...\n");
20-
getch();
25+
26+
for (p = a; p < a + N; p++) {
27+
// 让指针顺序指向数组的各元素,遍历数组
28+
printf("*p\t= %d\t", *p);
29+
}
30+
printf("\n");
31+
32+
for (p = a, j = 0; p + j < a + N; j++) {
33+
// 指针与游标变量结合,改变游标变量遍历数组
34+
printf("*(p+%d)\t= %d\t", j, *(p + j));
35+
}
36+
printf("\n");
37+
38+
for (p = a + N - 1, j = N - 1; j >= 0; j--) {
39+
// 指针与游标变量结合,用指针和下标遍历数组
40+
printf("p[-%d]\t= %d\t", j, p[-j]);
41+
}
42+
printf("\n");
43+
44+
quit();
2145
}

0 commit comments

Comments
 (0)