c++练习题---改错
以下题⽬是补充代码,函数返回的是⼀个a【i】 通常理解应该是作为⼀个int 类型,
这个函数的返回值引⽤了a【i】//具体实现意义还是不太明⽩。
⽽这样写的好处是,返回值可以写在复制号的左边,可以进⾏赋值
等价于对a【i】进⾏赋值。
以下题⽬依旧是⼀个代码的补充,
分析:
不难发现主函数中传⼊了两个地址给swap函数,⽽这个函数来接收这两个地址,也必须使⽤指针,⽽问题就在于,在swap函数中参数a是直接使⽤a的⽽不是*a,这也就间接的说明为什么上⾯那⼀种写法是错误的,⽽解决途径,就是将a变为该指针的引⽤,那么就不需要带上’* ‘,可以直接使⽤a了。
以下依旧是⼀个代码的补充
分析:⼆维数组的初始化,压根就不晓得⼆维数组要怎样初始化,根据已知答案可知,以每⼀个⾏列为基准,第⼀⾏第⼆⾏都定义初始化为0表⽰(存疑)。
#include <iostream>
using namespace std ;
int * & //错误
int &//正确
getElement (int * a , int i )
{
return a [i ];
}
int main ()
{
int a [] = {1,2,3};
getElement (a ,1) = 10;
cout << a [1] ;
return 0;
}using
namespace std ;
void swap (
int *a ,int *b //错误
int * &a ,int * &b //正确
)
{
int * tmp = a ;
a =
b ;
b = tmp ;
}
int main ()
{
int a = 3,b = 5;
int * pa = & a ;
int * pb = & b ;
swap (pa ,pb );
cout << *pa << "," << * pb ;
return 0;
}
题⽬:
实现⼀个学⽣信息处理程序,计算⼀个学⽣的四年平均成绩。
要求实现⼀个代表学⽣的类,并且类中所有成员变量都是【私有的】。
补充下列程序中的 Student 类以实现上述功能。
输⼊
输⼊数据为⼀⾏,包括:
姓名,年龄,学号,第⼀学年平均成绩,第⼆学年平均成绩,第三学年平均成绩,第四学年平均成绩。
其中姓名为由字母和空格组成的字符串(输⼊保证姓名不超过20个字符,并且空格不会出现在字符串两端),年龄、学号和学年平均成绩均为⾮负整数。信息之间⽤逗号隔开。
输出
输出⼀⾏数据,包括:
姓名,年龄,学号,四年平均成绩。信息之间⽤逗号隔开。
**#include <iostream >
using namespace std ;
int main ()
{
int * a [] = {
0,0,new int [6],new int [6]//正确
/*{123,0,0,0,0,0},
{123,0,0,0,0,0},错误,,编译都不过,不要谈别的,想就想错了
{123,0,0,
0,0,0},
{0,0,0,0,0,456}*/
};
*a [2] = 123;
a [3][5] = 456;
if (!a [0]) {
cout << *a [2] << "," << a [3][5];
}
return 0;
}**
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <cstdlib>
using namespace std ;
class Student {
// 在此处补充你的代码
};
int main () {
Student student ; // 定义类的对象
student .input (); // 输⼊数据
student .calculate (); // 计算平均成绩
student .output (); // 输出数据
}
样例输⼊
Tom Hanks,18,7817,80,80,90,70
样例输出
Tom Hanks,18,7817,80
提⽰
必须⽤类实现,其中所有成员变量都是私有的。
输出结果中,四年平均成绩不⼀定为整数。
分析:
对我来说第⼀个⽐较⼤的问题就是输⼊读取,由于输⼊的是⽤逗号隔开的数据,因此不能简单的⽤cin输⼊,数据中包含字符串,整型,浮点型。
解决途径 ⼀:
解决途径⼆:
^表⽰"⾮",[ ^ ,]表⽰读⼊逗号字符就结束读⼊。这个是scanf的正则⽤法,我们都知道scanf不能接收空格符,但是使⽤%[ ^ ,]就可以了。(逗号字符换为换⾏字符\n也是⼀样的道理)。 * 表⽰该输⼊项读⼊后不赋予任何变量,即scanf("% * [ ^\n ]%*c")表⽰跳过⼀⾏字符串。
解决途径三:
分析:该⽅法个⼈认为是解决问题范围最⼴的。
第⼀步:读取输⼊的⼀⾏字符串
第⼆步:利⽤函数strtok()将字符串以‘,’为分割线,第⼀次调⽤时,必需给予参数s字符串,每次调⽤
成功则返回指向被分割出⽚段的指针。第⼆次,需要把s置为NULL,则函数保存的指针在下⼀次调⽤中将作为起始位置。
第三步 将数据分离出来,后⾯就⽐较简单了,正常运算即可。
(关于strtok(s,delim):
s为要分解的字符串,delim为分隔符字符(如果传⼊字符串,则传⼊的字符串中每个字符均为分割符)。⾸次调⽤时,s指向要分解的字符串,之后再次调⽤要把s设成NULL。)
class Student { char name [100];
int age ;
int id ;
double sum [10];
double s1, s2, s3, s4;
char c ;
double u =0;
public :
void input () {
cin .getline (name , 20, ',');//输⼊的数据存⼊x 中个数有20个字符,读到,时停⽌输⼊
cin >> age >> c >> id >> c >> s1 >> c >> s2 >> c >> s3 >> c
>> s4;
//cout << age << c << id << c << s1 << c << s2 << c << s3 << c << s4;
}
class Student {
char name [100];
int age ;
int id ;
double sum [10];
double s1, s2, s3, s4;
char c ;
double u =0;
public :
void input () {
scanf ("%[^,],%d,%d,%lf,%lf,%lf,%lf", &name , &age , &id , &s1, &s2, &s3, &s4);
}
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<cstdlib>
using namespace std;
cstring转为intclass Student {
char name[100];//姓名储存
int age;//年龄
char id[100];//学号
double sum[10];//分数存放
double u=0;//最终平均成绩,需要初始化
public:
void input(){
char x[200];//存放读取到的⼀列数据
char* p =strtok(x,",");
if(p !=NULL)
strcpy(name, p);
p =strtok(NULL,",");
age =atof(p);
p =strtok(NULL,",");
strcpy(id, p);
for(int i =0;i <4;++i){
p =strtok(NULL,",");
//cout << atoi(p) <<"!!" << endl;
sum[i]=atof(p);
//cout << sum[i] << endl;
}
}
void calculate(){
for(int i =0;i <4;i++){
u += sum[i];
}
u = u *1.0/4;
}
void output(){
cout << name <<','<< age <<','<< id <<','<< u << endl;
}
};
int main(){
Student student;// 定义类的对象
student.input();// 输⼊数据
student.calculate();// 计算平均成绩
student.output();// 输出数据
}```
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论