xdoj
用于复习
字符串数组练习
处理字符串
问题描述
从键盘输入一个字符串,将该字符串按下述要求处理后输出:
将ASCII码大于原首字符的各字符按原来相互间的顺序关系集中在原首字符的左边,
将ASCII码小于等于原首字符的各字符按升序集中在原首字符的右边。
输入说明
输入一行字符串,字符串c不长度超过100.
输出说明
输出处理后的一行字符串
输入样例
aQWERsdfg7654!@#$hjklTUIO3210X98aY
输出样例
sdfghjkla!#$0123456789@EIOQRTUWXYa
#include<stdio.h>
#include<string.h>
int main()
{
char c[100], left[100], right[100],string[100];
int i, j,k,l;
char t;
void sort(char* str, int n);
gets_s(c, 100);
t = c[0];
for (i = 1, j = 0, k = 0; i < strlen(c); i++)
{
if (c[i] > t)
left[j++] = c[i];
else
right[k++] = c[i];
}
sort(right, k);
for (i = 0, l = 0; i < j; i++)
string[l++] = left[i];
string[l++] = t;
for (i = 0; i < k; i++)
string[l++] = right[i];
string[l] = '\0';
puts(string);
}
void sort(char* str, int n)
{
int i, j;
char t;
for (i = 1; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
if (str[j] > str[j + 1])
{
t = str[j];
str[j] = str[j + 1];
str[j + 1] = t;
}
}
}
}
寻找最长的行
问题描述
寻找若干行文本中最长的一行
输入说明
输入为多个字符串(每个字符串长度不超过100个字符),每个字符串占一行,输入的行为“end”时表示输入结束
输出说明
输出其中最长的一行长度后换行再输出最长行的内容,如果最长行不止一个,则输出其中的第一行。
输入样例
abce
abdf dlfd
***end***
输出样例
9
abdf dlfd
#include<stdio.h>
#include<string.h>
int main()
{
char s[100], end[100];
int len, max;
gets_s(s, 100);
strcpy(end, s);
max = strlen(s);
while (strcmp(s, "***end***"))
{
gets_s(s, 100);
len = strlen(s);
if (len > max)
{
max = len;
strcpy(end, s);
}
}
printf("%d\n", max);
puts(end);
}
字符串压缩
问题描述
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,将采用该压缩方法得到的字符串解压缩,还原出原字符串并输出。
输入说明
输入数据为一个字符串(长度不大于50,只包含字母和数字),表示压缩后的字符串
输出说明
在一行上输出解压缩后的英文字符串(长度不超过100),最后换行。
输入样例
a5b3aba13b4
输出样例
aaaaabbbabaaaaaaaaaaaaabbbb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char a[50],ch;
int i,j,num;
num = 0;
gets_s(a, 50);
for (i = 0; i < strlen(a); i++)
{
if (isalpha(a[i]))
{
ch = a[i];
putchar(ch);
num = 0;
}
else
{
num = num * 10 + (a[i]-'0');
if (isdigit(a[i + 1]))
continue;
else
{
for (j = 0; j < num-1; j++)
putchar(ch);
}
}
}
}
一维二维数组练习
0-1矩阵
问题描述
查找一个只包含0和1的矩阵中每行最长的连续1序列。
输入说明
输入第一行为两个整数m和n(0<=m,n<=100)表示二维数组行数和列数,其后为m行数据,每行n个整数(0或1),输入数据中不会出现同一行有两个最长1序列的情况。
输出说明
找出每一行最长的连续1序列,输出其起始位置(从0开始计算)和结束位置(从0开始计算),如果这一行没有1则输出两个-1,然后换行。
输入样例
5 6
1 0 0 1 1 0
0 0 0 0 0 0
1 1 1 1 1 1
1 1 1 0 1 1
0 0 1 1 0 0
输出样例
3 4
-1 -1
0 5
0 2
2 3
#include<stdio.h>
int main()
{
int n, m, num[100][100],i,j;
int start, end, * p1 = &start, * p2 = &end;
void find(int* n, int len, int* p1, int* p2);
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
scanf("%d", &num[i][j]);
}
for (i = 0; i < n; i++)
{
find(num[i], m, p1, p2);
printf("%d %d\n", start, end);
}
}
void find(int* n, int len, int* p1, int* p2)
{
int i, count, max;
for (i = 0,count=0,max=0; i < len; i++)
{
if (i != len - 1)
{
if (n[i] == 1)
count++;
else
{
if (count > max)
{
max = count;
count = 0;
*p1 = i - max;
*p2 = i - 1;
}
}
}
else
{
if (n[i] == 1)
{
count++;
if (count > max)
{
max = count;
*p1 = i-max+1;
*p2 = i;
}
}
else
{
if (count > max)
{
max = count;
*p1 = i - max;
*p2 = i-1;
}
}
}
}
if (max == 0)
{
*p1 = -1;
*p2 = -1;
}
}
等差数列
问题描述
请写一个程序,判断给定整数序列能否构成一个等差数列。
输入说明
输入数据由两行构成,第一行只有一个整数n(n<100),表示序列长度(该序列中整数的个数);
第二行为n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。
输出说明
对输入数据进行判断,不能构成等差数列输出“no”,能构成等差数列输出表示数列公差(相邻两项的差)的绝对值的一个整数。
输入样例
样例1输入
6
23 15 4 18 35 11
样例2输入
5
2 6 8 4 10
输出样例
样例1输出
no
样例2输出
2
#include<stdio.h>
int main()
{
int n, num[100], i,delta,flag=1;
void sort(int* n, int l);
scanf("%d", & n);
for (i = 0; i < n; i++)
scanf("%d", &num[i]);
sort(num, n);
delta = num[1] - num[0];
for (i = 2; i < n; i++)
{
if (delta != num[i] - num[i - 1])
flag = 0;
}
if (flag)
printf("%d", delta);
else
printf("no");
}
void sort(int* n, int l)
{
int i, j, t;
for (i = 1; i < l; i++)
{
for (j = 0; j < l - i; j++)
{
if (n[j] > n[j + 1])
{
t = n[j];
n[j] = n[j + 1];
n[j + 1] = t;
}
}
}
}
马鞍点
问题描述
若一个矩阵中的某元素在其所在行最小而在其所在列最大,则该元素为矩阵的一个马鞍点。
请写一个程序,找出给定矩阵的马鞍点。
输入说明
输入数据第一行只有两个整数m和n(0<m<100,0<n<100),分别表示矩阵的行数和列数;
接下来的m行、每行n个整数表示矩阵元素(矩阵中的元素互不相同),整数之间以空格间隔。
输出说明
在一行上输出马鞍点的行号、列号(行号和列号从0开始计数)及元素的值(用一个空格分隔),之后换行;
若不存在马鞍点,则输出一个字符串“no”后换行。
输入样例
4 3
11 13 121
407 72 88
23 58 1
134 30 62
输出样例
1 1 72
输入样例
2 2
1 1
1 1
输出样例
no
#include<stdio.h>
int main()
{
//end用于确定马鞍点,t暂存最大最小值,index为最大最小值对应的横/纵坐标
int n, m, i, j, num[100][100], end[100][100] = {
0}, t,index,flag=0;
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
scanf("%d", &num[i][j]);
}
//比较每列的数
for (i = 0; i < n; i++)
{
t = num[i][0];
index = 0;
//flag用于确认有无最小值eg:(1,1,1,1)
flag = 0;
for (j = 0; j < m; j++)
{
if (num[i][j] < t)
{
t = num[i][j];
index=j;
flag = 1;
}
}
//将num中最小值所在位置对应于end的数加一
if(flag)
end[i][index]++;
}
//比较每行的数
for (j = 0; j < m; j++)
{
t = num[0][j];
index=0;
flag=0;
for (i = 0; i < n; i++)
{
if (num[i][j] > t)
{
t = num[i][j];
index = i;
flag=1;
}
}
//将num中最大值所在位置对应于end的数加一,也就是说end中为2的位置就是num的马鞍点
if(flag)
end[index][j]++;
}
//这里flag用于判断有无马鞍点
flag = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (end[i][j] == 2)
{
flag = 1;
printf("%d %d %d", i, j, num[i][j]);
}
}
}
if (flag == 0)
printf("no");
}
指针练习
成绩处理
描述
输入5个学生,4门课成绩,二维数组stu表示,行标表示学生,列标表示课程成绩.
使用指针完成地址传递,主函数完成数组输入和输出。
分别编写函数aver()、fals()和well()完成:
-
求第一门课的平均分;
-
统计有2门以上课程不及格的同学人数;
-
平均成绩在90分以上或者全部课程成绩在85分以上的同学视为优秀,统计人数,
输入说明
输入二维浮点型数组stu
输出说明
输出第一门课程平均分(保留1位小数)、2门以上不及格人数和成绩优秀人数,数据之间空一格。
输入样例
85 73 59 92
93 95 89 88
86 88 88 87
59 51 52 68
78 32 59 91
输出样例
80.2 2 2
#include<stdio.h>
int main ()
{
float stu[5][4];
int i,j;
float aver(float (*n)[4]);
int fals(float (*n)[4]);
int well(float (*n)[4]);
//二维数组输入
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
scanf("%d",&stu[5][4]);
}
//输出
printf("%.1f %d %d",aver(stu),fals(stu),well(stu));
return 0;
}
//(*n)[列数]是二维数组传参形式
float aver(float (*n)[4] )
{
int i;
//sum为总分,av为平均分
float sum=0,av;
for (i = 0; i < 5; i++)
sum += *(n + i)[0];
av = sum / 5;
return av;
}
int fals(float(*n)[4])
{
//num为每个人低于60的个数,sum为人数
int i, j, num = 0, sum = 0;
float* p =& n[0][0];
//用p++是考虑到二维数组在我们考虑来是二维的,但是在内存中是一个连续的空间储存的
for (i = 0; i < 5; i++)
{
for (j = 0; j < 4; j++)
{
if (*p < 60)
num++;
p++;
}
if (num >= 2)
sum++;
num = 0;
}
return sum;
}
int well(float(*n)[4])
{
//num是每人大于85的个数,sum是每人的总分,end是符合条件的人数
int i, j, num = 0, sum = 0,end=0;
float* p = &n[0][0];
for (i = 0; i < 5; i++)
{
for (j = 0; j < 4; j++)
{
sum += *p;
if (*p >= 85)
num++;
p++;
}
if (sum >= 360 || num == 4)
end++;
sum = 0;
num = 0;
}
return end;
}
元素放置
描述
-
定义一个一维整形数组num[50],输入正整数m、n(2≤m≤n≤7),输入一个m*n整形矩阵(值小于100)
-
编写函数place()完成矩阵元素S型放置,从小到大排列
-
使用指针完成地址传递,主函数完成数组输入和输出。
输入说明
输入正整数m和n(2≤m≤n≤7),输入一个m*n整形矩阵,含m*n个元素(值小于100)。
输出说明
格式输出:按行输出处理后的矩阵,S型排列,%3d,每行换行,最后一行不换行。
输入样例
3 3
15 14 21 34 22 37 40 16 50
输出样例
16 15 14
21 22 34
50 40 37
提示
使用指针作形参,实现地址传递,S型排列,%3d,每行换行,最后一行不换行。
#include<stdio.h>
int main()
{
int n, m, num[50],s[7][7], i, j;
void sort(int* num, int n);
void place(int* num, int n, int m,int(*s)[7]);
scanf("%d %d", &n, &m);
//虽然要求输入一个矩阵,但我觉得木的必要pia><!
for (i