12月3日 前几次作业处理
2015-12-04 19:44
274 查看
11月29日作业
1.打印1到最大的n位数。
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如:输入3,则打印出1、2、3一直到最大的3位数999.
[陷阱]:这个题目很容易想到的办法就是先求出最大的数。然后循环输出就可以了。
解答:用字符串模拟(记得最后面的'\0',这个模拟可以实现大数据运算,小于某值的时候普通运算,大于某值的时候模拟)
方法一:
(2)递归太多次,有可能会栈溢出
2月1日作业
使用malloc开辟一个3*4的二维数组,并将内容初始化为1-12.
方法一:利用数组指针
1、思想:(1)程序有什么问题,
(2)执行是会发生什么问题
2、看完录屏再说
3、下面程序输出多少
因为用到压栈的知识
4、紧挨的两个scanf或许后面那个无法输入
因为scanf从输入缓存区中取字符,输出第一个后按回车会输入'\n'
代码如下:
有两种改进方法:
方法一:加fflush(stdin);
要满足一行之后再输出
6、改编电话本
1.打印1到最大的n位数。
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如:输入3,则打印出1、2、3一直到最大的3位数999.
[陷阱]:这个题目很容易想到的办法就是先求出最大的数。然后循环输出就可以了。
解答:用字符串模拟(记得最后面的'\0',这个模拟可以实现大数据运算,小于某值的时候普通运算,大于某值的时候模拟)
方法一:
#include <stdio.h> #include <string.h> int inc(char *num) { int len = strlen(num); int i = 0; int take = 0; for (i = len - 1; i >= 0; i--) { int cur_num = num[i]-'0'+take; if (i == len - 1) { cur_num++; } if (cur_num >= 10) { if (i == 0) { return 0; } else { take = 1; cur_num -= 10; num[i] = cur_num + '0'; } } else { num[i] = cur_num + '0'; break; } } return 1; } void print(const char *num) { printf("%s\n", num); int i = 0; while (num[i] == '0') { i++; } printf("%s\n", num + i); } int main() { int n = 0; scanf("%d", &n); char *num = (char *)malloc(n + 1); num = '\0'; memset(num, '0', n); while (inc(num)) { print(num); } free(num); system("pause"); return 0; }方法二:递归实现
#include <stdio.h> void print(const char *num) { printf("%s\n", num); int i = 0; while (num[i] == '0') { i++; } printf("%s\n", num + i); } void inc(char *num, int len, int i) { int j = 0; if (i == len - 1) { print(num); return; } for (j = 0; j < 10; j++) { num[i+1] = j + '0'; inc(num, len, i + 1); } } int main() { int n = 0; scanf("%d", &n); char *num = (char *)malloc(n + 1); num = '\0'; int i = 0; for (i = 0; i < 10; i++) { num[0] = i + '0'; inc(num, n, 0); } system("pause"); return 0; }附:(1)输出001时候不要前面的00,还可以用start标志位
(2)递归太多次,有可能会栈溢出
2月1日作业
使用malloc开辟一个3*4的二维数组,并将内容初始化为1-12.
方法一:利用数组指针
#include<stdio.h> #include <stdlib.h> #define COL 4 #define ROW 3 int main() { int arr[3][4]; int(*q)[4] = arr; int(*p)[4] = (int(*)[4])malloc(COL*ROW*sizeof(int)); int i = 0; int j = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { p[i][j] = 4 * i + j + 1; } } for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { printf("%d\n", p[i][j]); } } free(p); system("pause"); return 0; }方法二:将一个数组个拼接起来
#include <stdio.h> #include<stdlib.h> int main() { int **p = (int **)malloc(3 * sizeof(int *)); int i = 0; int j = 0; for (i = 0; i < 3; i++) { p[i] = (int *)malloc(4 * sizeof(int)); } for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { p[i][j] = i * 4 + j + 1; } } for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { printf("%d ", p[i][j]); } free(p[i]); } free(p); system("pause"); return 0; }教学:
1、思想:(1)程序有什么问题,
(2)执行是会发生什么问题
2、看完录屏再说
3、下面程序输出多少
#include <stdio.h> void fun() { int tmp = 0; int *p = (int *)(*(&tmp + 1)); *(p - 1) = 20; } int main() { int a = 0; fun(); printf("a = %d\n", a); system("pause"); return 0; }答案:a=20;
因为用到压栈的知识
4、紧挨的两个scanf或许后面那个无法输入
因为scanf从输入缓存区中取字符,输出第一个后按回车会输入'\n'
代码如下:
int main() { int num = 10; char ch = '\0'; scanf("%d", &num); scanf("%c", &ch); system("pause"); return 0; }结果:
有两种改进方法:
方法一:加fflush(stdin);
#include <stdio.h> #include<stdlib.h> int main() { int num = 10; char ch = '\0'; scanf("%d", &num); fflush(stdin); scanf("%c", &ch); system("pause"); return 0; }方法二:假如getchar,清空标准输入缓存区
#include <stdio.h> #include<stdlib.h> #define CLEAR_BUF() while ((c = getchar()) != '\n' && c != EOF) int main() { int num = 10; char ch = '\0'; scanf("%d", &num); int c = ' '; CLEAR_BUF(); scanf("%c", &ch); system("pause"); return 0; }5、printf输出要满足条件,不是想输出就输出
要满足一行之后再输出
6、改编电话本
相关文章推荐
- 1月15日上课笔记
- 9月20日上课笔记
- 4种方法实现文字竖向排列
- 如何设置和使用putty
- Mac一体机忘记开机密码怎么办?
- JavaScript学习(5.4):循环
- 二叉树遍历
- STM32F407定时器TIM1中断
- Git 简单使用
- JavaScript学习(5.3):条件语句
- 杭电ACM1267——下沙的沙子有几粒?
- 使用Visio画用例图没有include(包含)关系的解决办法
- 【JQuery实例】---横向纵向菜单
- GitHub第一步--生成ssh keys
- Android之取消ListView的点击效果
- Service概念性笔记1
- 一个项目的主要流程
- Oracle 表空间的状态
- 我对编程的理解
- Android TextFields