目录
#数组试题
①统计单词的平均长度
输入:若干个单词,每个单词的前后都有若干个空格隔开
输出:单词的平均长度,保留到小数点后两位
解题思路如下:
第一步:解决空格+单词共同输入的问题;既然每个单词都可能前后有若干空格如何判断输入停止?
用gets()进行输入即可,gets()表示的是一行的输入,遇到回车就结束
第二步:解决计算单词个数问题;用多重判断条件就好了,前面是空格后面不是空格单词数+1
int main() {
char arr[1000] = { 0 };
int i = 0;
gets(arr);
int num = 0;
float ret = 0.0;
float c = 0.0;
while (arr[i] != 0)
{
if (i != 0)
{
if (arr[i] == ' '){}
else if (arr[i] != ' ' && arr[i - 1] == ' ')
{
num++;
c++;
}
else
c++;
}
else
{
if (arr[i] == ' ') {}
else
{
c++;
num++;
}
}
i++;
}
ret = c / num;
printf("%.2f", ret);
}
出现的问题:
Ⅰ:若gets()输入,因为把数组元素全部初始化为0了,是否就无法用arr[i] = '\0'来作为终止判断条件?
答:有可能,所以就直接arr[i] = 0作条件。
②绝对值排序
输入:若干个整数
输出:按照绝对值降序输出整数,每个整数输出后都换行
解题思路:
第一步:解决多个整数输入进数组的问题;在未知输入数字的个数条件下,如何实现想输入多少个数就多少个?
用EOF实现。
第二步:比较绝对值的大小
第三步:排序 -> 冒泡
第四步:按顺序打印
int fab(int n)
{
int ret = 0;
if (n < 0)
return (0 - n);
return n;
}
int main()
{
int n = 0;
scanf("%d", &n);
int arr[1000] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int tmp = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (fab(arr[j]) > fab(arr[j + 1]))
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = n - 1; i >= 0; i--)
{
printf("%d\n", arr[i]);
}
return 0;
}
出现的问题:
Ⅰ:math.h库函数无法使用
答:自己写一个绝对值函数就好
③13号星期几
1900年1月1日是星期一,判断n年后的每个月13号是周一到周日周日的次数都有多少
输入:整数n,表示经过了n年 // 如1
输出:七个整数,表示是周一...周日的次数 //如1 3 1 2 2 2 4
解题思路:
第一步:判断是否是闰年 ,闰年二月多一天 //写一个闰年judge函数
第二步:判断是哪个月 // 提前设定好每个月的天数
第三步:判断当月的13号是星期几 //当月天数==13时候,总天数%7看看是多少来判断星期几
int leapYear(int n)
{
n += 1900;
if (n % 400 == 0 ||( n % 4 == 0 && n % 100 != 0))
return 1;
return 0;
}
int main()
{
int n = 0;
scanf("%d", &n);
int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int cnt[7] = { 0 };
int i = 0;
int monthday = 0;
int day = 6;
int year = 0;
if (n >= 1 && n <= 100)
{
for (year = 0; year < n; year++)
{
month[1] += leapYear(n);
for (i = 0; i < 12; i++)
{
for (monthday = 0; monthday <= month[i]; monthday++)
{
monthday = 13;
day += 13;
cnt[day % 7]++;
monthday += (month[i] - 13);
day += (month[i] - 13);
}
}
month[1] = 28;
}
}
i = 0;
for (i = 0; i < 7; i++)
{
if (i < 6)
printf("%d ", cnt[i]);
else
printf("%d", cnt[i]);
}
return 0;
}
④字符串的最小周期
输入:一个字符串
输出:字符串的最小周期
解题步骤:
#指针试题
①在数组中按顺序插入一个数字
输入:一串整型数字 / 要插入的数字
输出:插入数字后顺序排序的字符串
解题步骤:
第一步:对已有的数字进行排序 //冒泡
第二步:看看插入的数字可以拍到哪个指针位置
第三步:把位置交给插入的数字,其他数字按位后移
int main()
{
int arr[11] = { 0 };
int tmp = 0, i = 0, j = 0;
int flg = 1;
int m = 0;
int* p = arr;
//数据输入
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
scanf("%d", &m);
//冒泡排序
for (i = 0; i < 10; i++)
{
flg = 1;
for (j = 0; j < 9 - i; j++)
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flg = 0;
}
}
if (flg)
break;
}
//查找合适的位置
i = 0;
while (i < 11)
{
if (m > *p)
p++;
else
break;
i++;
}
//整体后移
for (j = 10; j > (p - arr); j--)
{
arr[j] = arr[j - 1];
}
//输出
for (i = 0; i < 11; i++)
{
printf("%d", arr[i]);
if (i != 10)
printf(" ");
else
printf("\n");
}
return 0;
}
出现的问题:
Ⅰ:平时习惯了用tmp来进行数组的数据交换,后移的突然就不会了
答:倒序赋值,从后往前,避免了中间值的产生
②指针与一维动态数组B
定义指向float类型的指针变量ptr,并根据输入的数组元素个数N从堆中申请内存,使得该动态分配的内存可以存储N个float类型的元素;然后使用如下公式给数组各个元素赋值:
x[i] = 100 * cos(i * 0.01)
数组元素赋值后,计算并输出数组元素之和。小数点后必须保留2位有效数字(四舍五入),不足补零。另外,请不要忘记释放该内存。
输入:一个整数N(1~10000)
输出:数组元素之和,保留两位小数点
解题步骤:
第一步:
第二步: