|
【期末複習】C語言期末複習 |
一派護法 十九級 |
为了降低编译失败的次数,写好代码后我必须仔细检查代码才编译。一定要争取一次编译通过。
|
一派護法 十九級 |
#include <stdio.h>
int decompose(int num, int m[]) { int i, j, count = 0; for (i = 2; i <= num; i++) // 寻找2~num之间的质数 { // 判断i是不是质数 for (j = 2; j < i; j++) { if (i % j == 0) break; } if (i == j) { // 如果是质数 // 判断这个数是否能被这个质数整除 // 把原本的if改为while就能判断有多少个当前质数相乘 while (num % i == 0) { m[count++] = i; num /= i; } } } return count; }
void main() { int i, n, count, a[100]; scanf("%d", &n); count = decompose(n, a); printf("%d = ", n); for (i = 0; i < count; i++) { printf("%d", a[i]); if (i + 1 < count) putchar('*'); else putchar('\n'); } }
|
一派護法 十九級 |
楼上是第五章的最后一题——【15】
|
一派護法 十九級 |
由于15题比较难,所以再做一遍。
|
一派護法 十九級 |
#include <stdio.h>
int decompose(int n, int q[]) { int i, count = 0; for (i = 2; i <= n; i++) { while (n != i && n % i == 0) { q[count++] = i; n /= i; } } q[count++] = n; return count; }
void main() { int q[255], n, m, i; printf("Please input a positive integer: "); scanf("%d", &n); m = decompose(n, q); printf("m = %d\n", m); printf("%d = ", n); for (i = 0; i < m - 1; i++) printf("%d*", q[i]); printf("%d\n", q[m - 1]); } 这是经过标准答案修改过的程序。 因为在考虑2的时候已经把2的所有倍数除尽了,到了最后不能再被2整除的时候才开始考虑3 。所以4根本就不可能出现,因此也就无需一个一个地去找质数了。
|
一派護法 十九級 |
至于为什么要在while里面多加一句n!=i,主要是为了确保当输入的n为质数时,返回的数组q至少有一个元素,不至于是空数组。
|
一派護法 十九級 |
因此,这个程序还可以这样改: int decompose(int n, int q[]) { int i, count = 0; for (i = 2; i <= n; i++) { while (n % i == 0) { q[count++] = i; n /= i; } } if (count == 0) q[count++] = n; return count; }
|
一派護法 十九級 |
第五章已复习完毕。 接下来先复习简单一点的:第九章——文件。
|
一派護法 十九級 |
【9-1】 #include <stdio.h> #include <stdlib.h>
void fun(int nums[]) { int count = 0; int i; for (i = 0; count < 10; i++) { if (i % 2 == 1 && i % 3 == 1 && i % 5 == 1) nums[count++] = i; } }
void main() { int nums[10]; int i; FILE *fp; if ((fp = fopen("tmp.txt", "w")) == NULL) { printf("文件打不开。\n"); exit(0); } fun(nums); for (i = 0; i < 10; i++) { printf("%d ", nums[i]); fprintf(fp, "%d ", nums[i]); } printf("\n"); fclose(fp); } 注意fprintf不要忘了第一个参数fp。
|
一派護法 十九級 |
【9-2】 #include <stdio.h> #include <stdlib.h>
void main() { char str[100]; int i; FILE *fp; if ((fp = fopen("tmp2.txt", "w")) == NULL) { printf("文件打不开\n"); exit(0); } printf("Please enter a string:\n"); gets(str); for (i = 0; str[i] != '\0'; i++) { printf("%c(%d)", str[i], str[i]); fprintf(fp, "%c(%d)", str[i], str[i]); } printf("\n"); fclose(fp); }
|
一派護法 十九級 |
【9-3】 #include <stdio.h> #include <stdlib.h>
void main() { int num, pn = 0, nn = 0; FILE *fp; if ((fp = fopen("test.txt", "r")) == NULL) { printf("文件打不开\n"); exit(0); } while (!feof(fp)) { fscanf(fp, "%d", &num); if (num > 0) pn++; else if (num < 0) nn++; } printf("positive=%d\nnegative=%d\n", pn, nn); }
|
一派護法 十九級 |
刚才Arslanbar突然不能访问了。。。。
|
一派護法 十九級 |
【9-4】 #include <stdio.h> #include <stdlib.h>
void main() { FILE *fp1, *fp2; char ch; if ((fp1 = fopen("file1.txt", "r")) == NULL || (fp2 = fopen("file2.txt", "w")) == NULL) { printf("无法打开文件\n"); exit(0); } while (ch = fgetc(fp1), !feof(fp1)) { putchar(ch); fputc(ch, fp2); } fclose(fp1); fclose(fp2); }
|
一派護法 十九級 |
【9-5】 #include <stdio.h> #include <stdlib.h>
void main() { FILE *fp; char ch; int a = 0, b = 0; if ((fp = fopen("3.c", "r")) == NULL) { printf("文件打不开\n"); exit(0); } while (ch = fgetc(fp), !feof(fp)) { if (ch == '{') a++; else if (ch == '}') b++; } if (a == b) printf("OK!\n"); else printf("ERROR!\n"); }
|
一派護法 十九級 |
【9-6】 #include <stdio.h> #include <stdlib.h>
void main() { char filename[100]; FILE *fp; int count[26] = {0}; // 数组一定要初始化后再使用! char ch; int i; gets(filename); if ((fp = fopen(filename, "r")) == NULL) { printf("文件打不开\n"); exit(0); } while (ch = fgetc(fp), !feof(fp)) { if (ch >= 'A' && ch <= 'Z') count[ch - 'A']++; else if (ch >= 'a' && ch <= 'z') count[ch - 'a']++; } for (i = 0; i < 26; i++) { printf("%c(%c)=%4d ", 'A' + i, 'a' + i, count[i]); if ((i + 1) % 5 == 0) putchar('\n'); } putchar('\n'); fclose(fp); }
|
一派護法 十九級 |
【9-7】 输入若干个字符串排序。。。。这个挺复杂的 #include <stdio.h> #include <stdlib.h> #include <string.h>
void main() { FILE *fp; int i, j, n, min_j; char *temp; char *spaceHead; char **strlist; if ((fp = fopen("string.txt", "w")) == NULL) { printf("文件打不开\n"); exit(0); } printf("Enter number:\n"); scanf("%d", &n); strlist = (char **)calloc(n, sizeof(char *)); spaceHead = (char *)calloc(n, 100 * sizeof(char)); printf("Enter strings:\n"); gets(spaceHead); // remove the \n that follows the just input number for (i = 0; i < n; i++) { strlist[i] = spaceHead + 100 * i; gets(strlist[i]); } for (i = 0; i < n - 1; i++) { min_j = i + 1; for (j = i + 2; j < n; j++) { if (strcmp(strlist[j], strlist[min_j]) < 0) min_j = j; } if (strcmp(strlist[i], strlist[min_j]) > 0) { temp = strlist[i]; strlist[i] = strlist[min_j]; strlist[min_j] = temp; } } printf("\nThe new sequence:\n"); for (i = 0; i < n; i++) { puts(strlist[i]); fputs(strlist[i], fp); } free(spaceHead); free(strlist); fclose(fp); }
运行结果: Enter number: 8 Enter strings: Blue Pink Yellow Green Red Black White Purple
The new sequence: Black Blue Green Pink Purple Red White Yellow
-------------------------------- Process exited after 41.32 seconds with return value 0 Press any key to continue . . .
|
一派護法 十九級 |
注意,虽然puts可以在屏幕上输出换行符,但是fputs不行。。 所以要单独加一个fputc: fputs(strlist[i], fp); fputc('\n', fp);
|
一派護法 十九級 |
【9-8】 #include <stdio.h> #include <stdlib.h>
#define N 10
struct student { int id; char name[50]; int age; char address[50]; } stus[N];
void save() { FILE *fp; int i; if ((fp = fopen("stu.dat", "w")) == NULL) { printf("文件打不开\n"); exit(0); } for (i = 0; i < N; i++) fwrite(&stus[i], sizeof(stus[i]), 1, fp); fclose(fp); }
void main() { int i; printf("Please enter data of 10 students:\n"); for (i = 0; i < N; i++) { scanf("%d%s%d%s", &stus[i].id, stus[i].name, &stus[i].age, stus[i].address); } save(); }
|
一派護法 十九級 |
【9-9】 #include <stdio.h>
struct student { int id; char name[50]; int age; char address[50]; } stu;
void main() { int i; FILE *fp; if ((fp = fopen("stu.dat", "r")) == NULL) { printf("文件打不开!\n"); exit(0); } for (i = 1; i <= 9; i += 2) { fseek(fp, (i - 1) * sizeof(struct student), SEEK_SET); fread(&stu, sizeof(struct student), 1, fp); printf("%d %10s %d %s\n", stu.id, stu.name, stu.age, stu.address); } fclose(fp); } 运行结果: 201101 Lily 19 room01 201103 Sunny 21 room03 201105 John 19 room05 201107 Sunny 20 room06 201109 Joe 20 room07
-------------------------------- Process exited after 0.006697 seconds with return value 0 Press any key to continue . . .
|
一派護法 十九級 |
201101 Lily 19 room01 201103 Sunny 21 room03 201105 John 19 room05 201107 Sunny 20 room06 201109 Joe 20 room07
-------------------------------- Process exited after 0.004761 seconds with return value 0 Press any key to continue . . . 输出的时候注意要写%-10s才对!
|
一派護法 十九級 |
【9-10】 #include <stdio.h> #include <stdlib.h>
void main() { int n, sum = 0; FILE *fp; if ((fp = fopen("int.txt", "r")) == NULL) { printf("文件打不开\n"); exit(0); } while (!feof(fp)) { fscanf(fp, "%d", &n); sum += n; } fclose(fp); if ((fp = fopen("int.txt", "a")) == NULL) { printf("文件打不开\n"); exit(0); } fprintf(fp, " %d", sum); fclose(fp); }
|
一派護法 十九級 |
第九章复习完毕!
|
一派護法 十九級 |
【7-1】 #include <stdio.h> #include <stdlib.h> #include <string.h>
char *insert(char *s1, char *s2, int n) { int len1, len2; int i; char *s3; len1 = strlen(s1); len2 = strlen(s2); s3 = (char *)calloc(len1 + len2 + 1, sizeof(char)); for (i = len1; i >= n; i--) // 这里i--不要写错了 { s3[i + len2] = s1[i]; } for (i = 0; i < len2; i++) { s3[i + n] = s2[i]; } for (i = 0; i < n; i++) s3[i] = s1[i]; return s3; }
void main() { char *s1 = "abcdef"; char *s2 = "ghi"; char *s3 = insert(s1, s2, 5); // 这里不要漏写第三个参数5 puts(s3); free(s3); }
|
一派護法 十九級 |
【7-2】 这个没有用指针,所以不符合题目要求。 #include <stdio.h> #include <stdlib.h>
#define N 10
void shift(int a[], int m) { int *b, i, j; b = (int *)calloc(m, sizeof(int)); for (i = 0; i < m; i++) b[i] = a[N - 4 + i]; for (i = N - m - 1; i >= 0; i--) a[m + i] = a[i]; for (i = 0; i < m; i++) a[i] = b[i]; free(b); } void main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i; shift(a, 8); for (i = 0; i < N; i++) printf("%d ", a[i]); printf("\n"); }
|
一派護法 十九級 |
不过要用指针很简单,把所有的a[i]换成*(a+i)就行了
|
一派護法 十九級 |
【7-2】 这个没有用指针,所以不符合题目要求。 #include <stdio.h> #include <stdlib.h> #def...
这里N - 4 + i应该改成N - m + i
|
一派護法 十九級 |
改成指针: #include <stdio.h> #include <stdlib.h>
#define N 10
void shift(int a[], int m) { int *b, i, j; if (m >= N) return; b = (int *)calloc(m, sizeof(int)); for (i = 0; i < m; i++) *(b + i) = *(a + N - m + i); for (i = N - m - 1; i >= 0; i--) *(a + m + i) = *(a + i); for (i = 0; i < m; i++) *(a + i) = *(b + i); free(b); } void main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i; shift(a, 6); for (i = 0; i < N; i++) printf("%d ", a[i]); printf("\n"); }
|
一派護法 十九級 |
这是参考答案: #include <stdio.h>
void print(int *a) { int i; for (i = 0; i < 10; i++) printf("%d ", a[i]); printf("\n"); }
void shift(int *p, int m) { int i, j, t; for (i = 0; i < m; i++) { t = p[9]; for (j = 8; j >= 0; j--) p[j + 1] = p[j]; p[0] = t; print(p); } }
void main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i; shift(a, 6); }
运行结果: 10 1 2 3 4 5 6 7 8 9 9 10 1 2 3 4 5 6 7 8 8 9 10 1 2 3 4 5 6 7 7 8 9 10 1 2 3 4 5 6 6 7 8 9 10 1 2 3 4 5 5 6 7 8 9 10 1 2 3 4
-------------------------------- Process exited after 0.01482 seconds with return value 6 Press any key to continue . . .
|
一派護法 十九級 |
【文件相关函数的参数位置回忆】 FILE *fp; rewind(fp); fseek(fp, 10, 0); fputc('c', fp); fgetc(fp); fputs("sss", fp);
|
一派護法 十九級 |
#include <stdio.h>
#define N 10
void print(int *a) { int i; for (i = 0; i < 10; i++) printf("%d ", a[i]); printf("\n"); }
void shift(int *a, int m) { int i, j, temp; for (i = 0; i < m; i++) { temp = a[9]; // 注意这里不是a[0] for (j = N - 2; j >= 0; j--) a[j + 1] = a[j]; a[0] = temp; } }
void main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i; shift(a, 6); print(a); }
|