当前位置:   article > 正文

0627,0628,0629,排序,文件

0627,0628,0629,排序,文件

01:请实现选择排序,并分析它的时间复杂度,空间复杂度和稳定性

void selection_sort(int arr[], int n);

解答:

稳定性:稳定,   不稳定的,会发生长距离的交换  4         9 9 4 1    ,把第一个4换掉了

时间复杂度:比较(n-1)+(n-1)+(n-3)+……+1=n*(n/2)=O(n^2)

交换:最好情况,不交换,最坏情况O(n^2)==比较

一般情况:O(n^2)

空间复杂度:O(1)

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #define SIZE(a) (sizeof(a)/sizeof(a[0]))
  4. void selection_sort(int arr[], int n) {
  5. int max;
  6. for (int i = 0; i < n-1; i++) {
  7. //和后面的LEN-1个比较
  8. max = i;
  9. for (int j = i + 1; j < n; j++) {
  10. //max=arr[j] arr[i]<arr[j] swap
  11. if (arr[max] < arr[j]) { //相等的元素不发生交换,稳定
  12. max = j;
  13. }
  14. }
  15. //swap(arr[i], arr[max]);
  16. int temp = arr[i];
  17. arr[i] = arr[max];
  18. arr[max] = temp;
  19. }
  20. }
  21. void print_arr(int arr[], int n) {
  22. for (int i = 0; i < n; i++) {
  23. printf("%d ", arr[i]);
  24. }
  25. printf("\n");
  26. }
  27. int main(void) {
  28. int arr[] = { 2,34,12,12,34,56,78,90,899,100 };
  29. print_arr(arr, SIZE(arr));
  30. selection_sort(arr, SIZE(arr));
  31. print_arr(arr, SIZE(arr));
  32. return 0;
  33. }

答案:

  1. #define SWAP(arr, i, j) { \
  2. int tmp = arr[i]; \
  3. arr[i] = arr[j]; \
  4. arr[j] = tmp; \
  5. }
  6. void selection_sort(int arr[], int n) {
  7. for (int i = 0; i < n - 1; i++) {
  8. int minIdx = i;
  9. // 找到最小元素的索引
  10. for (int j = i + 1; j < n; j++) {
  11. if (arr[j] < arr[minIdx]) {
  12. minIdx = j;
  13. }
  14. }
  15. // 交换arr[i]和arr[j]
  16. SWAP(arr, i, minIdx);
  17. // print_array(arr, n);
  18. }
  19. }
  20. 分析:
  21. 1. 时间复杂度:O(n^2)
  22. 比较次数: (n-1) + (n-2) + ... + 1 = n(n-1)/2
  23. 交换次数:n-1
  24. 2. 空间复杂度:O(1)
  25. 不需要申请而外的数组
  26. 3. 稳定性: 不稳定
  27. 会发生长距离的交换

02:请实现冒泡排序,并分析它的时间复杂度,空间复杂度和稳定性

void bubble_sort(int arr[], int n);

解答:

稳定性:稳定,

时间复杂度:比较(n-1)+(n-1)+(n-3)+……+1=n*(n/2)=O(n^2)

交换:最好情况,不交换,最坏情况O(n^2)==比较

一般情况:O(n^2)

空间复杂度:O(1)

  1. void bubble_sort(int arr[], int n) {
  2. for (int i = 0; i < n - 1; i++) {
  3. for (int j = i + 1; j < n; j++) { //相等的元素不发生交换,稳定
  4. //如果 arr[i]<arr[j] swap
  5. if (arr[i] < arr[j]) {
  6. int temp = arr[i];
  7. arr[i] = arr[j];
  8. arr[j] = temp;
  9. }
  10. }
  11. }
  12. }

答案:

  1. void bubble_sort(int arr[], int n) {
  2. for (int i = 1; i < n; i++) { // i表示第几次冒泡
  3. bool isSorted = true;
  4. // 比较arr[j]和arr[j+1]
  5. for (int j = 0; j < n - i; j++) {
  6. if (arr[j] > arr[j + 1]) {
  7. SWAP(arr, j, j + 1);
  8. isSorted = false; // 发生交换,说明数组还未排好序
  9. }
  10. }
  11. if (isSorted) break;
  12. }
  13. }
  14. 分析:
  15. 1. 时间复杂度:
  16. 最好情况:原数组有序, O(n)
  17. 比较次数:n-1
  18. 交换次数:0
  19. 最坏情况:原数组逆序, O(n^2)
  20. 比较次数:(n-1) + (n-2) + ... + 1
  21. 交换次数:(n-1) + (n-2) + ... + 1
  22. 平均情况:O(n^2) (和插入排序的分析方法一致)
  23. 比较次数:大于等于交换的次数,小于等于 n(n-1)/2
  24. 交换次数:n(n-1)/4 (等于逆序度)
  25. 2. 空间复杂度:O(1)
  26. 不需要申请额外的数组
  27. 3. 稳定性:稳定
  28. 交换的是相邻两个元素,而且只交换逆序对。

03:请实现插入排序,并分析它的时间复杂度,空间复杂度和稳定性

void insertion_sort(int arr[], int n);

解答:

稳定性:稳定,

时间复杂度:比较(n-1)

交换:最好情况,不交换,最坏情况+(n-1)+(n-3)+……+1=n*(n/2)=O(n^2)

一般情况:O(n^2)

空间复杂度:O(1)

  1. void insertion_sort(int arr[], int n) {
  2. //第一个元素看作有序数列,从第二个元素开始插入
  3. for (int i = 1; i < n; i++) {
  4. //保留要插入的值
  5. int val = arr[i];
  6. int j = i - 1;
  7. while (j >= 0 && arr[j] > val) { //遇到相等的元素,插在后面,不进入循环
  8. arr[j + 1] = arr[j];
  9. j--;
  10. }//arr[j]<=val||j==-1
  11. arr[j + 1] = val;
  12. }
  13. }

答案:

  1. void insertion_sort(int arr[], int n) {
  2. for (int i = 1; i < n; i++) { // i:待插入元素的索引
  3. // 保存待插入的元素
  4. int value = arr[i];
  5. int j = i - 1;
  6. while (j >= 0 && arr[j] > value) {
  7. arr[j + 1] = arr[j]; // 逻辑上的交换操作
  8. j--;
  9. }
  10. // j == -1 || arr[j] <= value
  11. arr[j + 1] = value;
  12. }
  13. }

04:请实现归并排序,并分析它的时间复杂度,空间复杂度和稳定性

void merge_sort(int arr[], int n);

解答:

稳定性:稳定,

时间复杂度:O(n)

空间复杂度:O(n)

  1. int temp[N];
  2. void m_sort(int arr[], int left, int right, int mid) {
  3. //比较左边和右边区间,小的加入数组
  4. int i = left;
  5. int i_left = left; int i_right = mid+1;
  6. while (i_left <= mid && i_right <= right) {
  7. if (arr[i_left] <= arr[i_right]) { //两边相等,插左边区间进数组
  8. temp[i++] = arr[i_left++];
  9. }else{
  10. temp[i++] = arr[i_right++];
  11. }
  12. }//i_left>mid || i_right>right
  13. while (i_left <= mid) {
  14. temp[i++] = arr[i_left++];
  15. }
  16. while (i_right <= right) {
  17. temp[i++] = arr[i_right++];
  18. }//i==N
  19. for (int j = right; j>=left; j--) {
  20. arr[j] = temp[j];
  21. }
  22. }
  23. void merge_sort_help(int arr[], int left, int right) {
  24. if (left>=right) //1个0个,有序
  25. return;
  26. //排序左边区间
  27. //排序右边区间
  28. //归并
  29. //int mid = left + (right-left >> 1);
  30. int mid = (left + right) / 2;
  31. merge_sort_help(arr, left, mid);//[0,mid]
  32. merge_sort_help(arr, mid+1, right);//[mid+1,right]
  33. m_sort(arr, left, right, mid);
  34. }
  35. void merge_sort(int arr[], int n) {
  36. //外包
  37. merge_sort_help(arr, 0, n - 1);
  38. }

答案:

  1. int tmp[10];
  2. void merge(int arr[], int left, int mid, int right) {
  3. int i = left, j = left, k = mid + 1;
  4. // 两个区间都有元素
  5. while (j <= mid && k <= right) {
  6. if (arr[j] <= arr[k]) { // Caution: 不能写成 arr[j] < arr[k], 就不稳定了
  7. tmp[i++] = arr[j++];
  8. } else {
  9. tmp[i++] = arr[k++];
  10. }
  11. } // j > mid || k > right
  12. // 左边区间有元素
  13. while (j <= mid) {
  14. tmp[i++] = arr[j++];
  15. }
  16. // 右边区间有元素
  17. while (k <= right) {
  18. tmp[i++] = arr[k++];
  19. }
  20. // 将tmp数组中的元素,复制到原数组的对应区间
  21. for (int i = left; i <= right; i++) {
  22. arr[i] = tmp[i];
  23. }
  24. }
  25. void m_sort(int arr[], int left, int right) {
  26. // [left, right] 归并排序
  27. // 边界条件
  28. if (left >= right) return;
  29. // 递归公式
  30. int mid = left + (right - left >> 1);
  31. m_sort(arr, left, mid);
  32. m_sort(arr, mid + 1, right);
  33. merge(arr, left, mid, right);
  34. print_array(arr, 10);
  35. }
  36. void merge_sort(int arr[], int n) {
  37. // 委托
  38. m_sort(arr, 0, n - 1); // [0, n-1]
  39. }

05:请实现快速排序,并分析它的时间复杂度,空间复杂度和稳定性

void quick_sort(int arr[], int n);

解答:

稳定性:不稳定,

时间复杂度:最坏,O(n^2)  可以避免,
最好O(nlogn) 平均O(nlogn)

空间复杂度:栈的使用空间,O(nlogn)

  1. int partition(int arr[], int left, int right) {
  2. int pivot = arr[left];
  3. int i = left, j = right;//i下一个小于基准值的树,J下一个大于基准值的数
  4. while (j>i) {
  5. //j,J找到小于基准值的数,覆盖I的位置
  6. while (j>i&&arr[j] >= pivot) {
  7. j--;
  8. }
  9. arr[i] = arr[j];
  10. //i,i找到da于基准值的数,覆盖j的位置
  11. while (j > i && arr[i]<=pivot) {
  12. i++;
  13. }
  14. arr[j] = arr[i];
  15. }//i==j
  16. arr[i] = pivot;
  17. return i;
  18. }
  19. void q_sort(int arr[], int left, int right) {
  20. if (left >= right)
  21. return;
  22. //基准值最终位置
  23. int idx = partition(arr, left, right);
  24. //排序左边[left,idx-1]
  25. q_sort(arr, left, idx - 1);
  26. //排序右边[idx+1,right]
  27. q_sort(arr, idx + 1,right);
  28. }
  29. void quick_sort(int arr[], int n) {
  30. //外包
  31. q_sort(arr, 0, n - 1);
  32. }

答案:

  1. int partition(int arr[], int left, int right) {
  2. // 选取基准值
  3. int pivot = arr[left];
  4. // 双向分区
  5. int i = left, j = right;
  6. while (i < j) {
  7. // 移动j, 找第一个比pivot小的元素
  8. while (i < j && arr[j] >= pivot) {
  9. j--;
  10. } // i == j || arr[j] < pivot
  11. arr[i] = arr[j];
  12. // 移动i,找第一个比pivot大的元素
  13. while (i < j && arr[i] <= pivot) {
  14. i++;
  15. } // i == j || arr[i] > pivot
  16. arr[j] = arr[i];
  17. } // i == j
  18. arr[i] = pivot;
  19. return i;
  20. }
  21. void q_sort(int arr[], int left, int right) {
  22. // [left, right]
  23. // 边界条件
  24. if (left >= right) return;
  25. // 递归公式
  26. // 对[left, right]区间分区, idx是分区后基准值所在的位置
  27. int idx = partition(arr, left, right);
  28. print_array(arr, 10);
  29. q_sort(arr, left, idx - 1);
  30. q_sort(arr, idx + 1, right);
  31. }
  32. void quick_sort(int arr[], int n) {
  33. q_sort(arr, 0, n - 1); // [0, n-1]
  34. }

06:给定一个排好序的数组,请设计一个算法将数组随机打乱。

void shuffle(int arr[], int n)

解答:

  1. void shuffle(int arr[], int n) {
  2. srand(time(NULL));
  3. int j;
  4. for (int i = 0; i < n; i++) {
  5. j = rand() % (n - 1); //0-n-1
  6. int temp=arr[i];
  7. arr[i] = arr[j];
  8. arr[j] = temp;
  9. }
  10. }

答案:

好好好,和AI是一样的貌似

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define SWAP(arr, i, j) { \
  5. int tmp = arr[i]; \
  6. arr[i] = arr[j]; \
  7. arr[j] = tmp; \
  8. }
  9. #define SIZE(a) (sizeof(a) / sizeof(a[0]))
  10. void shuffle(int arr[], int n) {
  11. srand(time(NULL));
  12. for (int i = 0; i < n - 1; i++) {
  13. // [i, n-1]
  14. int j = rand() % (n - i) + i;
  15. SWAP(arr, i, j);
  16. }
  17. }
  18. void print_array(int arr[], int n) {
  19. for (int i = 0; i < n; i++) {
  20. printf("%d ", arr[i]);
  21. }
  22. printf("\n");
  23. }
  24. int main(void) {
  25. int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  26. shuffle(arr, SIZE(arr));
  27. print_array(arr, SIZE(arr));
  28. return 0;
  29. }

———————————————————————————————————————————

01:请实现堆排序,并分析它的时间复杂度,空间复杂度和稳定性

void heap_sort(int arr[], int n);

解答:

  1. void heapify(int arr[], int i ,int len) {
  2. while (i < len) { //len--
  3. int lchild = 2 * i + 1;
  4. int rchild = 2 * i + 2;
  5. int maxIdx = i;
  6. if (lchild<len && arr[lchild]>arr[maxIdx]) {
  7. maxIdx = lchild;
  8. }
  9. if (rchild<len && arr[rchild]>arr[maxIdx]) {
  10. maxIdx = rchild;
  11. }
  12. if (maxIdx == i) { break; } //调整完成
  13. SWAP(arr, i, maxIdx);//maxIdx=lchild || rchild 比原来大捏
  14. i = maxIdx;
  15. }//i>=len,maxIdx==i
  16. }
  17. void heap_build(int arr[], int n) {
  18. //2*i+1<=n-1 n>i-2>>1 挨个
  19. for (int i = n - 2 >> 1; i >= 0; i--) {
  20. heapify(arr, i, n);
  21. }//i<0
  22. }
  23. void heap_sort(int arr[], int n) {
  24. //构建大顶堆
  25. heap_build(arr, n);
  26. int len = n;
  27. while (len > 1) {
  28. //交换第一个元素和 无序区最后一个元素
  29. SWAP(arr, 0, len - 1);
  30. len--;
  31. heapify(arr, 0, len); //重新调整无序区
  32. }//len==1;
  33. }

答案:

  1. // i: 可能违反大顶堆规则的结点,并且它的左右子树都是大顶堆
  2. // n: 逻辑上堆的长度
  3. // 时间复杂度:O(logn)
  4. void heapify(int arr[], int i, int n) {
  5. while (i < n) {
  6. int lchild = 2 * i + 1;
  7. int rchild = 2 * i + 2;
  8. // 求i, lchild, rchild的最大值
  9. int maxIdx = i;
  10. if (lchild < n && arr[lchild] > arr[maxIdx]) {
  11. maxIdx = lchild;
  12. }
  13. if (rchild < n && arr[rchild] > arr[maxIdx]) {
  14. maxIdx = rchild;
  15. }
  16. if (maxIdx == i) break;
  17. SWAP(arr, i, maxIdx);
  18. i = maxIdx;
  19. }
  20. }
  21. void build_heap(int arr[], int n) {
  22. // 从后往前构建, 找第一个非叶子结点
  23. // lchild(i) = 2i+1 <= n-1
  24. // i <= (n-2)/2
  25. for (int i = n - 2 >> 1 ; i >= 0; i--) {
  26. heapify(arr, i, n);
  27. }
  28. }
  29. void heap_sort(int arr[], int n) {
  30. build_heap(arr, n); // O(n)
  31. print_array(arr, n);
  32. int len = n; // 无序区的长度
  33. while (len > 1) {
  34. // 交换堆顶元素和无序区的最后一个元素
  35. SWAP(arr, 0, len - 1);
  36. len--;
  37. heapify(arr, 0, len); // 0: 可能违反堆规则的结点,这个结点的左右子树都是大顶堆
  38. // len: 逻辑上堆的大小
  39. print_array(arr, n);
  40. } // len == 1
  41. }

02:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * struct TreeNode *left;
  6. * struct TreeNode *right;
  7. * };
  8. */
  9. bool isValidBST(struct TreeNode* root) {
  10. }

解答:

答案:

  1. struct TreeNode* max; // 记录遍历结点中的最大结点
  2. bool validate(struct TreeNode* root) {
  3. // 边界条件
  4. if (root == NULL) return true;
  5. // 验证左子树
  6. if (!validate(root->left)) return false;
  7. // 验证根结点
  8. if (max != NULL && max->val >= root->val) return false;
  9. max = root; // 将根结点设为最大结点
  10. return validate(root->right); // 验证右子树
  11. }
  12. bool isValidBST(struct TreeNode* root) {
  13. max = NULL;
  14. return validate(root);
  15. }

03:请实现下列二分查找的变种:

  1. // 查找最后一个与 key 相等的元素
  2. int binary_search1(int arr[], int n, int key);
  3. // 查找最后一个小于等于 key 值的元素
  4. int binary_search2(int arr[], int n, int key);

解答:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #define SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
  4. // 查找最后一个与 key 相等的元素
  5. int binary_search1(int arr[], int n, int key) {
  6. int left = 0;
  7. int right = n - 1;
  8. //比较,小于KEY,rigth动,大于,LEFTdong1
  9. while (left <= right) {
  10. int mid = left + (right - left >> 1);
  11. int cmp = key - arr[mid];
  12. if (cmp < 0) {
  13. right = mid - 1;
  14. }
  15. else if (cmp > 0) {
  16. left = mid + 1;
  17. }
  18. else { //后一个元素大于key,可能没有后一个元素||最后一个元素大于等于
  19. while (mid < right && arr[mid + 1] <= key) {
  20. right = mid - 1;
  21. }//mid==right || arr[mid+1]>key
  22. if (mid == right) { return mid; }
  23. else { return mid + 1; }
  24. }
  25. }
  26. return -1;
  27. }
  28. // 查找最后一个小于等于 key 值的元素
  29. int binary_search2(int arr[], int n, int key) {
  30. int left = 0;
  31. int right = n - 1;
  32. //都比key小,返回N-1,都比KEY大,-1.
  33. while (left <= right) {
  34. int mid = left + (right - left >> 1);
  35. int cmp = key - arr[mid]; // left mid right
  36. if (cmp < 0) {
  37. right = mid - 1;
  38. }
  39. else if (cmp > 0) {
  40. if (arr[left + 1] > key) { return left; }
  41. left = mid + 1;
  42. }
  43. else { //mid向right靠近
  44. while (mid <= right && arr[mid + 1] <= key) { //mid<=right arr[right]也要进行比较
  45. mid++;
  46. }//mid==right|| arr[mid+1]>key
  47. return mid;
  48. }
  49. }
  50. return -1;
  51. }
  52. int main(void) {
  53. int arr[] = { 10,20,20,20,30,30,40,50,50,50,50,60,70,100,100,100,1001,1001,1200 };
  54. //int y01=binary_search1(arr,SIZE(arr),12);
  55. int y01 = binary_search2(arr, SIZE(arr), 30);
  56. return 0;
  57. }

答案:

  1. // 查找最后一个与 key 相等的元素
  2. int binary_search1(int arr[], int n, int key) {
  3. int left = 0, right = n - 1;
  4. while (left <= right) {
  5. int mid = left + (right - left >> 1);
  6. int cmp = key - arr[mid];
  7. if (cmp < 0) {
  8. right = mid - 1;
  9. } else if (cmp > 0) {
  10. left = mid + 1;
  11. } else {
  12. if (mid == right || arr[mid + 1] > key) {
  13. return mid;
  14. }
  15. left = mid + 1;
  16. }
  17. }
  18. return -1;
  19. }
  20. // 查找最后一个小于等于 key 值的元素
  21. int binary_search2(int arr[], int n, int key) {
  22. int left = 0, right = n - 1;
  23. while (left <= right) {
  24. int mid = left + (right - left >> 1);
  25. int cmp = arr[mid] - key;
  26. if (cmp <= 0) {
  27. if (mid == right || arr[mid + 1] > key) {
  28. return mid;
  29. }
  30. left = mid + 1;
  31. } else {
  32. right = mid - 1;
  33. }
  34. }
  35. return -1;
  36. }

04:用 fread/fwrite 实现文件的复制。

  1. // copyFile.c
  2. int main(int argc, char* argv[]);​

解答:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #define SIZE(a) (sizeof(a)/sizeof(a[0]))
  4. int main(int argc, char* argv[]) {
  5. if (argc != 3) {
  6. printf("error,\n");
  7. exit(1);
  8. }
  9. //打开源文件
  10. FILE* mam = fopen(argv[1], "rb");
  11. if (!mam) {
  12. printf("error,\n");
  13. exit(1);
  14. }
  15. //打开目标文件
  16. FILE* son = fopen(argv[2], "wb");
  17. if (!son) {
  18. printf("error,\n");
  19. fclose(mam);
  20. exit(1);
  21. }
  22. //复制
  23. char buffer[75000];
  24. int n;
  25. while ((n=fread(buffer, 1, SIZE(buffer), mam)) != 0) {
  26. fwrite(buffer, 1, n, son);
  27. }
  28. fclose(mam);
  29. fclose(son);
  30. return 0;
  31. }
  32. /*
  33. 用 fread/fwrite 实现文件的复制。
  34. // copyFile.c
  35. int main(int argc, char* argv[]);​*/

答案:

  1. int main(int argc, char* argv[]) {
  2. // 打开文件流
  3. FILE* src = fopen(argv[1], "rb");
  4. if (!src) {
  5. fprintf(stderr, "Open %s failed.\n", argv[1]);
  6. exit(1);
  7. }
  8. FILE* dst = fopen(argv[2], "wb");
  9. if (!dst) {
  10. fclose(src);
  11. fprintf(stderr, "Open %s failed.\n", argv[2]);
  12. exit(1);
  13. }
  14. char buffer[4096]; // 4k, buffer的就是块的大小
  15. int n;
  16. while ((n = fread(buffer, 1, 4096, src)) > 0) { // 实际读取了n个元素
  17. fwrite(buffer, 1, n, dst);
  18. }
  19. // 关闭文件流
  20. fclose(src);
  21. fclose(dst);
  22. return 0;
  23. }

———————————————————————————————————————————

001:将一个文件读入程序,将其中的大小写字母右旋13个位置后,写入另一个文件。

[A-Ma-m] 转换成 [N-Zn-z]

[N-Zn-z] 转换成 [A-Ma-m]

其余字符不变

int main(int argc, char* argv[]) {}

解答:

  1. //请实现下面功能将一个文件读入程序,将其中的大小写字母右旋13个位置后,写入另一个文件。
  2. void right_handed(FILE* str1, FILE* str2) {
  3. //打开文件
  4. FILE* source = fopen(str1,"rb");
  5. if (!source) {
  6. perror("source\n");
  7. exit(1);
  8. }
  9. FILE* right = fopen(str2, "wb");
  10. if (!right) {
  11. perror("right\n");
  12. exit(1);
  13. }
  14. //逐字符读入,字符判断,右旋。写入目标文件
  15. int a;
  16. while ((a = fgetc(source)) != EOF) {
  17. if ((a <= 'M' && a >= 'A') || (a <= 'm' && a >= 'a')) {
  18. fputc(a+13, right);
  19. }
  20. else if ((a <= 'Z' && a >= 'N') || (a <= 'z' && a >= 'n')) {
  21. fputc(a - 13, right);
  22. }
  23. else {
  24. fputc(a, right);
  25. }
  26. }
  27. fclose(source);
  28. fclose(right);
  29. }

002:将一个文件读入程序,在每一行前面添加序号,然后写入另一个文件。如:

  1. Allen
  2. Beyonce
  3. Cindy
  4. Dianna

变成

  1. 1. Allen
  2. 2. Beyonce
  3. 3. Cindy
  4. 4. Dianna

解答:

  1. void add_num(FILE* str1, FILE* str2) {
  2. FILE* source = fopen(str1, "r");
  3. if (!source) {
  4. perror("source\n");
  5. exit(1);
  6. }
  7. FILE* add_num = fopen(str2, "w");
  8. if (!add_num) {
  9. perror("add_num\n");
  10. exit(1);
  11. }
  12. //行读取 s输出
  13. char massage1[MAXLINE];
  14. int line = 0;
  15. while (fgets(massage1, MAXLINE, source) != NULL) {
  16. line++;
  17. fprintf(add_num,"%d.%s",line,massage1);//写入字符串数组
  18. }
  19. fclose(source);
  20. fclose(add_num);
  21. }

003:然后将规范化处理的学生信息,写入新的文件 students.dat.

  1. 1 Allen f 100 100 100
  2. 2 Beyonce f 90 90 90
  3. 3 Cindy f 95 95 95
  4. 4 Dianna f 98 98 98

字段的含义分别是:学号、姓名、性别、语文、数学、英语。现在需要对分数进行规范化处理,每个同学的语文成绩需要乘以 0.85,数学成绩乘以 0.9,英语成绩乘以 0.8。然后将规范化处理的学生信息,写入新的文件 students.dat.

解答:

  1. void stu_information(FILE* str1, FILE* str2) {
  2. FILE* before = fopen(str1, "r");
  3. if (!before) {
  4. perror("before\n");
  5. exit(1);
  6. }
  7. FILE* after = fopen(str2, "w");
  8. if (!after) {
  9. perror("after\n");
  10. exit(1);
  11. }
  12. //标准化输入
  13. Stu s;
  14. while (1) { //返回转换说明的个数
  15. int n = fscanf(before, "%d%s %c%d%d%d",
  16. &s.id,
  17. s.name,
  18. &s.gender,
  19. &s.chinese,
  20. &s.math,
  21. &s.english);
  22. if (n != 6) { break; }
  23. n++;
  24. s.chinese *= 0.8;
  25. s.math *= 0.9;
  26. s.english *= 0.7;
  27. fprintf(after,"%3d %10s %2c %3d %3d %3d\n",
  28. s.id,
  29. s.name,
  30. s.gender,
  31. s.chinese,
  32. s.math,
  33. s.english);
  34. }
  35. fclose(before);
  36. fclose(after);
  37. }
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号