//编写一个程序,读入n个用户姓名和电话号码,
// 按姓名的字典顺序排列后,
// 输出用户的姓名和电话号码,n从键盘输入。
//
//样例:
//
//输入:
//
//3
//
//张 122
//
//王 233
//
//李 567
//
//输出:
//
//李 567
//
//王 233
//
//张 122
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n, flag = 0;
typedef struct phone_number
{
char last_name[10];
char number[12];
}Phone;
Phone a[10], temp;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%s%s", a[i].last_name,a[i].number);
}
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (strcmp(a[j].last_name, a[j + 1].last_name) > 0)
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < n; i++)
{
if (flag)printf("\n");
printf("%s %s", a[i].last_name, a[i].number);
flag++;
}
return 0;
}
//第一个思路就是构造二维数组,将每个人的信息区分开
//不过更推荐使用结构体(可以将不同类型的数据存放在一起)
//首先要定义结构体数据类型,再用类型去声明变量
//strcmp可以理解为ascii码相减得到返回值
//输出结构体类型的变量只能访问到成员变量输出,不可将结构体变量作为整体输出
//有n名学生,每个学生的数据包含学号、姓名、
// 三门课的成绩。可以从键盘输入n个学生的数据
// ,按总成绩从小到大排序,打印包含学号、姓名
// 、三门课成绩和总成绩的成绩单。
// (测试时,数据从键盘输入。)
//
//输入:第1行为整数n,后面n行表示n个人的信息,
// 包括学号、姓名、和三门课的成绩,每行的数据间
// 用空格隔开。
//
//输出:n行,表示n个人的信息,包括学号、姓名、
// 三门课的成绩和总成绩,数据间一个空格,
// 末尾无空格。
//
//样例:
//
//输入:
//
//2
//
//2021001 li 60 80 70
//
//2021002 wang 100 90 80
//
//输出:
//
//2021001 li 60 70 80 210
//
//2021002 wang 100 90 80 270
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n, flag = 0;
typedef struct Student
{
char number[10];
char name[10];
int scores[4];
}Student;
Student student[15];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
student[i].scores[3] = 0;
scanf("%s%s", student[i].number, student[i].name);
for (int j = 0; j < 3; j++)
{
scanf("%d", &student[i].scores[j]);
student[i].scores[3] += student[i].scores[j];
}
}
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (student[j].scores[3] > student[j+1].scores[3])
{
Student temp = student[j];
student[j] = student[j + 1];
student[j + 1] = temp;
}
}
}
for (int i = 0; i < n; i++)
{
if (flag)printf("\n");
printf("%s %s", student[i].number, student[i].name);
for (int j = 0; j < 4; j++)
{
printf(" %d", student[i].scores[j]);
}
flag++;
}
return 0;
}
//计算总成绩前记得初始化!
//成绩要进行计算,所以最好用整形数组(需要一个个赋值),即使字符串数组输入更方便
//注意输出格式
//注意比较成绩后交换结构体,需要构造结构体变量作为中间变量
//有n名学生,每个学生的数据包含学号、姓名、
// 三门课的成绩。可以从键盘输入n个学生的数据
// ,按总成绩从小到大排序,打印包含学号、姓名
、三门课成绩和总成绩的成绩单。
//编写一个程序,从键盘上读入一个数字串,
// 把数字转化为对应的小写英语数字单词输出。
// 例如:输入234,输出two three four。
//
//输入:一串数字
//
//输出:用空格隔开英文数字单词(英文字母都是小写)
// 。
//
//样例:
//
//234
//
//two three four
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
char num[50];
scanf("%s", num);
int len = strlen(num), flag = 0;
for (int i = 0; i < len; i++)
{
if (flag)printf(" ");
switch (num[i])
{
case '0':printf("zero"); break;
case '1':printf("one"); break;
case '2':printf("two"); break;
case '3':printf("three"); break;
case '4':printf("four"); break;
case '5':printf("five"); break;
case '6':printf("six"); break;
case '7':printf("seven"); break;
case '8':printf("eight"); break;
case '9':printf("nine");
}
flag++;
}
return 0;
}
//读取有多种方法:整形,整形数组,字符串
//不知道还有没有更好的方法...
//输入一个可能含空格的字符串(其长度不超过81)
// ,分别统计其中26个英文字母出现的次数
// (不区分大、小写字母),并按字母出现的次数
// ,从高到低进行排序。若次数相同,
// 按字母顺序排列。字母输出格式举例,
// 例如:A - 3,表示字母A出现3次,C - 0表示
// 字母C没有出现过。
//
//输入:
//
//第一行为输入,占一行
//
//输出:
//
//第二行为输出,占一行。按照字母输出格式从高到低
// 输出,各字母输出之间用一个空格字符进行分隔。
//
//样例:
//
//123abcAABXxwvUu +
//
//A - 3 B - 2 U - 2 X - 2 C - 1 V - 1 W - 1
//D - 0 E - 0 F - 0 G - 0 H - 0 I - 0 J - 0
//K - 0 L - 0 M - 0 N - 0 O - 0 P - 0 Q - 0
//R - 0 S - 0 T - 0 Y - 0 Z - 0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
void findmax(int* count)
{
int max = count[0], maxsub = 0, flag = 0;
for (int j = 0; j < 26; j++)
{
for (int i = 1; i < 26; i++)
{
if (max < count[i])
{
max = count[i];
maxsub = i;
}
}
if (flag)printf(" ");
printf("%c-%d", maxsub + 'A', count[maxsub]);
count[maxsub] = -1;
max = count[0];
maxsub = 0;
flag++;
}
}
int main()
{
char letters[81];
gets(letters);
int len = strlen(letters);
int count[26] = { 0 }, temp = 0, flag = 0;
for (char i = 'A'; i <= 'Z'; i++, temp++)
{
for (int j = 0; j < len; j++)
{
if (letters[j] == i || letters[j] == i - 'A' + 'a')
{
count[temp]++;
}
}
}
findmax(count);
return 0;
}
//刚开始想用冒泡排序将出现的次数最多的排到最前面并最先冒泡(从最后开始比)
//但发现很难取到对应的字母(除非用结构体将字母和出现次数进行关联)
//这里采用了直接找次数最多并输出(下标与字母关联),然后置为-1(不能是0,这样会比较字母顺序)
//注意每次输出后最大下标,最大次数都要重设为初始值,如果设为其他值,第一个就没法比较
//最大下标不设为初始值0就会出现如果没有进入到if就会再输出原来的
//编写程序,有一个包含奇数个项的整数序列,
// 按照以下规则进行排序:
//
//最大值排在中间,最小值排在最左,中值排在最右,
// 其它值清为0。
//
//输入为2行:第一行n表示要输入的是整数序列的项数
// ,n是奇数。第二行输入的是n个整数序列。
//
//输出:排序后的数据,数据之间用空格分隔,
// 最后一个数据后面没有空格。
//
//样例1:
//
//输入
//
//3
//
//66 10 30
//
//输出
//
//10 66 30
//
//
//
//样例2:
//
//输入
//
//5
//
//12 20 9 88 32
//
//输出
//
//9 0 88 0 20
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
void sort(int* num,int n,int* change)
{
int max = num[0], min = num[0], middle = num[0];
for (int i = 0; i < n; i++)
{
int count = 0;
if (max < num[i]) max = num[i];
if (min > num[i]) min = num[i];
for (int j = 0; j < n; j++)
{
if (num[i] > num[j])count++;
}
if (count == (n - 1) / 2)middle = num[i];
}
change[n / 2] = max;
change[0] = min;
change[n - 1] = middle;
}
int main()
{
int n, num[21], flag = 0, change[21] = { 0 };
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
sort(num,n,change);
for (int i = 0; i < n; i++)
{
if (flag)printf(" ");
printf("%d",change[i]);
flag++;
}
return 0;
}
//gets不能用于整形数组
//这题用冒泡排序会好一些(可能会有重复的)
//这里传入了一个全为0的数组对应的指针用于修改
//编写函数,求有n个元素的一维数组中的最大值和
// 最小值,并返回数组元素的平均值,函数原形如下
//double fun(int a[], int n, int* max, int* min)
//
//输入输出格式:
//
//输入:输入n + 1个数,各个数之间用空格分隔。
// 第一个数为数组元素的个数n。
//
//输出:3个数字。第一个数字为数组中的最大元素值,
// 第二个数字为数组中的最小元素值,
// 第三个数字为数组元素的平均值
// (保留小数点后6位有效数字)。
// 3个数之间用空格分开。
//
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
double fun(int* a,int n,int* max,int* min)
{
*max = a[0],*min=a[0];
double temp = 0, aver;
for (int i = 0; i < n; i++)
{
temp += a[i];
if (*max < a[i]) *max = a[i];
if (*min > a[i]) *min = a[i];
}
aver = temp / n;
return aver;
}
int main()
{
int m, d;
int* max = &m, *min = &d;
int a[20] = { 0 }, n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
double k = fun(a, n, max, min);
printf("%d %d %lf", m, d, k);
return 0;
}
//定义指针的时候*是跟着指针名的,如上方的*min
//相当于还是定义的整数,只不过max是其地址罢了
//指针要初始化才能使用,必须要声明指针对应的变量,然后把变量的地址给指针
// m = *max只是把max指向的变量的值给m,并没有实现m和max的绑定,当改变max指向的变量的值时与m无关
//正确的做法是int* max = &m,这样m的地址是始终不变,始终为max
//输入一个英文字符串(长度<81)可能包含空格,删除其中所有非小写字母的字符,并输出删除后的字符串 //(小写字母的相对位置保持不变)。
//样例:
//输入:A# 7b
//输出:b
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
void strdel(char *string,int len)
{
int count = 0;
char change[81] = { '\0' };
for (int i = 0; i < len; i++)
{
if (string[i] >= 'a' && string[i]<='z')
{
change[count] = string[i];
count++;
}
}
printf("%s", change);
}
int main()
{
char string[81];
gets(string);
int len = strlen(string);
strdel(string,len);
return 0;
}
//输入一系列英文单词,单词之间用空格隔开(一到多个空格),用“###”表示输入结束,统计输入过哪些单词以及各单词出现的次数,统计时区分大小写字母。本题假定:不重复的单词数不超过100个;每个单词长度限制在20以内。
//
//输入:
//
//占一行
//
//输出:
//
//占一行,其格式为:单词1 - 个数 单词2 - 个数 …(单词与个数中间用减号连接,各输出组之间用一个空格分隔,单词依照出现的先后次序统计)
//
//
//
//样例:
//
//输入:aaa bbb aaa ###
//
//输出:aaa - 2 bbb - 1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
char word[150] = { 0 }, temp[21] = { 0 };
int len = 0, flag = 0;
gets(word);
for (int j = 0; word[j] != '#'; j++)
{
int m = 0;
if (word[j] != ' ')
{
temp[len] = word[j];
len++;
}
else
{
int count = 0;
if (temp[0] == 0)continue;
while (strstr(word, temp) != NULL)
{
char* k = strstr(word, temp);
count++;
for (; *k != ' '; k++) *k = ' ';
}
if (flag)printf(" ");
printf("%s-%d", temp, count);
flag++;
while (temp[m] != 0)
{
temp[m] = 0;
m++;
}
len = 0;
}
}
return 0;
}
//直接gets所有输入到word数组中
//构造一个数组来存放每个单词,每取出一个单词在word中查找,查找完后对与该单词相同的单词置为' ',temp,len也置0
//置' '后继续遍历下一个单词,注意这时候当temp为0直接进行下一次循环,否则程序会卡住
//当遍历到'#'终止程序
//定义字符串数组str,其数组长度为81,键盘读入一个字符串(少于81个字符)。将该字符串中出现的所
//有小写字母按字母序升序输出(字母序为:abcdefg…xyz)。
//输入输出格式要求:
//输入输出各占一行,第一行是输入,第二行是输出。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
void riser(char* strlow, int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (strlow[j] > strlow[j + 1])
{
char temp = strlow[j + 1];
strlow[j + 1] = strlow[j];
strlow[j] = temp;
}
}
}
printf("%s", strlow);
}
void strlower(char* str, int len)
{
char strlow[81] = { 0 };
int count = 0;
for (int i = 0; i < len; i++)
{
if (str[i] >= 'a' && str[i] <= 'z')
{
strlow[count] = str[i];
count++;
}
}
riser(strlow,count);
}
int main()
{
char string[81];
gets(string);
int len = strlen(string);
strlower(string, len);
return 0;
}
//strlower用于取出所有小写字母
//riser采用冒泡排序
//注意strlower调用riser,不能先定义strlower,也可先定义,再初始化
//用户输入一个字符串,将字符串中的奇数位置上的字符按
// 字母表中的顺序排序
// ,仍按顺序保存在奇位置上,其他字母位置不变。
// 例如teacher,t, a, h, r排序后结果为a, h, r, t,
// 则结果字符串为:aehcret。
//
//输入格式:长度小于100的字符串,
//
//输出:奇数位置的字符排序后的字符串
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
void strodd(char* string, int len)
{
char str[100] = { 0 };
int count = 0;
for (int i = 0; i < len - 1; i+=2)
{
for (int j = 0; j < len - 1 - i; j += 2)
{
if (string[j] > string[j + 2]&&j + 2< len)
{
char temp = string[j + 2];
string[j + 2] = string[j];
string[j] = temp;
}
}
}
printf("%s", string);
}
int main()
{
char string[81];
gets(string);
int len = strlen(string);
strodd(string, len);
return 0;
}
//仿照一般的冒泡排序即可,自增改为+=2
//并且限制j+2<len 否则可能会把终止符交换到最前面