第11题:
答案:
#include<stdio.h>
#include<string.h>
int main()
{
char a[100];
char b[100];
int n = 0, i = 0, j = 0;
fgets(a, sizeof(a), stdin); //输入一串字符存给a
size_t len1 = strlen(a); //一开始该字符串的长度
if (len1 > 0 && a[len1 - 1] == '\n')
{
a[len1 - 1] = '\0'; //将回车符删掉
}
printf("请输入下标正整数n\n");
scanf("%d", &n);
size_t len2 = strlen(a); //删掉回车符后字符串的长度
if (n >= 0 && n < len2) //如果n<字符串的长度
{
for (i = 0; i < len2; i++) //将a数组复制给b
{
if (i != n) //如果没轮到n
{
b[j++] = a[i];
}
}
b[j] = '\0'; //最后用\0结束掉b
}
printf("数组a:%s\n", a);
printf("数组b:%s\n", b);
printf("%d\n", n);
}
知识点:
一:fgets函数:当遇见一行数据并存给数组时就用fgets函数,因为一般用while((***)!=**)来处理多组输入时,再想将这些数据一个一个存给数组,还需要一个循环(例如for),这时就会发现,不论是while里面嵌套for,还是for里面嵌套while都不能实现上述的要求。
fgets函数格式:fgets(a,b,stdin),stdin代表输入缓冲区,b代表取stdin(即输入缓冲区)的个数,a代表从stdin里面取b个元素存进的地方a。
举例:
如图可知,想将键盘输入的xbadbcjdd(共10个元素)存进数组a,但实际只存了9个,第10个元素变成了‘\0’,是因为字符串必须要有\0结尾,所以会预留一个字节的长度给\0,所以实际存的元素个数为10-1(即b-1);
注:回车键\n也会被当作普通字符存进数组a中
二:sizeof运算符生成的值的数据类型是size_t,但其实在<stddef.h>头文件中,编译器已经通过typedef声明将size_t的数据类型定义为无符号整型,所以size_t其实就是无符号整型的一个别名
第12题:
答案:
#include<stdio.h>
int main()
{
int n = 0, m = 0, i = 0, j = 0, tt[100][100] = { 0 }, pp[100] = { 0 };
printf("请输入m和n的值\n");
scanf("%d%d", &m, &n); //输入m和n的值
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &tt[i][j]); //将值赋值给二维数组
}
}
for (j = 0; j < n; j++)
{
int min = tt[0][j]; //假设每一列的第一位数为最小值(即行的下标为0)
for (i = 1; i < m; i++) //从第一位一直往下比较
{
if (tt[i][j] < min) //如果下面的数比假设的最小值小
{
min = tt[i][j]; //这个数成为新的最小值
}
}
pp[j] = min; //将这一列的最小值存到一维数组
printf("%d ", pp[j]); //打印一维数组里的数
}
return 0;
}
第13题:
答案:
#include<stdio.h>
#include<string.h>
int main()
{
char c, a[100] = { 0 };
int len1 = 0, len2 = 0, i = 0, j = 0;
fgets(a, sizeof(a), stdin); //输入一行字符
len1 = strlen(a); //包括\n的字符串长度
if (a[len1 - 1] == '\n')
{
a[len1 - 1] = '\0'; //将字符串里面的换行符\n删去
}
len2 = strlen(a); //删去\n后的字符串长度
printf("请输入字符c:\n");
scanf("%c", &c); //输入字符c
for (i = 0,j=0; i < len2; i++)
{
if (a[i] != c) //如果不是字符c
{
a[j++] = a[i]; //则再赋给a
}
}
a[j] = '\0'; //最后用\0结束a
printf("%s\n", a); //打印删去字符c的数组a
return 0;
}
跟第11题挺像的,就不多说了(第11题是删1个字符,本题是删所以相同的字符)
第14题:
答案:
#include<stdio.h>
int main()
{
int m = 0, i = 0, j = 0, max = 0;
int arr[2][100] = { 0 };
printf("请输入m的值:\n");
scanf("%d", &m); //输入m的值
for (i = 0; i < 2; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]); //将数据存进二维数组
}
}
max = arr[0][0]; //假设二维数组的第一个数为最大值
for (i = 0; i < 2; i++)
{
for (j = 0; j < m; j++)
{
if (arr[i][j] > max) //如果后面有某个数大于假设的最大值
{
max = arr[i][j]; //这个数为新的最大值
}
}
}
printf("最大值是:%d\n", max); //打印最大值
return 0;
}
第15题:
答案:
#include<stdio.h>
#include<string.h>
int main()
{
int len1 = 0, len2 = 0, i = 0, j = 0;
char a[100] = { 0 };
fgets(a, sizeof(a), stdin); //输入一行数据存给数组a
len1 = strlen(a); //包括\n的字符串长度
if (a[len1 - 1] == '\n')
{
a[len1 - 1] = '\0'; //将字符串里面的换行符\n删去
}
len2 = strlen(a); //删去\n后的字符串长度
for (i = 0,j=0; i < len2; i++)
{
if (a[i] != '*'||i==len2-1) //当不是*或者是最后一位时(因为题目是除去尾部的*不删,就相当于最后一位无论是字母还*都不删)
{
a[j++] = a[i];
}
}
a[j] = '\0'; //最后用\0结束a
printf("%s\n", a); //打印数组a
return 0;
}
跟前面两题大同小异,也不多说了