0301
一个学生由id和姓名描述。
创建一个学生结构体,并显示学生信息
输入要求:
一个大于0的整数和一个字符串,分别表示一个学生的id和姓名
输出要求:
输出学生的id和姓名(空格分隔),并换行。
数据示例1:
输入:
111 abc
输出:
111 abc
思路提示:
create函数参考算法:
1 动态开辟内存空间,存储一个stud结构体变量
2 将用户输入的id和姓名分别存入结构体对应的成员中
3 返回指向这个结构体的指针
#include <stdio.h>
#include <string.h>
#define MAXN 80 // 最大学生姓名长度
struct stud{
int id;
char name[MAXN];
};
// 创建并返回一个学生结构体
stud* create();
// 输出学生id和姓名(空格分隔),并换行
void output(stud* s);
int main(){
stud *s = create();
output(s);
return 0;
}
stud* create()
{
stud *p= new stud;
scanf("%d %s", &p->id,p->name);
return p;
}
void output(stud* s)
{
printf("%d %s\n",s->id,s->name);
}
0302
学生可以用id和姓名来描述。
根据用户输入,创建一个结构体数组,并根据用户输入的id打印出这名学生的信息。
输入要求:
第一行输入一个整数n和m,分别表示输入学生的个数和输入的id个数。
接下来输入n行,每行输入一个大于0的整数和一个字符串,分别表示一个学生的id和姓名。
接下来输入m行,每行输入一个整数,代表一个学生id
输出要求:
根据输入的学生id,输出m组数据。
如果输入学生的id为0,则输出所有学生的信息
否则,根据id输出学生信息(如果输入的id不存在,则输出“no such a student\n”,
否则输出学生的id和姓名,格式详见outputall函数)
数据示例1:
输入:
5 4
111 aaa
222 bbb
333 ccc
444 ddd
555 eee
111
555
0
666
输出:
111 aaa
555 eee
111 aaa
222 bbb
333 ccc
444 ddd
555 eee
no such a student
#include<stdio.h>
#include<stdlib.h>
#define MAXN 80
struct student{
int id;
char name[MAXN];
};
// 使用动态分配函数,创建一个长度为n的学生结构体数组
// 根据用户的输入为这n个学生赋值,并返回第一个元素地址
struct student* create(int n);
// 根据id输出学生信息
void output(struct student *stds, int n, int id);
// 输出所有学生信息
void outputall(struct student *stds, int n){
for(int i=0; i<n; i++){
printf("%d %s\n", stds[i].id, stds[i].name);
}
}
int main(){
int n, m;
scanf("%d %d", &n, &m);
struct student *p = create(n);
while(m--){
int id;
scanf("%d", &id);
if(id==0) outputall(p, n);
else output(p, n, id);
}
}
// 使用动态分配函数,创建一个长度为n的学生结构体数组
// 根据用户的输入为这n个学生赋值,并返回第一个元素地址
struct student* create(int n)
{
student *p = new student[n];
for(int i=0;i<n;i++)
scanf("%d %s", &p[i].id,p[i].name);
return p;
}
// 根据id输出学生信息
void output(struct student *stds, int n, int id)
{
for(int i=0;i<n;i++)
{
if(id==stds[i].id)
{
printf("%d %s\n",stds[i].id,stds[i].name);
return;
}
}
printf("no such a student\n");
}
0303
请实现关于复数相加和复数相减的函数。
复数由实部和虚部组成,其类型定义如下:
struct complex{
int r,i; //r为实部,i为虚部
};
函数接口定义:
complex* add(complex *a,complex *b);
函数传入的两个参数a和b均为指向complex的指针,返回指向相加结果的指针(complex)
complex* minus(complex *a,complex *b);
函数传入的两个参数a和b均为指向complex的指针,返回指向相加结果的指针(complex)
void printComplex(complex *a);
函数传入的参数a为需要打印的复数,复数输出格式为"a+bi" 或 "a-bi" (其中b ≥ 0)
输入要求:
多组数据
每组数据只占一行,包含4个整数ar,ai,br,bi以及一个字符c。
其中ar为复数a的实部,ai为复数a的虚部,br为复数b的实部,bi为复数b的虚部。字符c表示需要运算的操作符。
输出要求:
对于每组数据输出对应的复数结果,输出格式为"a+bi" 或 "a-bi" (其中b ≥ 0),需要换行
无论b是否为0,均需输出a
数据示例1:
输入:
1 1 1 1 +
1 1 1 1 -
1 1 2 2 -
输出:
2+2i
0
-1-1i
思路提示:
在函数add和minus内动态开辟内存空间,存储复数相加或相减的结果(数据类型为complex),并返回指向这个complex的指针
#include <stdio.h>
struct complex{
int r,i; //r为实部,i为虚部
};
complex* add(complex *a,complex *b); //复数加法
complex* minus(complex *a,complex *b); //复数减法
void printComplex(complex *a); //输出
int main(){
complex a,b,*re;
char c;
while(~scanf("%d %d %d %d %c",&a.r,&a.i,&b.r,&b.i,&c)){
switch(c){
case '+':
re = add(&a,&b);
break;
case '-':
re = minus(&a,&b);
break;
}
printComplex(re);
delete re;
}
}
complex* add(complex *a,complex *b)//复数加法
{
complex *p=new complex;
p->r=a->r+b->r;
p->i=a->i+b->i;
return p;
}
complex* minus(complex *a,complex *b) //复数减法
{
complex *t=new complex;
t->r=a->r - b->r;
t->i=a->i - b->i;
return t;
}
void printComplex(complex *a)//输出
{
if(a->i==0)
printf("%d\n",a->r);
else if(a->i>0)
printf("%d+%di\n",a->r,a->i);
else if(a->i<0)
printf("%d%di\n",a->r,a->i);
}
0304
根据输入的数据顺序,创建一个整数链表
输入要求:
多组输入。
每组首先输入一个整数n,表示整数链表结点个数。接着输入n个整数。
当n=0时,程序结束。
输出要求:
打印每个链表元素的值,并换行。每个整数后面一个空格。
数据示例1:
输入:
3
1 2 3
5
2 6 9 11 24
0
输出:
1 2 3
2 6 9 11 24
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
struct node *next;
};
// 创建n个整数结点的链表(无头结点)
node* create(int n);
void output(node *p){ // 打印链表
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main(){
int n;
while(~scanf("%d", &n) && n){
struct node *p = create(n);
output(p);
}
return 0;
}
///
node* create(int n)
{
node *L=new node;
scanf("%d",&L->data);
node *q=L;
for(int j=1;j<n;j++)
{
q->next=new node;
q=q->next;
scanf("%d",&q->data);
}
q->next=NULL;
return L;
}