您的位置:首页 > 其它

12月3日     前几次作业处理

2015-12-04 19:44 274 查看
11月29日作业
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、改编电话本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  上课笔记